summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md3
-rw-r--r--NEWS386
-rw-r--r--UPGRADING1085
-rw-r--r--UPGRADING.INTERNALS444
-rw-r--r--Zend/Zend.m44
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_001.phpt2
-rw-r--r--Zend/tests/multibyte/multibyte_encoding_003.phptbin328 -> 329 bytes
-rw-r--r--Zend/zend.h2
-rw-r--r--Zend/zend_API.h1
-rw-r--r--Zend/zend_execute.h4
-rw-r--r--Zend/zend_execute_API.c4
-rw-r--r--Zend/zend_extensions.h2
-rw-r--r--Zend/zend_generators.c10
-rw-r--r--Zend/zend_generators.h5
-rw-r--r--Zend/zend_highlight.h2
-rw-r--r--Zend/zend_language_scanner.l16
-rw-r--r--Zend/zend_modules.h2
-rw-r--r--azure-pipelines.yml5
-rw-r--r--azure/apt.yml7
-rw-r--r--azure/setup.yml4
-rw-r--r--build/php.m42
-rw-r--r--configure.ac2
-rw-r--r--ext/ftp/ftp.stub.php176
-rw-r--r--ext/ftp/ftp_arginfo.h60
-rw-r--r--ext/ftp/php_ftp.c304
-rw-r--r--ext/ftp/tests/007.phpt66
-rw-r--r--ext/ftp/tests/CONFLICTS1
-rw-r--r--ext/ftp/tests/dead-resource.phpt24
-rw-r--r--ext/ftp/tests/ftp_set_option_errors.phpt50
-rw-r--r--ext/ftp/tests/server.inc78
-rw-r--r--ext/gd/gd.c182
-rw-r--r--ext/gd/gd.stub.php19
-rw-r--r--ext/gd/gd_arginfo.h15
-rwxr-xr-xext/hash/bench.php76
-rw-r--r--ext/hash/config.m45
-rw-r--r--ext/hash/config.w3211
-rw-r--r--ext/hash/hash.c8
-rw-r--r--ext/hash/hash_murmur.c186
-rw-r--r--ext/hash/murmur/PMurHash.c226
-rw-r--r--ext/hash/murmur/PMurHash.h31
-rw-r--r--ext/hash/murmur/PMurHash128.c640
-rw-r--r--ext/hash/murmur/PMurHash128.h39
-rw-r--r--ext/hash/murmur/endianness.h84
-rw-r--r--ext/hash/php_hash.h3
-rw-r--r--ext/hash/php_hash_murmur.h57
-rw-r--r--ext/hash/tests/hash-clone.phpt18
-rw-r--r--ext/hash/tests/hash_algos.phpt8
-rw-r--r--ext/hash/tests/hash_copy_001.phpt18
-rw-r--r--ext/hash/tests/hash_serialize_001.phpt18
-rw-r--r--ext/hash/tests/hash_serialize_002.phpt2
-rw-r--r--ext/hash/tests/murmurhash3.phpt49
-rw-r--r--ext/imap/php_imap.c2
-rw-r--r--ext/imap/tests/CONFLICTS1
-rw-r--r--ext/imap/tests/README.md6
-rw-r--r--ext/imap/tests/bug31142_2.phpt4
-rw-r--r--ext/imap/tests/bug32589.phpt4
-rw-r--r--ext/imap/tests/bug35669.phpt56
-rw-r--r--ext/imap/tests/bug44098.phpt13
-rw-r--r--ext/imap/tests/bug45705_1.phpt4
-rw-r--r--ext/imap/tests/bug45705_2.phpt4
-rw-r--r--ext/imap/tests/bug53377.phpt4
-rw-r--r--ext/imap/tests/bug63126.phpt13
-rw-r--r--ext/imap/tests/bug64076.phpt11
-rw-r--r--ext/imap/tests/bug77020.phpt6
-rw-r--r--ext/imap/tests/bug77153.phpt10
-rw-r--r--ext/imap/tests/bug80213.phpt7
-rw-r--r--ext/imap/tests/bug80226.phpt21
-rw-r--r--ext/imap/tests/clean.inc25
-rw-r--r--ext/imap/tests/imap_append_basic.phpt18
-rw-r--r--ext/imap/tests/imap_body.phpt23
-rw-r--r--ext/imap/tests/imap_body_basic.phpt18
-rw-r--r--ext/imap/tests/imap_bodystruct_basic.phpt69
-rw-r--r--ext/imap/tests/imap_clearflag_full_basic.phpt16
-rw-r--r--ext/imap/tests/imap_close_basic.phpt15
-rw-r--r--ext/imap/tests/imap_close_variation4.phpt17
-rw-r--r--ext/imap/tests/imap_createmailbox_basic.phpt16
-rw-r--r--ext/imap/tests/imap_errors_basic.phpt6
-rw-r--r--ext/imap/tests/imap_fetch_overview_basic.phpt11
-rw-r--r--ext/imap/tests/imap_fetch_overview_variation3.phpt26
-rw-r--r--ext/imap/tests/imap_fetch_overview_variation5.phpt31
-rw-r--r--ext/imap/tests/imap_fetch_overview_variation6.phpt13
-rw-r--r--ext/imap/tests/imap_fetchbody_basic.phpt11
-rw-r--r--ext/imap/tests/imap_fetchbody_variation4.phpt13
-rw-r--r--ext/imap/tests/imap_fetchbody_variation6.phpt15
-rw-r--r--ext/imap/tests/imap_fetchheader_basic.phpt11
-rw-r--r--ext/imap/tests/imap_fetchheader_variation3.phpt13
-rw-r--r--ext/imap/tests/imap_fetchheader_variation5.phpt11
-rw-r--r--ext/imap/tests/imap_fetchstructure_basic.phpt11
-rw-r--r--ext/imap/tests/imap_gc_error.phpt16
-rw-r--r--ext/imap/tests/imap_getsubscribed_basic.phpt19
-rw-r--r--ext/imap/tests/imap_headerinfo_basic.phpt11
-rw-r--r--ext/imap/tests/imap_list_basic.phpt14
-rw-r--r--ext/imap/tests/imap_lsub_basic.phpt21
-rw-r--r--ext/imap/tests/imap_mail_copy_basic.phpt19
-rw-r--r--ext/imap/tests/imap_mail_move_basic.phpt19
-rw-r--r--ext/imap/tests/imap_mutf7_to_utf8.phpt1
-rw-r--r--ext/imap/tests/imap_open_error.phpt6
-rw-r--r--ext/imap/tests/imap_renamemailbox_basic.phpt24
-rw-r--r--ext/imap/tests/imap_rfc822_parse_headers_basic.phpt11
-rw-r--r--ext/imap/tests/imap_savebody_basic.phpt11
-rw-r--r--ext/imap/tests/imap_timeout_basic.phpt2
-rw-r--r--ext/imap/tests/imap_undelete_basic.phpt13
-rw-r--r--ext/imap/tests/imap_utf8.phpt4
-rw-r--r--ext/imap/tests/imap_utf8_to_mutf7_basic.phpt1
-rw-r--r--ext/imap/tests/setup/clean.inc32
-rw-r--r--ext/imap/tests/setup/dovecot.conf (renamed from ext/imap/tests/dovecot.conf)0
-rw-r--r--ext/imap/tests/setup/dovecotpass (renamed from ext/imap/tests/dovecotpass)0
-rw-r--r--ext/imap/tests/setup/imap_include.inc (renamed from ext/imap/tests/imap_include.inc)152
-rw-r--r--ext/imap/tests/setup/setup.sh (renamed from ext/imap/tests/setup.sh)4
-rw-r--r--ext/imap/tests/setup/skipif.inc13
-rw-r--r--ext/imap/tests/skipif.inc16
-rw-r--r--ext/mbstring/config.m429
-rw-r--r--ext/mbstring/config.w3229
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_7bit.c2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_armscii8.c146
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_armscii8.h38
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ascii.c111
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ascii.h44
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_big5.c41
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_big5.h2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte2.c142
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte2.h48
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte4.c162
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_byte4.h46
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1251.c147
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1251.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1252.c142
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1252.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1254.c152
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp1254.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c369
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h6
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp51932.c48
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp51932.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp850.c142
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp850.h37
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp866.c146
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp866.h41
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp932.c30
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp932.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp936.c28
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_cp936.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c38
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c144
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c11
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c68
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c38
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c62
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_gb18030.c113
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_gb18030.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_htmlent.c2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_hz.c54
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_hz.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c104
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c78
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c99
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c9
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c95
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h26
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h26
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h23
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h41
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c134
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c133
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_jis.c189
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_jis.h2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8r.c146
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8r.h43
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8u.c143
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_koi8u.h40
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_qprint.c5
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c581
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h44
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis.c158
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c30
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h4
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c46
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h2
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c25
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h4
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c30
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ucs2.c119
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_ucs4.c12
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_uhc.c50
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_uhc.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf16.c224
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf16.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf32.c169
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf32.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf7.c59
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf7.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c84
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8.c83
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c33
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h5
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_prop.h272
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_armscii8.h54
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp1251.h51
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp1252.h8
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp1254.h51
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp850.h52
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_cp866.h51
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h17
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_koi8r.h53
-rw-r--r--ext/mbstring/libmbfl/filters/unicode_table_koi8u.h165
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter.c254
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter.h3
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter_pass.c2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_consts.h21
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_convert.c50
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_encoding.c130
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_encoding.h18
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_ident.c268
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_ident.h70
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c142
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h2
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfl_string.c25
-rw-r--r--ext/mbstring/mbstring.c79
-rw-r--r--ext/mbstring/tests/armscii8_encoding.phpt32
-rw-r--r--ext/mbstring/tests/bug45722.phpt2
-rw-r--r--ext/mbstring/tests/bug47399.phpt525
-rw-r--r--ext/mbstring/tests/bug62545.phpt16
-rw-r--r--ext/mbstring/tests/cp1251_encoding.phpt15
-rw-r--r--ext/mbstring/tests/cp1252_encoding.phpt15
-rw-r--r--ext/mbstring/tests/cp1254_encoding.phpt15
-rw-r--r--ext/mbstring/tests/cp850_encoding.phpt14
-rw-r--r--ext/mbstring/tests/cp866_encoding.phpt15
-rw-r--r--ext/mbstring/tests/data/8859-1.txt292
-rw-r--r--ext/mbstring/tests/data/8859-10.txt292
-rw-r--r--ext/mbstring/tests/data/8859-11.txt286
-rw-r--r--ext/mbstring/tests/data/8859-13.txt291
-rw-r--r--ext/mbstring/tests/data/8859-14.txt292
-rw-r--r--ext/mbstring/tests/data/8859-15.txt294
-rw-r--r--ext/mbstring/tests/data/8859-16.txt293
-rw-r--r--ext/mbstring/tests/data/8859-2.txt292
-rw-r--r--ext/mbstring/tests/data/8859-3.txt285
-rw-r--r--ext/mbstring/tests/data/8859-4.txt292
-rw-r--r--ext/mbstring/tests/data/8859-5.txt292
-rw-r--r--ext/mbstring/tests/data/8859-6.txt249
-rw-r--r--ext/mbstring/tests/data/8859-7.txt299
-rw-r--r--ext/mbstring/tests/data/8859-8.txt258
-rw-r--r--ext/mbstring/tests/data/8859-9.txt294
-rw-r--r--ext/mbstring/tests/data/ARMSCII-8.txt255
-rw-r--r--ext/mbstring/tests/data/CP1251.txt274
-rw-r--r--ext/mbstring/tests/data/CP1252.txt274
-rw-r--r--ext/mbstring/tests/data/CP1254.txt274
-rw-r--r--ext/mbstring/tests/data/CP850.txt273
-rw-r--r--ext/mbstring/tests/data/CP866.txt273
-rw-r--r--ext/mbstring/tests/data/EUC-JP.txt13137
-rw-r--r--ext/mbstring/tests/data/KOI8-R.txt294
-rw-r--r--ext/mbstring/tests/data/KOI8-U.txt301
-rw-r--r--ext/mbstring/tests/data/MacJapanese-SJIS.txt7728
-rw-r--r--ext/mbstring/tests/data/SHIFTJIS.txt7097
-rw-r--r--ext/mbstring/tests/data/SJIS-2004.txt11549
-rw-r--r--ext/mbstring/tests/encoding_tests.inc225
-rw-r--r--ext/mbstring/tests/eucjp_encoding.phpt81
-rw-r--r--ext/mbstring/tests/illformed_utf_sequences.phpt21
-rw-r--r--ext/mbstring/tests/iso8859_encodings.phpt46
-rw-r--r--ext/mbstring/tests/koi8r_encoding.phpt15
-rw-r--r--ext/mbstring/tests/koi8u_encoding.phpt15
-rw-r--r--ext/mbstring/tests/mb_convert_encoding.phpt26
-rw-r--r--ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt2
-rw-r--r--ext/mbstring/tests/mb_detect_encoding.phpt3
-rw-r--r--ext/mbstring/tests/mb_internal_encoding_variation2.phpt56
-rw-r--r--ext/mbstring/tests/sjis2004_encoding.phpt62
-rw-r--r--ext/mbstring/tests/sjis_encoding.phpt65
-rw-r--r--ext/mbstring/tests/sjismac_encoding.phpt85
-rw-r--r--ext/mysqlnd/mysqlnd_ps.c2
-rw-r--r--ext/opcache/ZendAccelerator.c30
-rw-r--r--ext/opcache/tests/bug65915.phpt6
-rw-r--r--ext/opcache/tests/zzz_basic_logging.phpt6
-rw-r--r--ext/opcache/zend_accelerator_blacklist.c10
-rw-r--r--ext/opcache/zend_accelerator_debug.c24
-rw-r--r--ext/opcache/zend_accelerator_debug.h1
-rw-r--r--ext/opcache/zend_accelerator_hash.c4
-rw-r--r--ext/opcache/zend_shared_alloc.c20
-rw-r--r--ext/openssl/config0.m42
-rw-r--r--ext/openssl/openssl.c35
-rw-r--r--ext/openssl/php_openssl.h4
-rw-r--r--ext/openssl/xp_ssl.c9
-rw-r--r--ext/pcntl/tests/002.phpt1
-rw-r--r--ext/pcntl/tests/pcntl_unshare_01.phpt1
-rw-r--r--ext/pcntl/tests/pcntl_unshare_02.phpt1
-rw-r--r--ext/pcntl/tests/pcntl_unshare_03.phpt1
-rw-r--r--ext/pdo/pdo_dbh.c8
-rw-r--r--ext/pdo/php_pdo_driver.h5
-rw-r--r--ext/pdo_dblib/dblib_driver.c3
-rw-r--r--ext/pdo_firebird/firebird_driver.c6
-rw-r--r--ext/pdo_mysql/mysql_driver.c3
-rw-r--r--ext/pdo_oci/oci_driver.c7
-rw-r--r--ext/pdo_odbc/odbc_driver.c6
-rw-r--r--ext/pdo_pgsql/pgsql_driver.c1
-rw-r--r--ext/pdo_sqlite/sqlite_driver.c22
-rw-r--r--ext/pdo_sqlite/tests/gc.phpt24
-rw-r--r--ext/pgsql/tests/skipif.inc5
-rw-r--r--ext/pspell/pspell.c305
-rw-r--r--ext/pspell/pspell.stub.php61
-rw-r--r--ext/pspell/pspell_arginfo.h42
-rw-r--r--ext/pspell/tests/003.phpt2
-rw-r--r--ext/readline/tests/libedit_info_001.phpt1
-rw-r--r--ext/readline/tests/libedit_write_history_001.phpt1
-rw-r--r--ext/readline/tests/readline_info_001.phpt1
-rw-r--r--ext/readline/tests/readline_read_history_001.phpt5
-rw-r--r--ext/readline/tests/readline_write_history_001.phpt1
-rw-r--r--ext/session/tests/003.phpt2
-rw-r--r--ext/session/tests/004.phpt10
-rw-r--r--ext/session/tests/005.phpt14
-rw-r--r--ext/session/tests/006.phpt2
-rw-r--r--ext/session/tests/009.phpt4
-rw-r--r--ext/session/tests/012.phpt2
-rw-r--r--ext/session/tests/013.phpt4
-rw-r--r--ext/session/tests/014.phpt2
-rw-r--r--ext/session/tests/015.phpt4
-rw-r--r--ext/session/tests/018.phpt4
-rw-r--r--ext/session/tests/019.phpt2
-rw-r--r--ext/session/tests/020.phpt4
-rw-r--r--ext/session/tests/021.phpt10
-rw-r--r--ext/session/tests/023.phpt2
-rw-r--r--ext/session/tests/024.phpt10
-rw-r--r--ext/session/tests/025.phpt14
-rw-r--r--ext/session/tests/026.phpt2
-rw-r--r--ext/session/tests/027.phpt4
-rw-r--r--ext/session/tests/CONFLICTS1
-rw-r--r--ext/session/tests/bug41600.phpt4
-rw-r--r--ext/session/tests/bug42596.phpt2
-rw-r--r--ext/session/tests/rfc1867.phpt8
-rw-r--r--ext/session/tests/rfc1867_cleanup.phpt8
-rw-r--r--ext/session/tests/rfc1867_disabled.phpt8
-rw-r--r--ext/session/tests/rfc1867_disabled_2.phpt8
-rw-r--r--ext/session/tests/rfc1867_inter.phpt8
-rw-r--r--ext/session/tests/rfc1867_no_name.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_cookie.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_get.phpt6
-rw-r--r--ext/session/tests/rfc1867_sid_get_2.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_only_cookie.phpt8
-rw-r--r--ext/session/tests/rfc1867_sid_only_cookie_2.phpt4
-rw-r--r--ext/session/tests/rfc1867_sid_post.phpt4
-rw-r--r--ext/session/tests/session_basic1.phpt12
-rw-r--r--ext/session/tests/session_basic2.phpt4
-rw-r--r--ext/session/tests/session_basic3.phpt72
-rw-r--r--ext/session/tests/session_basic5.phpt188
-rw-r--r--ext/session/tests/session_commit_variation4.phpt14
-rw-r--r--ext/session/tests/session_module_name_variation4.phpt3
-rw-r--r--ext/session/tests/session_save_path_variation4.phpt4
-rw-r--r--ext/session/tests/session_save_path_variation5.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_basic.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_variation2.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_variation3.phpt6
-rw-r--r--ext/session/tests/session_set_save_handler_variation4.phpt6
-rw-r--r--ext/session/tests/session_set_save_handler_variation5.phpt4
-rw-r--r--ext/session/tests/session_set_save_handler_variation6.phpt4
-rw-r--r--ext/soap/tests/bug73037.phpt2
-rw-r--r--ext/soap/tests/custom_content_type.phpt2
-rw-r--r--ext/sockets/sockets.c6
-rw-r--r--ext/sodium/config.m43
-rw-r--r--ext/standard/array.c73
-rwxr-xr-xext/standard/basic_functions.c10
-rw-r--r--ext/standard/basic_functions.h2
-rw-r--r--ext/standard/mail.c2
-rw-r--r--ext/standard/php_http.h1
-rw-r--r--ext/standard/tests/file/realpath_bug77484.phpt4
-rw-r--r--ext/standard/tests/general_functions/http_response_code.phpt9
-rw-r--r--ext/standard/tests/general_functions/proc_nice_basic.phpt2
-rw-r--r--ext/standard/tests/streams/bug64433.phpt2
-rw-r--r--ext/standard/tests/url/get_headers_error_003.phpt2
-rw-r--r--main/main.c2
-rw-r--r--main/output.c20
-rw-r--r--main/php.h2
-rw-r--r--main/php_network.h7
-rw-r--r--main/php_output.h3
-rw-r--r--main/php_streams.h3
-rw-r--r--main/php_version.h8
-rw-r--r--main/streams/plain_wrapper.c4
-rw-r--r--main/streams/xp_socket.c5
-rw-r--r--php.ini-development378
-rw-r--r--php.ini-production378
-rwxr-xr-xrun-tests.php89
-rw-r--r--sapi/cli/php_cli.c38
-rw-r--r--sapi/cli/php_cli_server.c6
-rw-r--r--sapi/cli/tests/CONFLICTS1
-rw-r--r--sapi/cli/tests/bug61977.phpt31
-rw-r--r--sapi/cli/tests/bug67429_1.phpt2
-rw-r--r--sapi/cli/tests/bug67429_2.phpt2
-rw-r--r--sapi/cli/tests/bug68291.phpt9
-rw-r--r--sapi/cli/tests/bug69655.phpt6
-rw-r--r--sapi/cli/tests/php_cli_server.inc110
-rw-r--r--sapi/cli/tests/php_cli_server_002.phpt4
-rw-r--r--sapi/cli/tests/php_cli_server_012.phpt4
-rw-r--r--sapi/cli/tests/php_cli_server_015.phpt7
-rw-r--r--sapi/fpm/fpm/fpm_stdio.c3
-rw-r--r--tests/basic/bug67198.phpt2
-rw-r--r--win32/build/confutils.js13
439 files changed, 51968 insertions, 13112 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index df94bd50e5..2d7fbac84c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -327,7 +327,8 @@ Currently we have the following branches in use:
| Branch | |
| --------- | --------- |
-| master | Active development branch for PHP 8.0, which is open for backwards incompatible changes and major internal API changes. |
+| master | Active development branch for PHP 8.1, which is open for backwards incompatible changes and major internal API changes. |
+| PHP-8.0 | Is used to release the PHP 8.0.x series. This is a current stable version and is open for bugfixes only. |
| PHP-7.4 | Is used to release the PHP 7.4.x series. This is a current stable version and is open for bugfixes only. |
| PHP-7.3 | Is used to release the PHP 7.3.x series. This is a current stable version and is open for bugfixes only. |
| PHP-7.2 | Is used to release the PHP 7.2.x series. This is an old stable version and is open for security fixes only. |
diff --git a/NEWS b/NEWS
index a3923e6972..2f1ff9e63a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,386 +1,24 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-?? ??? ????, PHP 8.0.1RC1
+?? ??? ????, PHP 8.1.0alpha1
- Core:
- . Fixed bug #80345 (PHPIZE configuration has outdated PHP_RELEASE_VERSION).
- (cmb)
- . Fixed bug #72964 (White space not unfolded for CC/Bcc headers). (cmb)
+ . Fixed inclusion order for phpize builds on Windows. (cmb)
-- Tidy:
- . Fixed bug #77594 (ob_tidyhandler is never reset). (cmb)
-
-26 Nov 2020, PHP 8.0.0
-
-- BZ2:
- . Fixed bug #71263 (fread() does not report bzip2.decompress errors). (cmb)
-
-- CLI:
- . Allow debug server binding to an ephemeral port via `-S localhost:0`. (Sara)
-
-- COM:
- . Fixed bug #55847 (DOTNET .NET 4.0 GAC new location). (cmb)
- . Fixed bug #62474 (com_event_sink crashes on certain arguments). (cmb)
-
-- Calendar:
- . Fixed bug #80007 (Potential type confusion in unixtojd() parameter parsing).
- (Andy Postnikov)
-
-- Core:
- . Fixed bug #36365 (scandir duplicates file name at every 65535th file).
- (cmb)
- . Fixed bug #49555 (Fatal error "Function must be a string" message should be
- renamed). (Nikita)
- . Fixed bug #62294 (register_shutdown_function() does not correctly handle
- exit code). (Nikita)
- . Fixed bug #62609 (Allow implementing Traversable on abstract classes).
- (Nikita)
- . Fixed bug #65274 (Enhance undefined class constant error with class name).
- (Nikita)
- . Fixed bug #65275 (Calling exit() in a shutdown function does not change the
- exit value in CLI). (Nikita)
- . Fixed bug #69084 (Unclear error message when not implementing a renamed
- abstract trait function). (Nikita)
- . Fixed bug #70839 (Converting optional argument to variadic forbidden by LSP
- checks). (Nikita)
- . Fixed bug #74558 (Can't rebind closure returned by Closure::fromCallable()).
- (cmb)
- . Fixed bug #77561 (Shebang line not stripped for non-primary script).
- (Nikita)
- . Fixed bug #77619 (Wrong reflection on MultipleIterator::__construct).
- (Fabien Villepinte)
- . Fixed bug #77966 (Cannot alias a method named "namespace"). (Nikita)
- . Fixed bug #78236 (convert error on receiving variables when duplicate [).
- (cmb)
- . Fixed bug #78770 (Incorrect callability check inside internal methods).
- (Nikita)
- . Fixed bug #79108 (Referencing argument in a function makes it a reference
- in the stack trace). (Nikita)
- . Fixed bug #79368 ("Unexpected end of file" is not an acceptable error
- message). (Alex Dowad)
- . Fixed bug #79462 (method_exists and property_exists incoherent behavior).
- (cmb)
- . Fixed bug #79467 (data:// wrappers are writable). (cmb)
- . Fixed bug #79521 (Check __set_state structure). (carusogabriel)
- . Fixed bug #79790 ("Illegal offset type" exception during AST evaluation
- not handled properly). (Nikita)
- . Fixed bug #79791 (Assertion failure when unsetting variable during binary
- op). (Nikita)
- . Fixed bug #79828 (Segfault when trying to access non-existing variable).
- (Nikita)
- . Fixed bug #79841 (Syntax error in configure / unescaped "[]" in php.m4).
- (Nikita)
- . Fixed bug #79852 (count(DOMNodeList) doesn't match
- count(IteratorIterator(DOMNodeList))). (Nikita)
- . Fixed bug #79867 (Promoted untyped properties should get null default
- value). (Nikita)
- . Fixed bug #79897 (Promoted constructor params with attribs cause crash).
- (Deus Kane)
- . Fixed bug #79927 (Generator doesn't throw exception after multiple yield
- from iterable). (Nikita)
- . Fixed bug #79946 (Build fails due to undeclared UINT32_C). (Nikita)
- . Fixed bug #79948 (Exit in auto-prepended file does not abort PHP execution).
- (Nikita)
- . Fixed bug #80045 (memleak after two set_exception_handler calls with
- __call). (Nikita)
- . Fixed bug #80096 (Segmentation fault with named arguments in nested call).
- (Nikita)
- . Fixed bug #80109 (Cannot skip arguments when extended debug is enabled).
- (Nikita)
- . Fixed bug #80225 (broken namespace usage in eval code). (Nikita)
- . Fixed bug #80258 (Windows Deduplication Enabled, randon permission errors).
- (cmb)
- . Fixed bug #80280 (ADD_EXTENSION_DEP() fails for ext/standard and ext/date).
- (cmb)
- . Fixed bug #80334 (assert() vs named parameters - confusing error). (Nikita)
- . Fixed bug #8055 (Abstract trait methods returning "self" cannot be
- fulfilled by traits). (Nikita)
- . Fixed faulty generator cleanup with yield from. (Bob)
- . Implement #[Attr] Attribute syntax as per final vote in RFC
- https://wiki.php.net/rfc/shorter_attribute_syntax_change
- . Implemented FR #47074 (phpinfo() reports "On" as 1 for the some
- extensions). (cmb)
- . Implemented FR #72089 (require() throws fatal error instead of exception).
- (Nikita)
- . Removed the pdo_odbc.db2_instance_name php.ini directive. (Kalle)
- . Use SSE2 instructions do locale independent strtolower. (Laruence)
-
-- Curl:
- . Bumped required libcurl version to 7.29.0. (cmb)
- . Fixed bug #80121 (Null pointer deref if CurlHandle directly instantiated).
- (Nikita)
-
-- DOM:
- . Add property DOMXPath::$registerNodeNamespaces and constructor argument
- that allow global flag to configure query() or evaluate() calls.
- . Fixed bug #79968 (DOMChildNode API crash on unattached nodes). (Benjamin)
- . Fixed bug #80268 (loadHTML() truncates at NUL bytes). (cmb)
-
-- Date:
- . Fixed bug #60302 (DateTime::createFromFormat should new static(), not new
- self()). (Derick)
- . Fixed bug #65547 (Default value for sunrise/sunset zenith still wrong).
- (cmb)
- . Fixed bug #69044 (discrepancy between time and microtime). (krakjoe)
- . Fixed bug #80057 (DateTimeImmutable::createFromFormat() does not populate
- time). (Derick)
- . Implemented FR #79903 (datetime: new format "p", same as "P" but returning
- "Z" for UTC). (gharlan)
-
-- Enchant:
- . Add LIBENCHANT_VERSION macro.
- . Add enchant_dict_add and enchant_dict_is_added functions.
- . Deprecate enchant_broker_set_dict_path, enchant_broker_get_dict_path,
- enchant_dict_add_to_personal and enchant_dict_is_in_session.
- . Use libenchant-2 when available.
-
-- FFI:
- . Added FFI\CType::getName() method. (chopins)
- . Fixed bug #79177 (FFI doesn't handle well PHP exceptions within callback).
- (cmb, Dmitry, Nikita)
- . Fixed bug #79749 (Converting FFI instances to bool fails). (cmb)
-
-- FPM:
- . Add pm.status_listen option. (Jakub Zelenka)
-
-- Fileinfo:
- . Upgrade to libmagic 5.39. (Anatol)
+- FTP:
+ . Convert resource<ftp> to object \FTPConnection. (Sara)
- GD:
- . Added imagegetinterpolation(). (cmb)
- . Fixed bug #55005 (imagepolygon num_points requirement). (cmb)
- . Made the $num_points parameter of php_imagepolygon optional. (cmb)
- . Removed deprecated image2wbmp(). (cmb)
- . Removed deprecated png2wbmp() and jpeg2wbmp(). (cmb)
- . Replaced gd resources with objects. (Mark Randall)
-
-- IMAP:
- . Fixed bug #64076 (imap_sort() does not return FALSE on failure). (cmb)
- . Fixed bug #76618 (segfault on imap_reopen). (girgias)
- . Fixed bug #80213 (imap_mail_compose() segfaults on certain $bodies). (cmb)
- . Fixed bug #80215 (imap_mail_compose() may modify by-val parameters). (cmb)
- . Fixed bug #80216 (imap_mail_compose() does not validate types/encodings).
- (cmb)
- . Fixed bug #80220 (imap_mail_compose() may leak memory). (cmb)
- . Fixed bug #80223 (imap_mail_compose() leaks envelope on malformed bodies).
- (cmb)
- . Fixed bug #80226 (imap_sort() leaks sortpgm memory). (cmb)
- . Fixed bug #80239 (imap_rfc822_write_address() leaks memory). (cmb)
- . Fixed bug #80242 (imap_mail_compose() segfaults for multipart with rfc822).
- (cmb)
- . Fixed minor regression caused by fixing bug #80220. (cmb)
-
-- Iconv:
- . Dropped support for iconv without proper errno setting. (cmb)
-
-- Intl:
- . Removed deprecated INTL_IDNA_VARIANT_2003. (cmb)
-
-- JIT:
- . Fixed bug #77857 (Wrong result if executed with JIT). (Laruence)
- . Fixed bug #79255 (PHP cannot be compiled with enable JIT).
- (Laruence, Dmitry)
- . Fixed bug #79582 (Crash seen when opcache.jit=1235 and
- opcache.jit_debug=2). (Laruence)
- . Fixed bug #79743 (Fatal error when assigning to array property
- with JIT enabled). (Laruence)
- . Fixed bug #79864 (JIT segfault in Symfony OptionsResolver). (Dmitry)
- . Fixed bug #79888 (Incorrect execution with JIT enabled). (Dmitry)
-
-- JSON:
- . The JSON extension is now an integral part of PHP and cannot be disabled
- as per RFC: https://wiki.php.net/rfc/always_enable_json (tandre)
-
-- LDAP:
- . Fixed memory leaks. (ptomulik)
- . Removed deprecated ldap_sort. (mcmic)
-
-- MBString:
- . Fixed bug #76999 (mb_regex_set_options() return current options). (cmb)
- . Removed the unused $is_hex parameter from mb_decode_numericentity(). (cmb)
-
-- MySQLi:
- . Fixed bug #76809 (SSL settings aren't respected when persistent connections
- are used). (fabiomsouto)
-
-- Mysqlnd:
- . Fixed #60594 (mysqlnd exposes 160 lines of stats in phpinfo). (PeeHaa)
+ . Convert resource<gd font> to object \GdFont. (Sara)
-- OCI8:
- . Deprecated old OCI8 function aliases. (Jens de Nies)
- . Modernized oci_register_taf_callback() callable argument parsing
- implementation. (girgias)
- . Removed obsolete no-op function oci_internal_debug(). (Jens de Nies)
-
-- ODBC:
- . Fixed bug #22986 (odbc_connect() may reuse persistent connection). (cmb)
- . Fixed bug #44618 (Fetching may rely on uninitialized data). (cmb)
-
-- Opcache:
- . Fixed bug #76535 (Opcache does not replay compile-time warnings). (Nikita)
- . Fixed bug #78654 (Incorrectly computed opcache checksum on files with
- non-ascii characters). (mhagstrand)
- . Fixed bug #79665 (ini_get() and opcache_get_configuration() inconsistency).
- (cmb)
- . Fixed bug #80030 (Optimizer segfault with isset on static property with
- undef dynamic class name). (Nikita)
- . Fixed bug #80175 (PHP8 RC1 - JIT Buffer not working). (cmb)
- . Fixed bug #80184 (Complex expression in while / if statements resolves to
- false incorrectly). (Nikita)
- . Fixed bug #80255 (Opcache bug (bad condition result) in 8.0.0rc1). (Nikita)
- . Fixed run-time binding of preloaded dynamically declared function. (Dmitry)
+- hash:
+ . Implemented FR #68109 (Add MurmurHash V3). (Anatol, Michael)
- OpenSSL:
- . Added Cryptographic Message Syntax (CMS) support. (Eliot Lear)
-
-- PCRE:
- . Don't ignore invalid escape sequences. (sjon)
- . Updated to PCRE2 10.35. (cmb)
-
-- PDO:
- . Changed default PDO error mode to exceptions. (AllenJB)
- . Fixed bug #77849 (Disable cloning of PDO handle/connection objects).
- (camporter)
-
-- PDO_Firebird:
- . Fixed bug #64937 (Firebird PDO preprocessing sql). (Simonov Denis)
-
-- PDO_OCI:
- . Added support for setting and getting the oracle OCI 18c call timeout.
- (camporter)
-
-- PDO_PGSQL:
- . Bumped required libpq version to 9.1. (cmb)
-
-- PGSQL:
- . Bumped required libpq version to 9.1. (cmb)
-
-- Phpdbg:
- . Fixed bug #76596 (phpdbg support for display_errors=stderr). (kabel)
- . Fixed bug #76801 (too many open files). (alekitto)
- . Fixed bug #77800 (phpdbg segfaults on listing some conditional breakpoints).
- (krakjoe)
- . Fixed bug #77805 (phpdbg build fails when readline is shared). (krakjoe)
-
-- Reflection:
- . Fixed bug #64592 (ReflectionClass::getMethods() returns methods out of
- scope). (Nikita)
- . Fixed bug #69180 (Reflection does not honor trait conflict resolution /
- method aliasing). (Nikita)
- . Fixed bug #74939 (Nested traits' aliased methods are lowercased). (Nikita)
- . Fixed bug #77325 (ReflectionClassConstant::$class returns wrong class when
- extending). (Nikita)
- . Fixed bug #78697 (ReflectionClass::implementsInterface - inaccurate error
- message with traits). (villfa)
- . Fixed bug #80190 (ReflectionMethod::getReturnType() does not handle static
- as part of union type). (Nikita)
- . Fixed bug #80299 (ReflectionFunction->invokeArgs confused in arguments).
- (Nikita)
- . Fixed bug #80370 (getAttributes segfault on dynamic properties). (Benjamin
- Eberlei)
- . Implement #79628 (Add $filter parameter for ReflectionClass::getConstants
- and ReflectionClass::getReflectionConstants) (carusogabriel)
- . Implement ReflectionProperty::hasDefaultValue and
- Reflection::getDefaultValue (beberlei)
-
-- SNMP:
- . Fixed bug #70461 (disable md5 code when it is not supported in net-snmp).
- (Alexander Bergmann, cmb)
-
-- SPL:
- . Fixed bug #65006 (spl_autoload_register fails with multiple callables using
- self, same method). (Nikita)
- . Fixed bug #65387 (Circular references in SPL iterators are not garbage
- collected). (Nikita)
- . Fixed bug #71236 (Second call of spl_autoload_register() does nothing if it
- has no arguments). (Nikita)
- . Fixed bug #79987 (Memory leak in SplFileInfo because of missing
- zend_restore_error_handling()). (Dmitry)
- . SplFixedArray is now IteratorAggregate rather than Iterator. (alexdowad)
-
-- SQLite3:
- . Added SQLite3::setAuthorizer() and respective class constants. (bohwaz)
-
-- Session:
- . Fixed bug #73529 (session_decode() silently fails on wrong input). (cmb)
- . Fixed bug #78624 (session_gc return value for user defined session
- handlers). (bshaffer)
-
-- Shmop:
- . Converted shmop resources to objects. (cmb)
-
-- SimpleXML:
- . Fixed bug #63575 (Root elements are not properly cloned). (cmb)
- . Fixed bug #75245 (Don't set content of elements with only whitespaces).
- (eriklundin)
-
-- Sodium:
- . Fixed bug #77646 (sign_detached() strings not terminated). (Frank)
-
-- Standard:
- . Don't force rebuild of symbol table, when populating $http_response_header
- variable by the HTTP stream wrapper. (Dmitry)
- . Fixed bug #47983 (mixed LF and CRLF line endings in mail()). (cmb)
- . Fixed bug #64060 (lstat_stat_variation7.phpt fails on certain file systems).
- (M. Voelker, cmb)
- . Fixed bug #75902 (str_replace should warn when misused with nested arrays).
- (Nikita)
- . Fixed bug #76859 (stream_get_line skips data if used with data-generating
- filter). (kkopachev)
- . Fixed bug #77204 (getimagesize(): Read error! should mention file path).
- (peter279k)
- . Fixed bug #78385 (parse_url() does not include 'query' when question mark
- is the last char). (Islam Israfilov)
- . Fixed bug #79868 (Sorting with array_unique gives unwanted result). (Nikita)
- . Fixed bug #80256 (file_get_contents strip first line with chunked encoding
- redirect). (Nikita)
- . Fixed bug #80266 (parse_url silently drops port number 0). (cmb, Nikita)
- . Fixed bug #80290 (Double free when ASSERT_CALLBACK is used with a dynamic
- message). (Nikita)
- . Implemented FR #78638 (__PHP_Incomplete_Class should be final). (Laruence)
- . Made quoting of cmd execution functions consistent. (cmb)
-
-- Tidy:
- . Removed the unused $use_include_path parameter from tidy_repair_string().
- (cmb)
-
-- Tokenizer:
- . Fixed bug #80328 (PhpToken::getAll() confusing name). (Nikita)
-
-- XML:
- . Fixed bug #76874 (xml_parser_free() should never leak memory). (Nikita)
-
-- XMLWriter:
- . Changed functions to accept/return XMLWriter objects instead of resources.
- (cmb)
- . Implemented FR #79344 (xmlwriter_write_attribute_ns: $prefix should be
- nullable). (cmb)
- . Removed return types from XMLWriter stubs. (cmb)
-
-- Zip:
- . Add "flags" options to ZipArchive::addGlob and addPattern methods
- keeping previous behavior having FL_OVERWRITE by default. (Remi)
- . Add ZipArchive::EM_UNKNOWN and ZipArchive::EM_TRAD_PKWARE constants. (Remi)
- . Add ZipArchive::isCompressionMethodSupported() and
- ZipArchive::isEncryptionMethodSupported() method (libzip 1.7.0). (Remi)
- . Add ZipArchive::replaceFile() method. (Remi)
- . Add ZipArchive::setCancelCallback method (since libzip 1.6.0). (Remi)
- . Add ZipArchive::setMtimeName and ZipArchive::setMtimeIndex methods. (Remi)
- . Add ZipArchive::setProgressCallback method (since libzip 1.3.0). (Remi)
- . Add lastId property to ZipArchive. (Remi)
- . Add optional "flags" parameter to ZipArchive::addEmptyDir, addFile and
- addFromString methods. (Remi)
- . Fixed bug #50678 (files extracted by ZipArchive class lost their
- original modified time). (Remi)
- . Fixed bug #72374 (remove_path strips first char of filename). (tyage, Remi)
- . Implemented FR #77960 (add compression / encryption options for
- ZipArchive::addGlob and ZipArchive::addPattern). (Remi)
- . ZipArchive::status and ZipArchive::statusSys properties and
- ZipArchive::getStatusString() method stay valid after the archive
- is closed. (Remi)
+ . Bump minimal OpenSSL version to 1.0.2. (Jakub Zelenka)
-- Zlib:
- . Fixed bug #71417 (fread() does not report zlib.inflate errors). (cmb)
- . Fixed bug #78792 (zlib.output_compression disabled by Content-Type: image/).
- (cmb)
+- PSpell:
+ . Convert resource<pspell> to object \PSpell. (Sara)
+ . Convert resource<pspell config> to object \PSPellConfig. (Sara)
+<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
diff --git a/UPGRADING b/UPGRADING
index a9246bc7a7..c8c8d4b09e 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -1,4 +1,4 @@
-PHP 8.0 UPGRADE NOTES
+PHP 8.1 UPGRADE NOTES
1. Backward Incompatible Changes
2. New Features
@@ -15,1137 +15,70 @@ PHP 8.0 UPGRADE NOTES
13. Other Changes
14. Performance Improvements
-
========================================
1. Backward Incompatible Changes
========================================
-- Core:
- . `match` is now a reserved keyword.
- . Assertion failures now throw by default. If the old behavior is desired,
- then set `assert.exception=0` in INI settings.
- . Methods with the same name as the class are no longer interpreted as
- constructors. The __construct() method should be used instead.
- . Removed ability to call non-static methods statically.
- Thus `is_callable` will fail when checking for a non-static method with a
- classname (must check with an object instance).
- . Removed (real) cast.
- . Removed (unset) cast.
- . Removed track_errors ini directive. This means that $php_errormsg is no
- longer available. The error_get_last() function may be used instead.
- . Removed the ability to define case-insensitive constants. The third
- argument to define() may no longer be true.
- . Access to undefined constants now always results in an Error exception.
- Previously, unqualified constant accesses resulted in a warning and were
- interpreted as strings.
- . Removed ability to specify an autoloader using an __autoload() function.
- spl_autoload_register() should be used instead.
- . Removed the $errcontext argument for custom error handlers.
- . Removed create_function(). Anonymous functions may be used instead.
- . Removed each(). foreach or ArrayIterator should be used instead.
- . Removed ability to unbind $this from closures that were created from a
- method, using Closure::fromCallable() or ReflectionMethod::getClosure().
- . Also removed ability to unbind $this from proper closures that contain uses
- of $this.
- . Removed ability to use array_key_exists() with objects. Use one of isset()
- or property_exists() instead.
- . Made the behavior of array_key_exists() regarding the type of the key
- parameter consistent with isset() and normal array access. All key types now
- use the usual coercions and array/object keys throw a TypeError.
- . Any array that has a number n as its first numeric key will use n+1 for
- its next implicit key, even if n is negative.
- RFC: https://wiki.php.net/rfc/negative_array_index
- . The default error_reporting level is now E_ALL. Previously it excluded
- E_NOTICE and E_DEPRECATED.
- . display_startup_errors is now enabled by default.
- . Using "parent" inside a class that has no parent will now result in a
- fatal compile-time error.
- . The @ operator will no longer silence fatal errors (E_ERROR, E_CORE_ERROR,
- E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE). Error handlers
- that expect error_reporting to be 0 when @ is used, should be adjusted to
- use a mask check instead:
-
- // Replace
- function my_error_handler($err_no, $err_msg, $filename, $linenum) {
- if (error_reporting() == 0) {
- return; // Silenced
- }
- // ...
- }
-
- // With
- function my_error_handler($err_no, $err_msg, $filename, $linenum) {
- if (!(error_reporting() & $err_no)) {
- return; // Silenced
- }
- // ...
- }
-
- Additionally, care should be taken that error messages are not displayed in
- production environments, which can result in information leaks. Please
- ensure that display_errors=Off is used in conjunction with error logging.
- . Following the hash comment operator # immediately with an opening bracket
- is not supported as a comment anymore since this syntax is now used for
- attributes.
- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax_change
- . Inheritance errors due to incompatible method signatures (LSP violations)
- will now always generate a fatal error. Previously a warning was generated
- in some cases.
- RFC: https://wiki.php.net/rfc/lsp_errors
- . The precedence of the concatenation operator has changed relative to
- bitshifts and addition as well as subtraction.
- RFC: https://wiki.php.net/rfc/concatenation_precedence
- . Arguments with a default value that resolves to null at runtime will no
- longer implicitly mark the argument type as nullable. Either use an explicit
- nullable type, or an explicit null default value instead.
-
- // Replace
- function test(int $arg = CONST_RESOLVING_TO_NULL) {}
- // With
- function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
- // Or
- function test(int $arg = null) {}
- . A number of warnings have been converted into Error exceptions:
-
- * Attempting to write to a property of a non-object. Previously this
- implicitly created an stdClass object for null, false and empty strings.
- * Attempting to append an element to an array for which the PHP_INT_MAX key
- is already used.
- * Attempting to use an invalid type (array or object) as an array key or
- string offset.
- * Attempting to write to an array index of a scalar value.
- * Attempting to unpack a non-array/Traversable.
-
- A number of notices have been converted into warnings:
-
- * Attempting to read an undefined variable.
- * Attempting to read an undefined property.
- * Attempting to read an undefined array key.
- * Attempting to read a property of a non-object.
- * Attempting to access an array index of a non-array.
- * Attempting to convert an array to string.
- * Attempting to use a resource as an array key.
- * Attempting to use null, a boolean, or a float as a string offset.
- * Attempting to read an out-of-bounds string offset.
- * Attempting to assign an empty string to a string offset.
-
- RFC: https://wiki.php.net/rfc/engine_warnings
- . Attempting to assign multiple bytes to a string offset will now emit a
- warning.
- . Unexpected characters in source files (such as null bytes outside of
- strings) will now result in a ParseError exception instead of a compile
- warning.
- . Uncaught exceptions now go through "clean shutdown", which means that
- destructors will be called after an uncaught exception.
- . Compile time fatal error "Only variables can be passed by reference" has
- been delayed until runtime and converted to "Argument cannot be passed by
- reference" exception.
- . Some "Only variables should be passed by reference" notices have been
- converted to "Argument cannot be passed by reference" exception.
- . The generated name for anonymous classes has changed. It will now include
- the name of the first parent or interface:
-
- new class extends ParentClass {};
- // -> ParentClass@anonymous
- new class implements FirstInterface, SecondInterface {};
- // -> FirstInterface@anonymous
- new class {};
- // -> class@anonymous
-
- The name shown above is still followed by a null byte and a unique
- suffix.
- . Non-absolute trait method references in trait alias adaptations are now
- required to be unambiguous:
-
- class X {
- use T1, T2 {
- func as otherFunc;
- }
- function func() {}
- }
-
- If both T1::func() and T2::func() exist, this code was previously silently
- accepted, and func was assumed to refer to T1::func. Now it will generate a
- fatal error instead, and either T1::func or T2::func needs to be written
- explicitly.
- . The signature of abstract methods defined in traits is now checked against
- the implementing class method:
-
- trait MyTrait {
- abstract private function neededByTrait(): string;
- }
-
- class MyClass {
- use MyTrait;
-
- // Error, because of return type mismatch.
- private function neededByTrait(): int { return 42; }
- }
-
- RFC: https://wiki.php.net/rfc/abstract_trait_method_validation
- . Disabled functions are now treated exactly like non-existent functions.
- Calling a disabled function will report it as unknown, and redefining a
- disabled function is now possible.
- . data: stream wrappers are no longer writable, which matches the documented
- behavior.
- . The arithmetic and bitwise operators
- +, -, *, /, **, %, <<, >>, &, |, ^, ~, ++, --
- will now consistently throw a TypeError when one of the operands is an
- array, resource or non-overloaded object. The only exception to this is the
- array + array merge operation, which remains supported.
- RFC: https://wiki.php.net/rfc/arithmetic_operator_type_checks
- . Float to string casting will now always behave locale-independently.
- RFC: https://wiki.php.net/rfc/locale_independent_float_to_string
- . Removed support for deprecated curly braces for offset access
- RFC: https://wiki.php.net/rfc/deprecate_curly_braces_array_access
- . Applying the final modifier on a private method will now produce a warning
- unless that method is the constructor.
- RFC: https://wiki.php.net/rfc/inheritance_private_methods
- . If an object constructor exit()s, the object destructor will no longer be
- called. This matches the behavior when the constructor throws.
- . Non-strict comparisons between numbers and non-numeric strings now work by
- casting the number to string and comparing the strings. Comparisons between
- numbers and numeric strings continue to work as before. Notably, this means
- that `0 == "not-a-number"` is considered false now.
- RFC: https://wiki.php.net/rfc/string_to_number_comparison
- . Namespaced names can no longer contain whitespace: While `Foo\Bar` will be
- recognized as a namespaced name, `Foo \ Bar` will not. Conversely, reserved
- keywords are now permitted as namespace segments, which may also change the
- interpretation of code: `new\x` is now the same as `constant('new\x')`, not
- `new \x()`.
- RFC: https://wiki.php.net/rfc/namespaced_names_as_token
- . Nested ternaries now require explicit parentheses.
- RFC: https://wiki.php.net/rfc/ternary_associativity
- . debug_backtrace() and Exception::getTrace() will no longer provide
- references to arguments. It will not be possible to change function
- arguments through the backtrace.
- . Numeric string handling has been altered to be more intuitive and less
- error-prone. Trailing whitespace is now allowed in numeric strings for
- consistency with how leading whitespace is treated. This mostly affects:
- - The is_numeric() function
- - String-to-string comparisons
- - Type declarations
- - Increment and decrement operations
- The concept of a "leading-numeric string" has been mostly dropped; the
- cases where this remains exist in order to ease migration. Strings which
- emitted an E_NOTICE "A non well-formed numeric value encountered" will now
- emit an E_WARNING "A non-numeric value encountered" and all strings which
- emitted an E_WARNING "A non-numeric value encountered" will now throw a
- TypeError. This mostly affects:
- - Arithmetic operations
- - Bitwise operations
- This E_WARNING to TypeError change also affects the E_WARNING
- "Illegal string offset 'string'" for illegal string offsets. The behavior
- of explicit casts to int/float from strings has not been changed.
- RFC: https://wiki.php.net/rfc/saner-numeric-strings
- . Magic Methods will now have their arguments and return types checked if
- they have them declared. The signatures should match the following list:
-
- __call(string $name, array $arguments): mixed
- __callStatic(string $name, array $arguments): mixed
- __clone(): void
- __debugInfo(): ?array
- __get(string $name): mixed
- __invoke(mixed $arguments): mixed
- __isset(string $name): bool
- __serialize(): array
- __set(string $name, mixed $value): void
- __set_state(array $properties): object
- __sleep(): array
- __unserialize(array $data): void
- __unset(string $name): void
- __wakeup(): void
-
- RFC: https://wiki.php.net/rfc/magic-methods-signature
- . call_user_func_array() array keys will now be interpreted as parameter names,
- instead of being silently ignored.
-
-- COM:
- . Removed the ability to import case-insensitive constants from type
- libraries. The second argument to com_load_typelib() may no longer be false;
- com.autoregister_casesensitive may no longer be disabled; case-insensitive
- markers in com.typelib_file are ignored.
-
-- Curl:
- . CURLOPT_POSTFIELDS no longer accepts objects as arrays. To interpret an
- object as an array, perform an explicit (array) cast. The same applies to
- other options accepting arrays as well.
-
-- Date:
- . mktime() and gmmktime() now require at least one argument. time() can be
- used to get the current timestamp.
-
-- dom:
- . Remove unimplemented classes from ext/dom that had no behavior and contained
- test data. These classes have also been removed in the latest version of DOM
- standard:
-
- * DOMNameList
- * DomImplementationList
- * DOMConfiguration
- * DomError
- * DomErrorHandler
- * DOMImplementationSource
- * DOMLocator
- * DOMUserDataHandler
- * DOMTypeInfo
-
-- Enchant:
- . enchant_broker_list_dicts(), enchant_broker_describe() and
- enchant_dict_suggest() will now return an empty array instead of null.
- . enchant_broker_init() will now return an EnchantBroker object rather than
- a resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . enchant_broker_request_dict() and enchant_broker_request_pwl_dict() will now
- return an EnchantDictionary object rather than a resource. Return value
- checks using is_resource() should be replaced with checks for `false`.
-
-- Exif:
- . Removed read_exif_data(). exif_read_data() should be used instead.
-
-- Filter:
- . The FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED flags for the
- FILTER_VALIDATE_URL filter have been removed. The scheme and host are (and
- have been) always required.
- . The INPUT_REQUEST and INPUT_SESSION source for filter_input() etc have been
- removed. These were never implemented and their use always generated a
- warning.
-
-- GD:
- . The GD extension now uses a GdImage objects as the underlying data structure
- for images, rather than resources. These objects are completely opaque, i.e.
- they don't have any methods. Return value checks using is_resource() should
- be replaced with checks for `false`. The imagedestroy() function no longer
- has an effect, instead the GdImage instance is automatically destroyed if
- it is no longer referenced.
- . The deprecated function image2wbmp() has been removed.
- RFC: https://wiki.php.net/rfc/image2wbmp
- . The deprecated functions png2wbmp() and jpeg2wbmp() have been removed.
- RFC: https://wiki.php.net/rfc/deprecate-png-jpeg-2wbmp
- . The default $mode parameter of imagecropauto() no longer accepts -1.
- IMG_CROP_DEFAULT should be used instead.
-
-- GMP:
- . gmp_random() has been removed. One of gmp_random_range() or
- gmp_random_bits() should be used instead.
-
-- Iconv:
- . iconv() implementations which do not properly set errno in case of errors
- are no longer supported.
-
-- IMAP:
- . The unused default_host argument of imap_headerinfo() has been removed.
- . The imap_header() function which is an alias of imap_headerinfo() has been removed.
-
-- Intl:
- . The deprecated constant INTL_IDNA_VARIANT_2003 has been removed.
- RFC: https://wiki.php.net/rfc/deprecate-and-remove-intl_idna_variant_2003
- . The deprecated Normalizer::NONE constant has been removed.
- . The IntlDateFormatter::RELATIVE_FULL, IntlDateFormatter::RELATIVE_LONG,
- IntlDateFormatter::RELATIVE_MEDIUM, and IntlDateFormatter::RELATIVE_SHORT
- constants have been added.
-
-- LDAP:
- . The deprecated function ldap_sort has been removed.
- . The deprecated function ldap_control_paged_result has been removed.
- . The deprecated function ldap_control_paged_result_response has been removed.
- . The interface of ldap_set_rebind_proc has changed; the $callback parameter
- does not accept empty string anymore; null value shall be used instead.
-
-- Mbstring:
- . The mbstring.func_overload directive has been removed. The related
- MB_OVERLOAD_MAIL, MB_OVERLOAD_STRING, and MB_OVERLOAD_REGEX constants have
- also been removed. Finally, the "func_overload" and "func_overload_list"
- entries in mb_get_info() have been removed.
- . mb_parse_str() can no longer be used without specifying a result array.
- . A number of deprecated mbregex aliases have been removed. See the following
- list for which functions should be used instead:
-
- * mbregex_encoding() -> mb_regex_encoding()
- * mbereg() -> mb_ereg()
- * mberegi() -> mb_eregi()
- * mbereg_replace() -> mb_ereg_replace()
- * mberegi_replace() -> mb_eregi_replace()
- * mbsplit() -> mb_split()
- * mbereg_match() -> mb_ereg_match()
- * mbereg_search() -> mb_ereg_search()
- * mbereg_search_pos() -> mb_ereg_search_pos()
- * mbereg_search_regs() -> mb_ereg_search_regs()
- * mbereg_search_init() -> mb_ereg_search_init()
- * mbereg_search_getregs() -> mb_ereg_search_getregs()
- * mbereg_search_getpos() -> mb_ereg_search_getpos()
- * mbereg_search_setpos() -> mb_ereg_search_setpos()
-
- . The 'e' modifier for mb_ereg_replace() has been removed.
- mb_ereg_replace_callback() should be used instead.
- . A non-string pattern argument to mb_ereg_replace() will now be interpreted
- as a string instead of an ASCII codepoint. The previous behavior may be
- restored with an explicit call to chr().
- . The needle argument for mb_strpos(), mb_strrpos(), mb_stripos(),
- mb_strripos(), mb_strstr(), mb_stristr(), mb_strrchr() and mb_strrichr() can
- now be empty.
- . The $is_hex parameter, which was not used internally, has been removed from
- mb_decode_numericentity().
- . The legacy behavior of passing the encoding as the third argument instead
- of an offset for the mb_strrpos() function has been removed; provide an
- explicit 0 offset with the encoding as the fourth argument instead.
- . The ISO_8859-* character encoding aliases have been replaced by ISO8859-*
- aliases for better interoperability with the iconv extension. The mbregex
- ISO 8859 aliases with underscores (ISO_8859_* and ISO8859_*) have also been
- removed.
- . mb_ereg() and mb_eregi() will now return boolean true on a successful
- match. Previously they returned integer 1 if $matches was not passed, or
- max(1, strlen($reg[0])) is $matches was passed.
-
-- OCI8:
- . The OCI-Lob class is now called OCILob, and the OCI-Collection class is now
- called OCICollection for name compliance enforced by PHP 8 arginfo
- type annotation tooling.
- . Several alias functions have been marked as deprecated.
- . oci_internal_debug() and its alias ociinternaldebug() have been removed.
-
-- ODBC:
- . odbc_connect() no longer reuses persistent connections.
- . The unused flags parameter of odbc_exec() has been removed.
-
-- OpenSSL:
- . openssl_x509_read() and openssl_csr_sign() will now return an
- OpenSSLCertificate object rather than a resource. Return value checks using
- is_resource() should be replaced with checks for `false`.
- . The openssl_x509_free() function is deprecated and no longer has an effect,
- instead the OpenSSLCertificate instance is automatically destroyed if it is no
- longer referenced.
- . openssl_csr_new() will now return an OpenSSLCertificateSigningRequest object
- rather than a resource. Return value checks using is_resource() should be
- replaced with checks for `false`.
- . openssl_pkey_new() will now return an OpenSSLAsymmetricKey object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . The openssl_pkey_free() function is deprecated and no longer has an effect,
- instead the OpenSSLAsymmetricKey instance is automatically destroyed if it is no
- longer referenced.
- . openssl_seal() and openssl_open() now require $method to be passed, as the
- previous default of "RC4" is considered insecure.
-
-- PCRE:
- . When passing invalid escape sequences they are no longer interpreted as
- literals. This behavior previously required the X modifier - which is
- now ignored.
-
-- PDO:
- . The default error handling mode has been changed from "silent" to
- "exceptions". See https://www.php.net/manual/en/pdo.error-handling.php
- for details of behavior changes and how to explicitly set this attribute.
- RFC: https://wiki.php.net/rfc/pdo_default_errmode
- . The signatures of some PDO methods have changed:
-
- PDO::query(
- string $statement, ?int $fetch_mode = null, ...$fetch_mode_args)
- PDOStatement::setFetchMode(int $mode, ...$params)
-
-- PDO_ODBC:
- . The php.ini directive pdo_odbc.db2_instance_name has been removed
-
-- pgsql:
- . The deprecated pg_connect() syntax using multiple parameters instead of a
- connection string is no longer supported.
- . The deprecated pg_lo_import() and pg_lo_export() signature that passes the
- connection as the last argument is no longer supported. The connection
- should be passed as first argument instead.
- . pg_fetch_all() will now return an empty array instead of false for result
- sets with zero rows.
-
-- Phar:
- . Metadata associated with a phar will no longer be automatically unserialized,
- to fix potential security vulnerabilities due to object instantiation, autoloading, etc.
- RFC: https://wiki.php.net/rfc/phar_stop_autoloading_metadata
-
-- Reflection:
- . The method signatures
-
- ReflectionClass::newInstance($args)
- ReflectionFunction::invoke($args)
- ReflectionMethod::invoke($object, $args)
-
- have been changed to:
-
- ReflectionClass::newInstance(...$args)
- ReflectionFunction::invoke(...$args)
- ReflectionMethod::invoke($object, ...$args)
-
- Code that must be compatible with both PHP 7 and PHP 8 can use the following
- signatures to be compatible with both versions:
-
- ReflectionClass::newInstance($arg = null, ...$args)
- ReflectionFunction::invoke($arg = null, ...$args)
- ReflectionMethod::invoke($object, $arg = null, ...$args)
-
- . The ReflectionType::__toString() method will now return a complete debug
- representation of the type, and is no longer deprecated. In particular the
- result will include a nullability indicator for nullable types. The format
- of the return value is not stable and may change between PHP versions.
- . Reflection export() methods have been removed.
- . The following methods can now return information about default values of
- parameters of internal functions:
- ReflectionParameter::isDefaultValueAvailable()
- ReflectionParameter::getDefaultValue()
- ReflectionParameter::isDefaultValueConstant()
- ReflectionParameter::getDefaultValueConstantName()
- . ReflectionMethod::isConstructor() and ReflectionMethod::isDestructor() now
- also return true for `__construct` and `__destruct` methods of interfaces.
- Previously, this would only be true for methods of classes and traits.
- . ReflectionType::isBuiltin() method has been moved to ReflectionNamedType.
- ReflectionUnionType does not have it.
-
-- Sockets:
- . The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES
- flags for socket_addrinfo_lookup() have been removed.
- . socket_create(), socket_create_listen(), socket_accept(),
- socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind(),
- and socket_wsaprotocol_info_import() will now return a Socket object rather
- than a resource. Return value checks using is_resource() should be replaced
- with checks for `false`.
- . socket_addrinfo_lookup() will now return an array of AddressInfo objects
- rather than resources.
-
-- SPL:
- . SplFileObject::fgetss() has been removed.
- . SplHeap::compare($a, $b) now specifies a method signature. Inheriting
- classes implementing this method will now have to use a compatible
- method signature.
- . SplDoublyLinkedList::push() now returns void instead of true
- . SplDoublyLinkedList::unshift() now returns void instead of true
- . SplQueue::enqueue() now returns void instead of true
- . spl_autoload_register() will now always throw a TypeError on invalid
- arguments, therefore the second argument $do_throw is ignored and a
- notice will be emitted if it is set to false.
- . SplFixedArray is now an IteratorAggregate and not an Iterator.
- SplFixedArray::rewind(), ::current(), ::key(), ::next(), and ::valid()
- have been removed. In their place, SplFixedArray::getIterator() has been
- added. Any code which uses explicit iteration over SplFixedArray must now
- obtain an Iterator through SplFixedArray::getIterator(). This means that
- SplFixedArray is now safe to use in nested loops.
-
-- Standard:
- . assert() will no longer evaluate string arguments, instead they will be
- treated like any other argument. assert($a == $b) should be used instead of
- assert('$a == $b'). The assert.quiet_eval ini directive and
- ASSERT_QUIET_EVAL constants have also been removed, as they would no longer
- have any effect.
- . parse_str() can no longer be used without specifying a result array.
- . fgetss() has been removed.
- . The string.strip_tags filter has been removed.
- . The needle argument of strpos(), strrpos(), stripos(), strripos(), strstr(),
- strchr(), strrchr(), and stristr() will now always be interpreted as a
- string. Previously non-string needles were interpreted as an ASCII code
- point. An explicit call to chr() can be used to restore the previous
- behavior.
- . The needle argument for strpos(), strrpos(), stripos(), strripos(),
- strstr(), stristr() and strrchr() can now be empty.
- . The length argument for substr(), substr_count(), substr_compare(), and
- iconv_substr() can now be null. Null values will behave as if no length
- argument was provided and will therefore return the remainder of the string
- instead of an empty string.
- . The length argument for array_splice() can now be null. Null values will
- behave identically to omitting the argument, thus removing everything from
- the 'offset' to the end of the array.
- . The args argument of vsprintf(), vfprintf(), and vprintf() must now be an
- array. Previously any type was accepted.
- . The 'salt' option of password_hash() is no longer supported. If the 'salt'
- option is used a warning is generated, the provided salt is ignored, and a
- generated salt is used instead.
- . The quotemeta() function will now return an empty string if an empty string
- was passed. Previously false was returned.
- . hebrevc() has been removed.
- . convert_cyr_string() has been removed.
- . money_format() has been removed.
- . ezmlm_hash() has been removed.
- . restore_include_path() has been removed.
- . get_magic_quotes_gpc() and get_magic_quotes_runtime() has been removed.
- . FILTER_SANITIZE_MAGIC_QUOTES has been removed.
- . Calling implode() with parameters in a reverse order ($pieces, $glue) is no
- longer supported.
- . parse_url() will now distinguish absent and empty queries and fragments:
-
- http://example.com/foo => query = null, fragment = null
- http://example.com/foo? => query = "", fragment = null
- http://example.com/foo# => query = null, fragment = ""
- http://example.com/foo?# => query = "", fragment = ""
-
- Previously all cases resulted in query and fragment being null.
- . var_dump() and debug_zval_dump() will now print floating-point numbers
- using serialize_precision rather than precision. In a default configuration,
- this means that floating-point numbers are now printed with full accuracy
- by these debugging functions.
- . If the array returned by __sleep() contains non-existing properties, these
- are now silently ignored. Previously, such properties would have been
- serialized as if they had the value NULL.
- . The default locale on startup is now always "C". No locales are inherited
- from the environment by default. Previously, LC_ALL was set to "C", while
- LC_CTYPE was inherited from the environment. However, some functions did not
- respect the inherited locale without an explicit setlocale() call. An
- explicit setlocale() call is now always required if you wish to change any
- locale component from the default.
- . Removed deprecated DES fallback in crypt(). If an unknown salt format is
- passed to crypt(), the function will fail with *0 instead of falling back
- to a weak DES hash now.
- . Specifying out of range rounds for sha256/sha512 crypt() will now fail with
- *0 instead of clamping to the closest limit. This matches glibc behavior.
- . The result of sorting functions may have changed, if the array contains
- elements that compare as equal.
- . Sort comparison functions that return true or false will now throw a
- deprecation warning, and should be replaced with an implementation
- that returns an integer less than, equal to, or greater than zero.
-
- // Replace
- usort($array, fn($a, $b) => $a > $b);
- // With
- usort($array, fn($a, $b) => $a <=> $b);
-
- . Any functions accepting callbacks that are not explicitly specified to
- accept parameters by reference will now warn if a callback with reference
- parameters is used. Examples include array_filter() and array_reduce().
- This was already the case for most, but not all, functions previously.
- . The HTTP stream wrapper as used by functions like file_get_contents()
- now advertises HTTP/1.1 rather than HTTP/1.0 by default. This does not
- change the behavior of the client, but may cause servers to respond
- differently. To retain the old behavior, set the 'protocol_version'
- stream context option, e.g.
-
- $ctx = stream_context_create(['http' => ['protocol_version' => '1.0']]);
- echo file_get_contents('http://example.org', false, $ctx);
- . Calling crypt() without an explicit salt is no longer supported. If you
- would like to produce a strong hash with an auto-generated salt, use
- password_hash() instead.
- . substr(), mb_substr(), iconv_substr() and grapheme_substr() now consistently
- clamp out-of-bounds offsets to the string boundary. Previously, false was
- returned instead of the empty string in some cases.
- . Populating $http_response_header variable by the HTTP stream wrapper
- doesn't force rebuilding of symbol table anymore.
-
-- Sysvmsg:
- . msg_get_queue() will now return an SysvMessageQueue object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
-
-- Sysvsem:
- . sem_get() will now return an SysvSemaphore object rather than a resource.
- Return value checks using is_resource() should be replaced with checks
- for `false`.
- . The $auto_release parameter of sem_get() was changed to accept bool values
- rather than int.
-
-- Sysvshm:
- . shm_attach() will now return an SysvSharedMemory object rather than a resource.
- Return value checks using is_resource() should be replaced with checks
- for `false`.
-
-- tidy:
- . The $use_include_path parameter, which was not used internally, has been
- removed from tidy_repair_string().
- . tidy::repairString() and tidy::repairFile() became static methods
-
-- Tokenizer:
- . T_COMMENT tokens will no longer include a trailing newline. The newline will
- instead be part of a following T_WHITESPACE token. It should be noted that
- T_COMMENT is not always followed by whitespace, it may also be followed by
- T_CLOSE_TAG or end-of-file.
- . Namespaced names are now represented using the T_NAME_QUALIFIED (Foo\Bar),
- T_NAME_FULLY_QUALIFIED (\Foo\Bar) and T_NAME_RELATIVE (namespace\Foo\Bar)
- tokens. T_NS_SEPARATOR is only used for standalone namespace separators,
- and only syntactially valid in conjunction with group use declarations.
- RFC: https://wiki.php.net/rfc/namespaced_names_as_token
-
-- XML:
- . xml_parser_create(_ns) will now return an XmlParser object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`. The xml_parser_free() function no longer has an effect,
- instead the XmlParser instance is automatically destroyed if it is no longer
- referenced.
-
-- XMLReader:
- . XMLReader::open() and XMLReader::xml() are now static methods. They still
- can be called dynamically, though, but inheriting classes need to declare
- them as static if they override these methods.
-
-- XMLWriter:
- . The XMLWriter functions now accept and return, respectively, XMLWriter
- objects instead of resources.
-
-- Zip:
- . ZipArchive::OPSYS_Z_CPM has been removed (this name was a typo). Use
- ZipArchive::OPSYS_CPM instead.
-
-- Zlib:
- . gzgetss() has been removed.
- . inflate_init() will now return an InflateContext object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . deflate_init() will now return a DeflateContext object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`.
- . zlib.output_compression is no longer automatically disabled for
- Content-Type: image/*.
-
========================================
2. New Features
========================================
-- Core:
- . Added support for union types.
- RFC: https://wiki.php.net/rfc/union_types_v2
- . Added WeakMap.
- RFC: https://wiki.php.net/rfc/weak_maps
- . Added ValueError class.
- . Any number of function parameters may now be replaced by a variadic
- argument, as long as the types are compatible. For example, the following
- code is now allowed:
-
- class A {
- public function method(int $many, string $parameters, $here) {}
- }
- class B extends A {
- public function method(...$everything) {}
- }
- . "static" (as in "late static binding") can now be used as a return type:
-
- class Test {
- public function create(): static {
- return new static();
- }
- }
-
- RFC: https://wiki.php.net/rfc/static_return_type
- . It is now possible to fetch the class name of an object using
- `$object::class`. The result is the same as `get_class($object)`.
- RFC: https://wiki.php.net/rfc/class_name_literal_on_object
- . New and instanceof can now be used with arbitrary expressions, using
- `new (expression)(...$args)` and `$obj instanceof (expression)`.
- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks
- . Some consistency fixes to variable syntax have been applied, for example
- writing `Foo::BAR::$baz` is now allowed.
- RFC: https://wiki.php.net/rfc/variable_syntax_tweaks
- . Added Stringable interface, which is automatically implemented if a class
- defines a __toString() method.
- RFC: https://wiki.php.net/rfc/stringable
- . Traits can now define abstract private methods.
- RFC: https://wiki.php.net/rfc/abstract_trait_method_validation
- . `throw` can now be used as an expression.
- RFC: https://wiki.php.net/rfc/throw_expression
- . An optional trailing comma is now allowed in parameter lists.
- RFC: https://wiki.php.net/rfc/trailing_comma_in_parameter_list
- . It is now possible to write `catch (Exception)` to catch an exception
- without storing it in a variable.
- RFC: https://wiki.php.net/rfc/non-capturing_catches
- . Added support for mixed type
- RFC: https://wiki.php.net/rfc/mixed_type_v2
- . Added support for Attributes
- RFC: https://wiki.php.net/rfc/attributes_v2
- RFC: https://wiki.php.net/rfc/attribute_amendments
- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax
- RFC: https://wiki.php.net/rfc/shorter_attribute_syntax_change
- . Added support for constructor property promotion (declaring properties in
- the constructor signature).
- RFC: https://wiki.php.net/rfc/constructor_promotion
- . Added support for `match` expression.
- RFC: https://wiki.php.net/rfc/match_expression_v2
- . Private methods declared on a parent class no longer enforce any
- inheritance rules on the methods of a child class. (with the exception of
- final private constructors)
- RFC: https://wiki.php.net/rfc/inheritance_private_methods
- . Added support for nullsafe operator (`?->`).
- RFC: https://wiki.php.net/rfc/nullsafe_operator
- . Added support for named arguments.
- RFC: https://wiki.php.net/rfc/named_params
-
-- Date:
- . Added DateTime::createFromInterface() and
- DateTimeImmutable::createFromInterface().
- . Added the DateTime format specifier "p" which is the same as "P" but
- returning "Z" for UTC.
-
-- Dom:
- . Introduce DOMParentNode and DOMChildNode with new traversal and
- manipulation APIs.
- RFC: https://wiki.php.net/rfc/dom_living_standard_api
-
-- Enchant:
- . enchant_dict_add()
- . enchant_dict_is_added()
- . LIBENCHANT_VERSION macro
-
-- FPM:
- . Added a new option pm.status_listen that allows getting status from
- different endpoint (e.g. port or UDS file) which is useful for getting
- status when all children are busy with serving long running requests.
-
-- Hash:
- . HashContext objects can now be serialized.
-
-- Opcache:
- . If the opcache.record_warnings ini setting is enabled, opcache will record
- compile-time warnings and replay them on the next include, even if it is
- served from cache.
-
-- OpenSSL:
- . Added Cryptographic Message Syntax (CMS) (RFC 5652) support composed of
- functions for encryption, decryption, signing, verifying and reading. The
- API is similar to the API for PKCS #7 functions with an addition of new
- encoding constants: OPENSSL_ENCODING_DER, OPENSSL_ENCODING_SMIME and
- OPENSSL_ENCODING_PEM.
-
-- Standard:
- . printf() and friends now support the %h and %H format specifiers. These
- are the same as %g and %G, but always use "." as the decimal separator,
- rather than determining it through the LC_NUMERIC locale.
- . printf() and friends now support using "*" as width or precision, in which
- case the width/precision is passed as an argument to printf. This also
- allows using precision -1 with %g, %G, %h and %H. For example, the following
- code can be used to reproduce PHP's default floating point formatting:
-
- printf("%.*H", (int) ini_get("precision"), $float);
- printf("%.*H", (int) ini_get("serialize_precision"), $float);
+- hash:
+ . Added MurmurHash3 with streaming support. The following variants are implemented
- . proc_open() now supports pseudo-terminal (PTY) descriptors. The following
- attaches stdin, stdout and stderr to the same PTY:
-
- $proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
-
- . proc_open() now supports socket pair descriptors. The following attaches
- a distinct socket pair to stdin, stdout and stderr:
-
- $proc = proc_open(
- $command, [['socket'], ['socket'], ['socket']], $pipes);
-
- Unlike pipes, sockets do not suffer from blocking I/O issues on Windows.
- However, not all programs may work correctly with stdio sockets.
- . Sorting functions are now stable, which means that equal-comparing elements
- will retain their original order.
- RFC: https://wiki.php.net/rfc/stable_sorting
- . array_diff(), array_intersect() and their variations can now be used with
- a single array as argument. This means that usages like the following are
- now possible:
-
- // OK even if $excludes is empty.
- array_diff($array, ...$excludes);
- // OK even if $arrays only contains a single array.
- array_intersect(...$arrays);
- . The $flag parameter of ob_implicit_flush() was changed to accept bool
- values rather than int.
-
-- Zip:
- . Extension updated to version 1.19.1
- . New ZipArchive::lastId property to get index value of last added entry.
- . Error can be checked after an archive is closed using ZipArchive::status,
- ZipArchive::statusSys properties or ZipArchive::getStatusString() method.
- . The remove_path option of ZipArchive::addGlob() and ::addPattern() is now
- treated as arbitrary string prefix (for consistency with the add_path
- option), whereas formerly it was treated as directory name.
- . Optional compression / encryption features are listed in phpinfo.
+ - murmur3a, 32-bit hash
+ - murmur3c, 128-bit hash for x86
+ - murmur3f, 128-bit hash for x64
========================================
3. Changes in SAPI modules
========================================
-- Apache:
- . The PHP module has been renamed from php7_module to php_module.
-
========================================
4. Deprecated Functionality
========================================
-- Core:
- . Declaring a required parameter after an optional one is deprecated. As an
- exception, declaring a parameter of the form "Type $param = null" before
- a required one continues to be allowed, because this pattern was sometimes
- used to achieve nullable types in older PHP versions.
-
- function test($a = [], $b) {} // Deprecated
- function test(Foo $a = null, $b) {} // Allowed
- . Calling get_defined_functions() with $exclude_disabled explicitly set to
- false is deprecated. get_defined_functions() will never include disabled
- functions.
-
-- Enchant:
- . enchant_broker_set_dict_path and enchant_broker_get_dict_path
- not available in libenchant < 1.5 nor in libenchant-2
- . enchant_dict_add_to_personal, use enchant_dict_add instead
- . enchant_dict_is_in_session, use enchant_dict_is_added instead
- . enchant_broker_free and enchant_broker_free_dict, unset the object instead
- . ENCHANT_MYSPELL and ENCHANT_ISPELL constants
-
-- LibXML:
- . libxml_disable_entity_loader() has been deprecated. As libxml 2.9.0 is now
- required, external entity loading is guaranteed to be disabled by default,
- and this function is no longer needed to protect against XXE attacks.
-
-- PGSQL / PDO PGSQL:
- . The constant PG_VERSION_STR has now the same value as PG_VERSION, and thus
- is deprecated.
- . Function aliases in the pgsql extension have been deprecated.
-
-- Zip:
- . Using empty file as ZipArchive is deprecated. Libzip 1.6.0
- do not accept empty files as valid zip archives any longer.
- Existing workaround will be removed in next version.
- . The procedural API of Zip is deprecated. Use ZipArchive instead.
-
-- Reflection:
- . ReflectionFunction::isDisabled() is deprecated, as it is no longer possible
- to create a ReflectionFunction for a disabled function. This method now
- always returns false.
- . ReflectionParameter::getClass(), ReflectionParameter::isArray(), and
- ReflectionParameter::isCallable() are deprecated.
- ReflectionParameter::getType() and the ReflectionType APIs should be used
- instead.
-
========================================
5. Changed Functions
========================================
-- Reflection:
- . ReflectionClass::getConstants and ReflectionClass::getReflectionConstants results
- can be now filtered via a new parameter `$filter`. 3 new constants were added to
- be used with it:
-
- ReflectionClassConstant::IS_PUBLIC
- ReflectionClassConstant::IS_PROTECTED
- ReflectionClassConstant::IS_PRIVATE
-
-- Zip
- . ZipArchive::addGlob and ZipArchive::addPattern methods accept more
- values in the "options" array argument:
- . flags
- . comp_method
- . comp_flags
- . env_method
- . enc_password
- . ZipArchive::addEmptyDir, ZipArchive::addFile and aZipArchive::addFromString
- methods have a new "flags" argument. This allows managing name encoding
- (ZipArchive::FL_ENC_*) and entry replacement (ZipArchive::FL_OVERWRITE)
- . ZipArchive::extractTo now restore file modification time.
-
========================================
6. New Functions
========================================
-- Core:
- . Added get_resource_id($resource) function, which returns the same value as
- (int) $resource. It provides the same functionality under a clearer API.
-
-- LDAP:
- . Added ldap_count_references(), which returns the number of reference
- messages in a search result.
-
-- OpenSSL:
- . Added openssl_cms_encrypt() encrypts the message in the file with the
- certificates and outputs the result to the supplied file.
- . Added openssl_cms_decrypt() that decrypts the S/MIME message in the file
- and outputs the results to the supplied file.
- . Added openssl_cms_read() that exports the CMS file to an array of PEM
- certificates.
- . Added openssl_cms_sign() that signs the MIME message in the file with
- a cert and key and output the result to the supplied file.
- . Added openssl_cms_verify() that verifies that the data block is intact,
- the signer is who they say they are, and returns the certs of the signers.
-
-- PCRE:
- . Added preg_last_error_msg(), which returns a human-readable message for
- the last PCRE error. It complements preg_last_error(), which returns an
- integer enum instead.
-
-- SQLite3:
- . Add SQLite3::setAuthorizer() and respective class constants to set a
- userland callback that will be used to authorize or not an action on the
- database.
- PR: https://github.com/php/php-src/pull/4797
-
-- Standard:
- . Added
-
- str_contains(string $haystack, string $needle): bool
- str_starts_with(string $haystack, string $needle): bool
- str_ends_with(string $haystack, string $needle): bool
-
- functions, which check whether $haystack contains, starts with or ends with
- $needle.
- RFC: https://wiki.php.net/rfc/str_contains
- RFC: https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions
- . Added fdiv() function, which performs a floating-point division under
- IEEE 754 semantics. Division by zero is considered well-defined and
- will return one of Inf, -Inf or NaN.
- . Added get_debug_type() function, which returns a type useful for error
- messages. Unlike gettype(), it uses canonical type names, returns class
- names for objects, and indicates the resource type for resources.
- RFC: https://wiki.php.net/rfc/get_debug_type
-
-- Zip:
- . ZipArchive::setMtimeName and ZipArchive::setMtimeIndex to set the
- modification time of an entry.
- . ZipArchive::setProgressCallback to provide updates during archive close.
- . ZipArchive::setCancelCallback to allow cancellation during archive close.
- . ZipArchive::replaceFile to replace an entry content.
- . ZipArchive::isCompressionMethodSupported to check optional compression
- features.
- . ZipArchive::isEncryptionMethodSupported to check optional encryption
- features.
-
========================================
7. New Classes and Interfaces
========================================
-- Tokenizer:
- . The new PhpToken class adds an object-based interface to the tokenizer.
- It provides a more uniform and ergonomic representation, while being more
- memory efficient and faster.
- RFC: https://wiki.php.net/rfc/token_as_object
-
========================================
8. Removed Extensions and SAPIs
========================================
-- XML-RPC:
- . The xmlrpc extension has been unbundled and moved to PECL.
- RFC: https://wiki.php.net/rfc/unbundle_xmlprc
-
========================================
9. Other Changes to Extensions
========================================
-- CURL:
- . The CURL extension now requires at least libcurl 7.29.0.
- . curl_init() will now return a CurlHandle object rather than a resource.
- Return value checks using is_resource() should be replaced with
- checks for `false`. The curl_close() function no longer has an effect,
- instead the CurlHandle instance is automatically destroyed if it is no
- longer referenced.
- . curl_multi_init() will now return a CurlMultiHandle object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`. The curl_multi_close() function no longer has an effect,
- instead the CurlMultiHandle instance is automatically destroyed if it is no
- longer referenced.
- . curl_share_init() will now return a CurlShareHandle object rather than a
- resource. Return value checks using is_resource() should be replaced with
- checks for `false`. The curl_share_close() function no longer has an effect,
- instead the CurlShareHandle instance is automatically destroyed if it is no
- longer referenced.
- . The deprecated parameter `$version` of curl_version() has been removed.
-
-- Date:
- . DatePeriod now implements IteratorAggregate (instead of Traversable).
-
-- DOM:
- . DOMNamedNodeMap now implements IteratorAggregate (instead of Traversable).
- . DOMNodeList now implements IteratorAggregate (instead of Traversable).
-
-- Intl:
- . IntlBreakIterator now implements IteratorAggregate (instead of Traversable).
- . ResourceBundle now implements IteratorAggregate (instead of Traversable).
-
-- Enchant:
- . The enchant extension now uses libenchant-2 by default when available.
- libenchant version 1 is still supported but is deprecated and could
- be removed in the future.
-
-- GD:
- . The $num_points parameter of imagepolygon(), imageopenpolygon() and
- imagefilledpolygon() is now optional, i.e. these functions may be called
- with either 3 or 4 arguments. If the arguments is omitted, it is calculated
- as count($points)/2.
- . The function imagegetinterpolation() to get the current interpolation method
- has been added.
-
-- JSON:
- . The JSON extension cannot be disabled anymore and is always an integral part
- of any PHP build, similar to the date extension.
-
-- MBString:
- . The Unicode data tables have been updated to version 13.0.0.
-
-- PDO:
- . PDOStatement now implements IteratorAggregate (instead of Traversable).
-
-- LibXML:
- . The minimum required libxml version is now 2.9.0. This means that external
- entity loading is now guaranteed to be disabled by default, and no extra
- steps need to be taken to protect against XXE attacks.
-
-- MySQLi / PDO MySQL:
- . When mysqlnd is not used (which is the default and recommended option),
- the minimum supported libmysqlclient version is now 5.5.
- . mysqli_result now implements IteratorAggregate (instead of Traversable).
-
-- PGSQL / PDO PGSQL:
- . The PGSQL and PDO PGSQL extensions now require at least libpq 9.1.
-
-- Readline:
- . Calling readline_completion_function() before the interactive prompt starts
- (e.g. in auto_prepend_file) will now override the default interactive prompt
- completion function. Previously, readline_completion_function() only worked
- when called after starting the interactive prompt.
-
-- SimpleXML:
- . SimpleXMLElement now implements RecursiveIterator and absorbed the
- functionality of SimpleXMLIterator. SimpleXMLIterator is an empty extension
- of SimpleXMLElement.
-
-- Shmop:
- . shmop_open() will now return a Shmop object rather than a resource. Return
- value checks using is_resource() should be replaced with checks for `false`.
- The shmop_close() function no longer has an effect, and is deprecated;
- instead the Shmop instance is automatically destroyed if it is no longer
- referenced.
+- OpenSSL:
+ . The OpenSSL extension now requires at least OpenSSL version 1.0.2.
========================================
10. New Global Constants
========================================
-- Filter:
- . FILTER_VALIDATE_BOOL has been added as an alias for FILTER_VALIDATE_BOOLEAN.
- The new name is preferred, as it uses the canonical type name.
-
========================================
11. Changes to INI File Handling
========================================
-- zend.exception_string_param_max_len
- . New INI directive to set the maximum string length in an argument of a
- stringified stack strace.
-
-- com.dotnet_version
- . New INI directive to choose the version of the .NET framework to use for
- dotnet objects.
-
========================================
12. Windows Support
========================================
-- Standard:
- . Program execution functions (proc_open(), exec(), popen() etc.) using the
- shell now consistently execute `%comspec% /s /c "$commandline"`, which has
- the same effect as executing `$commandline` (without additional quotes).
-
-- GD:
- . php_gd2.dll has been renamed to php_gd.dll.
-
-- php-test-pack:
- . The test runner has been renamed from run-test.php to run-tests.php, to
- match its name in php-src.
+. The macro IGNORE_URL_WIN has been removed; it had no effect as of PHP 5.0.0.
========================================
13. Other Changes
========================================
-- EBCDIC targets are no longer supported, though it's unlikely that they were
- still working in the first place.
-
========================================
14. Performance Improvements
========================================
-
-- A Just-In-Time (JIT) compiler has been added to the opcache extension.
-- array_slice() on an array without gaps will no longer scan the whole array to
- find the start offset. This may significantly reduce the runtime of the
- function with large offsets and small lengths.
-- strtolower() now uses a SIMD implementation when using the "C" LC_CTYPE
- locale (which is the default).
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index c15cbef3b1..3e2aeb70a4 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -1,35 +1,8 @@
-PHP 8.0 INTERNALS UPGRADE NOTES
+PHP 8.1 INTERNALS UPGRADE NOTES
1. Internal API changes
- a. Object Handlers API
- b. ZEND_OVERLOADED_FUNCTION and corresponding call_method() object handler
- c. TSRM changes
- d. get() and set() object handlers
- e. zend_parse_parameters 'L' specifier
- f. Arginfo argument types
- g. zend_free_op type and should_free argument of zend_get_zval_ptr()
- h. zend_value_error()
- i. get_closure() object handler
- j. compare_objects() and compare() object handlers
- k. The 'I' length modifier
- l. Some VM instructions switched to IS_TMP_VAR result instead of IS_VAR
- m. All internal functions must have arginfo
- n. zend_hash_sort compare function and zend_hash_sort signature change
- o. cast_object() object handler is now required
- p. ARG_COUNT() macro removed
- q. GC_COLLECTABLE flag
- r. Cannot implement Traversable only
- s. zend_fcall_info no_separation flag removed
- t. Signature changes
- u. Error Notification callbacks to replace zend_error_cb overwrite use-cases
- v. Removed Zend APIs
- w. Renamed Zend APIs
- x. ZEND_EXT_NOP no longer emitted
2. Build system changes
- a. Abstract
- b. Unix build system changes
- c. Windows build system changes
3. Module changes
@@ -37,425 +10,10 @@ PHP 8.0 INTERNALS UPGRADE NOTES
1. Internal API changes
========================
- a. The Object Handlers API was changed to receive zend_object* instead of
- zval* and zend_string* instead of zval* for property names. See also
- section t for other similar changes.
-
- b. ZEND_OVERLOADED_FUNCTION and corresponding call_method() object handler
- were removed. ZEND_INTERNAL_FUNCTION with ZEND_ACC_CALL_VIA_HANDLER and
- defined "handler" callback should be used instead. This "handler" callback
- should also take care about function cleanup. See ext/zend_test/test.c
- for example.
-
- c. The following things have been removed from TSRM:
- - TSRMLS_DC
- - TSRMLS_D
- - TSRMLS_CC
- - TSRMLS_C
- - TSRMLS_FETCH
- - TSRMLS_FETCH_FROM_CTX
- - TSRMLS_SET_CTX
- - tsrm_new_interpreter_context
- - tsrm_set_interpreter_context
- - tsrm_free_interpreter_context
- - support for GNUPTH, SGI ST, and BETHREADS
-
- d. The get() and set() object handlers have been removed. The get() handler
- can generally be replaced with cast_object(). Some uses of set() may be
- replaced by do_operation(). If set() was used to overload direct
- assignments using "=", then this is no longer supported and the
- functionality should be provided in some other way (for example, as
- modification of an object property).
-
- e. The zend_parse_parameters 'L' specifier and the Z_PARAM_STRICT_LONG()
- family of macros have been removed. Use 'l' and Z_PARAM_LONG() instead,
- which, despite the confusing name, actually have stricter input validation.
-
- f. Arginfo argument types for internal functions are no longer checked.
- Instead type checks should be performed using the zend_parse_parameters()
- or ZEND_PARSE_PARAMETERS_*() APIs.
-
- g. The zend_free_op type and the "should_free" and "type" arguments of
- zend_get_zval_ptr() were removed. It's possible to get the old
- "should_free" value using the following code:
-
- zval *ret = zend_get_zval_ptr(
- opline, opline->op1_type, &opline->op1, execute_data);
- zval *should_free = (op_type & (IS_TMP_VAR|IS_VAR)) ? ret : NULL;
-
- h. Added the zend_value_error() function, which is intended to be used
- to raise ValueError when inappropriate argument values are passed
- to functions.
-
- i. get_closure() object handlers now accept an additional zend_bool parameter
- `check_only`. If it is true, the handler is called to check whether the
- object is callable; in this case the handler should not throw an exception.
-
- j. compare_objects() handler was removed. Extensions should use compare() object
- handler instead and check if both arguments are objects and have the same
- compare handler, using ZEND_COMPARE_OBJECTS_FALLBACK() macro.
-
- k. The 'I' length modifier, used to denote 32 and 64bit integer from the custom
- snprintf and spprintf implementations has been removed.
- Use the ZEND_LONG_FMT, ZEND_ULONG_FMT and ZEND_XLONG_FMT macros defined in
- php-src/Zend/zend_long.h
-
- The 'v' format from the custom snprintf and spprintf implementations has
- been removed. Use the standard 's' format instead.
-
- l. Some VM instructions switched to IS_TMP_VAR result instead of IS_VAR.
- Actually, all assignments (ZEND_ASSIGN, ZEND_ASSIGN_DIM, ZEND_ASSIGN_OBJ,
- ZEND_ASSIGN_STATIC_PROP), all compound assignments (ZEND_ASSIGN_OP,
- ZEND_ASSIGN_DIM_OP, ZEND_ASSIGN_OBJ_OP, ZEND_ASSIGN_STATIC_PROP_OP) and all
- pre increments/decrements (ZEND_PRE_INC, ZEND_PRE_DEC, ZEND_PRE_INC_OBJ
- ZEND_PRE_DEC_OBJ, ZEND_PRE_INC_STATIC_PROP ZEND_PRE_DEC_STATIC_PROP).
-
- m. All internal functions and methods are now required to specify arginfo
- information, otherwise warnings will be thrown on startup.
-
- n. The zend_hash_sort and zend_hash_minmax APIs now accept a comparison
- function with the following signature:
-
- typedef int (*bucket_compare_func_t)(Bucket *a, Bucket *b);
-
- Previously compare_func_t was used, which accepted void pointers.
- Furthermore, the return type of zend_hash_sort and zend_ts_hash_sort has
- been changed from int to void; these functions always succeed.
-
- o. The cast_object() handler is now required, i.e. must be non-null. You can
- indicate that casting is not supported by always returning FAILURE.
-
- p. The ARG_COUNT() macro has been removed use ZEND_NUM_ARGS() instead.
-
- q. GC_COLLECTABLE flag was inverted into GC_NOT_COLLECTABLE.
- Assignments to GC_TYPE_INFO() might need to be changed to properly
- set the value of the GC_NOT_COLLECTABLE flag.
-
- r. Just for for userland classes, it is no longer allowed to implement only
- the Traversable interface. Instead, it is necessary to implement either
- Iterator or IteratorAggregate. You can do the latter by implementing
- zend_ce_aggregate and providing the following method implementation:
-
- ZEND_METHOD(MyClass, getIterator) {
- ZEND_PARSE_PARAMETERS_NONE();
- zend_create_internal_iterator_zval(return_value, ZEND_THIS);
- }
-
- s. The zend_fcall_info no_separation flag has been removed, and separation is
- never allowed. If you wish to pass (or allow passing) arguments by
- reference, explicitly create those arguments as references using
- ZEND_MAKE_REF. This removal also affects call_user_function_ex(), which
- should be replaced by call_user_function().
-
- t. The following ZEND_API function have changed signature:
- 1. Void in Zend Engine 4.0:
- - add_assoc_*()
- - add_index_*()
- - add_property_*()
- - object_init()
- - zend_declare_class_constant*()
- - zend_declare_property*()
- - zend_startup_modules()
- - zend_wrong_parameters_none_error()
- - zend_fcall_info_argp()
- - zend_fcall_info_argv()
- - zend_fcall_info_argn()
- - zend_startup()
- - zend_set_memory_limit()
- - pass_two()
- - zend_startup_constants()
- - zend_shutdown_constants()
- - zend_startup_extensions_mechanism()
- - zend_startup_extensions()
- - zend_register_extension()
- - highlight_string()
- - zend_ini_startup()
- - zend_ini_shutdown()
- - zend_ini_global_shutdown()
- - zend_ini_deactivate()
- - zend_copy_ini_directives()
- - zend_prepare_string_for_scanning()
- - zend_init_rsrc_list()
- - zend_list_close()
- - zend_signal()
- - zend_sigaction()
- - zend_stack_init()
- - zend_stack_del_top()
- - zend_stack_destroy()
- 2. Argument int to uint32_t in Zend Engine 4.0:
- - _zend_get_parameters_array_ex()
- - zend_copy_parameters_array()
- - zend_fcall_info_args_save()
- - zend_fcall_info_args_restore()
- - zend_fcall_info_argp()
- - zend_fcall_info_argv()
- - zend_fcall_info_argn()
- - zend_wrong_parameter*()
- - zend_wrong_callback_error()
- - zend_parse_arg_class()
- 3. Argument int to bool in Zend Engine 4.0:
- - add_next_index_bool()
- - zend_register_class_alias_ex()
- - add_assoc_bool_ex()
- - add_index_bool()
- - zend_fcall_info_args_clear()
- - zend_set_local_var()
- - zend_set_local_var_str()
- - zend_parse_arg_*()
- - shutdown_memory_manager()
- - zend_memory_usage()
- - zend_memory_peak_usage()
- - zend_mm_shutdown()
- - zend_eval_string*()
- - zend_set_timeout()
- - _zend_hash_append_ex()
- - _zend_hash_append_ptr_ex()
- - zend_alter_ini_entry_ex()
- - (*zend_encoding_list_parser) typedef
- - zend_multibyte_parse_encoding_list()
- - zend_safe_address()
- - zend_string_tolower_ex()
- - zend_string_alloc()
- - zend_string_safe_alloc()
- - zend_string_init()
- - zend_string_dup()
- - zend_string_realloc()
- - zend_string_extend()
- - zend_string_truncate()
- - zend_string_safe_realloc()
- - zend_string_release_ex()
- - zend_ts_hash_merge()
- - zend_ts_hash_sort()
- 4. Argument int to size_t in Zend Engine 4.0:
- - zend_set_hash_symbol()
- 5. Argument zval* to zend_object* in Zend Engine 4.0:
- - zend_read_property()
- - zend_update_property()
- - zend_unset_property()
- - zend_call_method()
- - zend_objects_clone_obj()
- - zend_get_closure_method_def()
- - zend_throw_exception_hook()
- - zend_throw_exception_internal()
- - zend_get_exception_base()
- 6. Argument zval* to zend_long in Zend Engine 4.0:
- - _php_math_longtobase()
- 7. Return type from int to zend_result in Zend Engine 4.0:
- - (*stream_open_function) in _zend_utility_functions
- - (*zend_post_startup_cb)
- - (*zend_preload_autoload)
- - zend_execute_scripts()
- - zend_post_startup()
- - _zend_get_parameters_array_ex()
- - zend_copy_parameters_array()
- - zend_parse_parameters()
- - zend_parse_parameters_ex()
- - zend_parse_method_parameters()
- - zend_parse_method_parameters_ex()
- - zend_parse_method_parameters()
- - zend_register_functions()
- - zend_startup_module()
- - zend_startup_module_ex()
- - zend_register_class_alias_ex()
- - zend_disable_function()
- - zend_disable_class()
- - zend_update_class_constants()
- - zend_update_static_property*()
- - object_init_ex()
- - object_and_properties_init()
- - add_index_zval()
- - add_next_index_long_*()
- - array_set_zval_key()
- - _call_user_function_impl()
- - zend_fcall_info_*()
- - zend_call_function()
- - zend_set_hash_symbol()
- - zend_delete_global_variable()
- - zend_set_local_var()
- - zend_set_local_var_str()
- - zend_forbid_dynamic_call()
- - zend_get_default_from_internal_arg_info()
- - zend_try_assign_typed_ref*()
- - zend_ast_evaluate()
- - zend_startup_builtin_functions()
- - do_bind_function()
- - do_bind_class()
- - zend_unmangle_property_name_ex()
- - zend_register_auto_global()
- - zend_register_constant()
- - zend_exception_error()
- - zend_eval_string*()
- - zend_undefined_offset_write()
- - zend_undefined_index_write()
- - zval_update_constant(_ex)()
- - zend_load_extension()
- - zend_load_extension_handle()
- - zend_hash_del(_ind)()
- - zend_hash_str_del(_ind)()
- - zend_hash_index_del()
- - zend_hash_move_forward_ex()
- - zend_hash_move_backward_ex()
- - zend_hash_get_current_key_ex()
- - zend_hash_get_current_key_type_ex()
- - zend_symtable_del(_ind)()
- - zend_symtable_str_del(_ind)()
- - highlight_file()
- - zend_do_link_class()
- - zend_alter_ini_entry*()
- - zend_restore_ini_entry()
- - zend_ini_register_displayer()
- - zend_ini_open_file_for_scanning()
- - zend_ini_prepare_string_for_scanning()
- - zend_user_it_valid()
- - zend_create_internal_iterator_zval()
- - zend_multibyte_set_filter()
- - zend_lex_tstring()
- - _zend_module_entry module_startup_func, module_shutdown_func,
- request_startup_func, request_shutdown_func, and post_deactivate_func function pointers
- - (*zend_encoding_list_parser) typedef
- - (*zend_encoding_internal_encoding_setter) typedef
- - zend_multibyte_set_functions()
- - zend_multibyte_set_script_encoding_by_string()
- - add_function()
- - sub_function()
- - mul_function()
- - pow_function()
- - div_function()
- - mod_function()
- - boolean_xor_function()
- - boolean_not_function()
- - bitwise_not_function()
- - bitwise_or_function()
- - bitwise_and_function()
- - bitwise_xor_function()
- - shift_left_function()
- - shift_right_function()
- - concat_function()
- - is_equal_function(
- - is_identical_function()
- - is_not_identical_function()
- - is_not_equal_function()
- - is_smaller_function()
- - is_smaller_or_equal_function(zv
- - increment_function()
- - decrement_function()
- - zend_stream_open()
- - zend_stream_fixup()
- - zend_ts_hash_del()
- - zend_ts_hash_index_del()
- 8. Return type from int to bool in Zend Engine 4.0:
- - zend_make_printable_zval()
- - zend_parse_arg_*()
- - is_zend_mm()
- - is_zend_ptr()
- - zend_mm_is_custom_heap()
- - (*zend_mm_chunk_truncate_t)
- - (*zend_mm_chunk_extend_t)
- - zend_bitset_empty()
- - zend_is_smart_branch()
- - zend_check_arg_send_type()
- - zend_verify_const_access()
- - zend_gdb_register_code()
- - zend_gdb_present()
- - _zend_handle_numeric_str(_ex)()
- - zend_hash_exists_ind()
- - zend_hash_str_exists_ind()
- - zend_symtable_exists(_ind)()
- - zend_symtable_str_exists()
- - (*zend_encoding_lexer_compatibility_checker)
- - zend_object_is_true()
- - i_zend_is_true()
- - zendi_smart_streq()
- - zend_stack_is_empty()
- - zend_ts_hash_exists()
- - zend_ts_hash_index_exists()
- 9. Argument void to const char* in Zend Engine 4.0:
- - zend_get_op_array_extension_handle()
- 10. Argument zend_extension to const char* in Zend Engine 4.0:
- - zend_get_resource_handle()
- 11. Argument const char * to HMODULE in Zend Engine 4.0:
- - php_win32_image_compatible()
- 12. const char * argument dropped in Zend Engine 4.0:
- - php_win32_crt_compatible()
-
- u. Instead of overwriting zend_error_cb extensions with debugging, monitoring
- use-cases catching Errors/Exceptions are strongly encouraged to use
- the new error observer API instead.
-
- Error observering callbacks are guaranteed to be called regardless of
- the users error_reporting setting or userland error handler return values.
-
- Register observer callbacks during MINIT of an extension:
-
- void my_error_observer_cb(int type,
- const char *error_filename,
- uint32_t error_lineno,
- zend_string *message) {
- }
- zend_observer_error_register(my_error_observer_cb);
-
- v. The following APIs have been removed from the Zend Engine:
- - zend_ts_hash_init_ex(), drop the last argument and use zend_ts_hash_init() instead
- - zend_hash_init_ex(), drop the last argument and use zend_hash_init() instead
- - zval_internal_dtor(), use zval_internal_ptr_dtor() instead
- - zval_dtor_func(), use rc_dtor_func() instead
- - zval_ptr_dtor_wrapper(), use zval_ptr_dtor() instead
- - zval_internal_ptr_dtor_wrapper(), use zval_internal_ptr_dtor() instead
-
- w. The following APIs have been renamed:
- - _zend_ts_hash_init() to zend_ts_hash_init()
-
- x. In COMPILE_EXTENDED_STMT mode, a ZEND_EXT_NOP opcode will no longer be
- generated at the start of a function. Use the new observer APIs or hook
- into zend_execute_ex instead.
-
========================
2. Build system changes
========================
- a. Abstract
- 1. Symbol HAVE_HASH_EXT is removed and is no longer defined. It should be
- considered to have hash extension always available since PHP 7.4.
-
- 2. Symbol HAVE_PCRE is removed and is no longer defined. It should be
- considered to have pcre extension always available since PHP 7.4.
-
- 3. Symbol HAVE_LOCALE_H has been removed and is no longer defined.
-
- 4. --disable-inline-optimization (which actually disabled all compiler
- optimizations) has been removed. If you wish to build PHP on a host
- with extremely constrained memory, and compilation fails with an "out
- of memory" message, add "-O0" to CFLAGS.
-
- 5. build system and provider are displayed in phpinfo from environment:
- - PHP_BUILD_SYSTEM (default is same as PHP_UNAME)
- - PHP_BUILD_PROVIDER (no default)
-
- b. Unix build system changes
-
- 1. --enable-maintainer-zts is renamed --enable-zts for parity with Windows
- and as recognition that ZTS is not a "maintainer" or experimental
- feature.
-
- 2. The PHP_CHECK_GCC_ARG() m4 macro has been removed in favor of
- AX_CHECK_COMPILE_FLAG().
-
- 3. The 6th argument of PHP_ADD_SOURCES_X has been removed.
-
- 4. The 'special-flags' (3rd) argument of PHP_ADD_SOURCES_X are
- now appended instead of prepended to previous compiler flags.
- This means compiler flags passed to PHP_NEW_EXTENSION and PHP_ADD_SOURCES
- are now appended, this allows to disable compiler flags set by Zend/Zend.m4
- (e.g. disable certain compiler flags enabled by -Wextra)
-
- c. Windows build system changes
-
- - The configuration option --enable-crt-debug has been removed. The VC
- debug heap can now be enabled for debug builds by setting the environment
- variable PHP_WIN32_DEBUG_HEAP to a non-negative number before PHP process
- startup.
-
========================
3. Module changes
========================
-
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index 7261885974..0a9170709d 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -215,6 +215,10 @@ fi
test -n "$GCC" && CFLAGS="-Wall -Wextra -Wno-strict-aliasing -Wno-implicit-fallthrough -Wno-unused-parameter -Wno-sign-compare $CFLAGS"
dnl Check if compiler supports -Wno-clobbered (only GCC)
AX_CHECK_COMPILE_FLAG([-Wno-clobbered], CFLAGS="-Wno-clobbered $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-Wduplicated-cond], CFLAGS="-Wduplicated-cond $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-Wlogical-op], CFLAGS="-Wlogical-op $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-Wformat-truncation], CFLAGS="-Wformat-truncation $CFLAGS", , [-Werror])
+AX_CHECK_COMPILE_FLAG([-fno-common], CFLAGS="-fno-common $CFLAGS", , [-Werror])
test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS"
diff --git a/Zend/tests/multibyte/multibyte_encoding_001.phpt b/Zend/tests/multibyte/multibyte_encoding_001.phpt
index 3b26dcb989..f95b4311a9 100644
--- a/Zend/tests/multibyte/multibyte_encoding_001.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_001.phpt
@@ -13,7 +13,7 @@ internal_encoding=SJIS
<?php
declare(encoding='Shift_JIS');
$s = "•\"; // 0x95+0x5c in script, not somewhere else "
-printf("%x:%x\n", ord($s[0]), ord($s[1]));
+printf("%x:%x", ord($s[0]), ord($s[1]));
?>
--EXPECT--
95:5c
diff --git a/Zend/tests/multibyte/multibyte_encoding_003.phpt b/Zend/tests/multibyte/multibyte_encoding_003.phpt
index a0983329f4..f0fb60f6cd 100644
--- a/Zend/tests/multibyte/multibyte_encoding_003.phpt
+++ b/Zend/tests/multibyte/multibyte_encoding_003.phpt
Binary files differ
diff --git a/Zend/zend.h b/Zend/zend.h
index c10fadd0d0..f5d352cfe4 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -20,7 +20,7 @@
#ifndef ZEND_H
#define ZEND_H
-#define ZEND_VERSION "4.0.0-dev"
+#define ZEND_VERSION "4.1.0-dev"
#define ZEND_ENGINE_3
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 290db040b2..c095992d12 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -1314,6 +1314,7 @@ ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *
} while (0)
#define ZEND_PARSE_PARAMETERS_END_EX(failure) \
+ ZEND_ASSERT(_i == _max_num_args || _max_num_args == (uint32_t) -1); \
} while (0); \
if (UNEXPECTED(_error_code != ZPP_ERROR_OK)) { \
if (!(_flags & ZEND_PARSE_PARAMS_QUIET)) { \
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index ab96d43c4c..62cee34452 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -155,8 +155,8 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
return variable_ptr;
}
-ZEND_API zend_result zval_update_constant(zval *pp);
-ZEND_API zend_result zval_update_constant_ex(zval *pp, zend_class_entry *scope);
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant(zval *pp);
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *pp, zend_class_entry *scope);
/* dedicated Zend executor functions - do not use! */
struct _zend_vm_stack {
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 4248212238..8fb85f0d2f 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -610,7 +610,7 @@ ZEND_API zend_bool zend_is_executing(void) /* {{{ */
}
/* }}} */
-ZEND_API zend_result zval_update_constant_ex(zval *p, zend_class_entry *scope) /* {{{ */
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *p, zend_class_entry *scope) /* {{{ */
{
if (Z_TYPE_P(p) == IS_CONSTANT_AST) {
zend_ast *ast = Z_ASTVAL_P(p);
@@ -638,7 +638,7 @@ ZEND_API zend_result zval_update_constant_ex(zval *p, zend_class_entry *scope) /
}
/* }}} */
-ZEND_API zend_result zval_update_constant(zval *pp) /* {{{ */
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant(zval *pp) /* {{{ */
{
return zval_update_constant_ex(pp, EG(current_execute_data) ? zend_get_executed_scope() : CG(active_class_entry));
}
diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index 9f96d3b0fa..3f330d2a2c 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -44,7 +44,7 @@ You can use the following macro to check the extension API version for compatibi
/* The first number is the engine version and the rest is the date (YYYYMMDD).
* This way engine 2/3 API no. is always greater than engine 1 API no.. */
-#define ZEND_EXTENSION_API_NO 420200930
+#define ZEND_EXTENSION_API_NO 420201009
typedef struct _zend_extension_version_info {
int zend_extension_api_no;
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 68c1865c00..6973ad1020 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -165,14 +165,14 @@ static void zend_generator_remove_child(zend_generator_node *node, zend_generato
{
ZEND_ASSERT(node->children >= 1);
if (node->children == 1) {
- node->child.single.child = NULL;
+ node->child.single = NULL;
} else {
HashTable *ht = node->child.ht;
zend_hash_index_del(ht, (zend_ulong) child);
if (node->children == 2) {
zend_generator *other_child;
ZEND_HASH_FOREACH_PTR(ht, other_child) {
- node->child.single.child = other_child;
+ node->child.single = other_child;
break;
} ZEND_HASH_FOREACH_END();
zend_hash_destroy(ht);
@@ -479,13 +479,13 @@ static void zend_generator_add_child(zend_generator *generator, zend_generator *
zend_generator_node *node = &generator->node;
if (node->children == 0) {
- node->child.single.child = child;
+ node->child.single = child;
} else {
if (node->children == 1) {
HashTable *ht = emalloc(sizeof(HashTable));
zend_hash_init(ht, 0, NULL, NULL, 0);
zend_hash_index_add_new_ptr(ht,
- (zend_ulong) node->child.single.child, node->child.single.child);
+ (zend_ulong) node->child.single, node->child.single);
node->child.ht = ht;
}
@@ -524,7 +524,7 @@ ZEND_API zend_generator *zend_generator_update_root(zend_generator *generator)
static zend_generator *get_new_root(zend_generator *generator, zend_generator *root)
{
while (!root->execute_data && root->node.children == 1) {
- root = root->node.child.single.child;
+ root = root->node.child.single;
}
if (root->execute_data) {
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h
index 35ff09c99d..a082e46114 100644
--- a/Zend/zend_generators.h
+++ b/Zend/zend_generators.h
@@ -41,10 +41,7 @@ struct _zend_generator_node {
uint32_t children;
union {
HashTable *ht; /* if multiple children */
- struct { /* if one child */
- zend_generator *leaf; /* TODO: Unused, remove. */
- zend_generator *child;
- } single;
+ zend_generator *single; /* if one child */
} child;
/* One generator can cache a direct pointer to the current root.
* The leaf member points back to the generator using the root cache. */
diff --git a/Zend/zend_highlight.h b/Zend/zend_highlight.h
index c4f819d508..e54a339ec4 100644
--- a/Zend/zend_highlight.h
+++ b/Zend/zend_highlight.h
@@ -40,7 +40,7 @@ BEGIN_EXTERN_C()
ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini);
ZEND_API void zend_strip(void);
ZEND_API zend_result highlight_file(const char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini);
-ZEND_API void highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *str_name);
+ZEND_API void highlight_string(zend_string *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *str_name);
ZEND_API void zend_html_putc(char c);
ZEND_API void zend_html_puts(const char *s, size_t len);
END_EXTERN_C()
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index d1c5b85cf2..cd31878eb9 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -851,17 +851,13 @@ zend_result highlight_file(const char *filename, zend_syntax_highlighter_ini *sy
return SUCCESS;
}
-void highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *str_name)
+void highlight_string(zend_string *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, const char *str_name)
{
zend_lex_state original_lex_state;
- zval tmp;
-
- if (UNEXPECTED(Z_TYPE_P(str) != IS_STRING)) {
- ZVAL_STR(&tmp, zval_get_string_func(str));
- str = &tmp;
- }
+ zval str_zv;
+ ZVAL_STR_COPY(&str_zv, str);
zend_save_lexical_state(&original_lex_state);
- zend_prepare_string_for_scanning(str, str_name);
+ zend_prepare_string_for_scanning(&str_zv, str_name);
BEGIN(INITIAL);
zend_highlight(syntax_highlighter_ini);
if (SCNG(script_filtered)) {
@@ -869,9 +865,7 @@ void highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter
SCNG(script_filtered) = NULL;
}
zend_restore_lexical_state(&original_lex_state);
- if (UNEXPECTED(str == &tmp)) {
- zval_ptr_dtor(&tmp);
- }
+ zval_ptr_dtor(&str_zv);
}
ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter, const zend_encoding *old_encoding)
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index 30d70bbf53..98957def76 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -31,7 +31,7 @@
#define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
#define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module
-#define ZEND_MODULE_API_NO 20200930
+#define ZEND_MODULE_API_NO 20201009
#ifdef ZTS
#define USING_ZTS 1
#else
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index dabf35b3d2..1932b1cdee 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -103,3 +103,8 @@ jobs:
configurationName: DEBUG_NTS_FILE_CACHE
configurationParameters: '--enable-debug --disable-zts'
timeoutInMinutes: 90
+ - template: azure/job.yml
+ parameters:
+ configurationName: DEBUG_NTS_REPEAT
+ configurationParameters: '--enable-debug --disable-zts'
+ runTestsParameters: '--repeat 2'
diff --git a/azure/apt.yml b/azure/apt.yml
index 71f58ce8da..aa27d4a551 100644
--- a/azure/apt.yml
+++ b/azure/apt.yml
@@ -42,6 +42,11 @@ steps:
snmp-mibs-downloader \
unixodbc-dev \
llvm \
- libc-client-dev libkrb5-dev dovecot-core dovecot-pop3d dovecot-imapd \
+ libc-client-dev \
+ libkrb5-dev \
+ dovecot-core \
+ dovecot-pop3d \
+ dovecot-imapd \
+ sendmail \
${{ parameters.packages }}
displayName: 'APT'
diff --git a/azure/setup.yml b/azure/setup.yml
index e0b4dc79da..489df88159 100644
--- a/azure/setup.yml
+++ b/azure/setup.yml
@@ -20,8 +20,8 @@ steps:
set -e
sudo groupadd -g 5000 vmail
sudo useradd -m -d /var/vmail -s /bin/false -u 5000 -g vmail vmail
- sudo cp ext/imap/tests/dovecot.conf /etc/dovecot/dovecot.conf
- sudo cp ext/imap/tests/dovecotpass /etc/dovecot/dovecotpass
+ sudo cp ext/imap/tests/setup/dovecot.conf /etc/dovecot/dovecot.conf
+ sudo cp ext/imap/tests/setup/dovecotpass /etc/dovecot/dovecotpass
sudo service dovecot restart
displayName: 'Configure IMAP'
diff --git a/build/php.m4 b/build/php.m4
index 16c5e25fba..fe2f176e3c 100644
--- a/build/php.m4
+++ b/build/php.m4
@@ -1903,7 +1903,7 @@ dnl
AC_DEFUN([PHP_SETUP_OPENSSL],[
found_openssl=no
- PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.0.1], [found_openssl=yes])
+ PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.0.2], [found_openssl=yes])
if test "$found_openssl" = "yes"; then
PHP_EVAL_LIBLINE($OPENSSL_LIBS, $1)
diff --git a/configure.ac b/configure.ac
index 8d6e922fa9..6b33047538 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@ dnl Basic autoconf initialization, generation of config.nice.
dnl ----------------------------------------------------------------------------
AC_PREREQ([2.68])
-AC_INIT([PHP],[8.0.1-dev],[https://bugs.php.net],[php],[https://www.php.net])
+AC_INIT([PHP],[8.1.0-dev],[https://bugs.php.net],[php],[https://www.php.net])
AC_CONFIG_SRCDIR([main/php_version.h])
AC_CONFIG_AUX_DIR([build])
AC_PRESERVE_HELP_ORDER
diff --git a/ext/ftp/ftp.stub.php b/ext/ftp/ftp.stub.php
index f4812655a4..698cfe215c 100644
--- a/ext/ftp/ftp.stub.php
+++ b/ext/ftp/ftp.stub.php
@@ -2,133 +2,57 @@
/** @generate-function-entries */
-/** @return resource|false */
-function ftp_connect(string $hostname, int $port = 21, int $timeout = 90) {}
+function ftp_connect(string $hostname, int $port = 21, int $timeout = 90): FTPConnection|false {}
#ifdef HAVE_FTP_SSL
-/** @return resource|false */
-function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90) {}
+function ftp_ssl_connect(string $hostname, int $port = 21, int $timeout = 90): FTPConnection|false {}
#endif
-/** @param resource $ftp */
-function ftp_login($ftp, string $username, string $password): bool {}
-
-/** @param resource $ftp */
-function ftp_pwd($ftp): string|false {}
-
-/** @param resource $ftp */
-function ftp_cdup($ftp): bool {}
-
-/** @param resource $ftp */
-function ftp_chdir($ftp, string $directory): bool {}
-
-/** @param resource $ftp */
-function ftp_exec($ftp, string $command): bool {}
-
-/** @param resource $ftp */
-function ftp_raw($ftp, string $command): array {}
-
-/** @param resource $ftp */
-function ftp_mkdir($ftp, string $directory): string|false {}
-
-/** @param resource $ftp */
-function ftp_rmdir($ftp, string $directory): bool {}
-
-/** @param resource $ftp */
-function ftp_chmod($ftp, int $permissions, string $filename): int|false {}
-
-/**
- * @param resource $ftp
- * @param string $response
- */
-function ftp_alloc($ftp, int $size, &$response = null): bool {}
-
-/** @param resource $ftp */
-function ftp_nlist($ftp, string $directory): array|false {}
-
-/** @param resource $ftp */
-function ftp_rawlist($ftp, string $directory, bool $recursive = false): array|false {}
-
-/** @param resource $ftp */
-function ftp_mlsd($ftp, string $directory): array|false {}
-
-/** @param resource $ftp */
-function ftp_systype($ftp): string|false {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_fget($ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_nb_fget($ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
-
-/** @param resource $ftp */
-function ftp_pasv($ftp, bool $enable): bool {}
-
-/** @param resource $ftp */
-function ftp_get($ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/** @param resource $ftp */
-function ftp_nb_get($ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
-
-/** @param resource $ftp */
-function ftp_nb_continue($ftp): int {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_fput($ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/**
- * @param resource $ftp
- * @param resource $stream
- */
-function ftp_nb_fput($ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): int {}
-
-/** @param resource $ftp */
-function ftp_put($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
-
-/** @param resource $ftp */
-function ftp_append($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): bool {}
-
-/** @param resource $ftp */
-function ftp_nb_put($ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int|false {}
-
-/** @param resource $ftp */
-function ftp_size($ftp, string $filename): int {}
-
-/** @param resource $ftp */
-function ftp_mdtm($ftp, string $filename): int {}
-
-/** @param resource $ftp */
-function ftp_rename($ftp, string $from, string $to): bool {}
-
-/** @param resource $ftp */
-function ftp_delete($ftp, string $filename): bool {}
-
-/** @param resource $ftp */
-function ftp_site($ftp, string $command): bool {}
-
-/** @param resource $ftp */
-function ftp_close($ftp): bool {}
-
-/**
- * @param resource $ftp
- * @alias ftp_close
- */
-function ftp_quit($ftp): bool {}
-
-/**
- * @param resource $ftp
- * @param int|bool $value
- */
-function ftp_set_option($ftp, int $option, $value): bool {}
-
-/** @param resource $ftp */
-function ftp_get_option($ftp, int $option): int|bool {}
+function ftp_login(FTPConnection $ftp, string $username, string $password): bool {}
+function ftp_pwd(FTPConnection $ftp): string|false {}
+function ftp_cdup(FTPConnection $ftp): bool {}
+function ftp_chdir(FTPConnection $ftp, string $directory): bool {}
+function ftp_exec(FTPConnection $ftp, string $command): bool {}
+function ftp_raw(FTPConnection $ftp, string $command): array {}
+function ftp_mkdir(FTPConnection $ftp, string $directory): string|false {}
+function ftp_rmdir(FTPConnection $ftp, string $directory): bool {}
+function ftp_chmod(FTPConnection $ftp, int $permissions, string $filename): int|false {}
+
+/** @param string $response */
+function ftp_alloc(FTPConnection $ftp, int $size, &$response = null): bool {}
+function ftp_nlist(FTPConnection $ftp, string $directory): array|false {}
+function ftp_rawlist(FTPConnection $ftp, string $directory, bool $recursive = false): array|false {}
+function ftp_mlsd(FTPConnection $ftp, string $directory): array|false {}
+function ftp_systype(FTPConnection $ftp): string|false {}
+
+/** @param resource $stream */
+function ftp_fget(FTPConnection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
+
+/** @param resource $stream */
+function ftp_nb_fget(FTPConnection $ftp, $stream, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
+function ftp_pasv(FTPConnection $ftp, bool $enable): bool {}
+function ftp_get(FTPConnection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
+function ftp_nb_get(FTPConnection $ftp, string $local_filename, string $remote_filename, int $mode = FTP_BINARY, int $offset = 0): int {}
+function ftp_nb_continue(FTPConnection $ftp): int {}
+
+/** @param resource $stream */
+function ftp_fput(FTPConnection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): bool {}
+
+/** @param resource $stream */
+function ftp_nb_fput(FTPConnection $ftp, string $remote_filename, $stream, int $mode = FTP_BINARY, int $offset = 0): int {}
+function ftp_put(FTPConnection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): bool {}
+function ftp_append(FTPConnection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY): bool {}
+function ftp_nb_put(FTPConnection $ftp, string $remote_filename, string $local_filename, int $mode = FTP_BINARY, int $offset = 0): int|false {}
+function ftp_size(FTPConnection $ftp, string $filename): int {}
+function ftp_mdtm(FTPConnection $ftp, string $filename): int {}
+function ftp_rename(FTPConnection $ftp, string $from, string $to): bool {}
+function ftp_delete(FTPConnection $ftp, string $filename): bool {}
+function ftp_site(FTPConnection $ftp, string $command): bool {}
+function ftp_close(FTPConnection $ftp): bool {}
+
+/** @alias ftp_close */
+function ftp_quit(FTPConnection $ftp): bool {}
+
+/** @param int|bool $value */
+function ftp_set_option(FTPConnection $ftp, int $option, $value): bool {}
+function ftp_get_option(FTPConnection $ftp, int $option): int|bool {}
diff --git a/ext/ftp/ftp_arginfo.h b/ext/ftp/ftp_arginfo.h
index e1a9d770bc..30251b87ee 100644
--- a/ext/ftp/ftp_arginfo.h
+++ b/ext/ftp/ftp_arginfo.h
@@ -1,14 +1,14 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 4957601533b387d70ebb15811821fc06507cdbc2 */
+ * Stub hash: 151310a13eeeb2bbf4df1ab38a3a29506b26a570 */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_connect, 0, 0, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ftp_connect, 0, 1, FTPConnection, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "21")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_LONG, 0, "90")
ZEND_END_ARG_INFO()
#if defined(HAVE_FTP_SSL)
-ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_ssl_connect, 0, 0, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ftp_ssl_connect, 0, 1, FTPConnection, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "21")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_LONG, 0, "90")
@@ -16,60 +16,60 @@ ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_login, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, username, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_pwd, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_cdup, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_chdir, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_exec, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, command, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_raw, 0, 2, IS_ARRAY, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, command, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_mkdir, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_ftp_rmdir arginfo_ftp_chdir
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_chmod, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, permissions, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_alloc, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, response, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nlist, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_rawlist, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, recursive, _IS_BOOL, 0, "false")
ZEND_END_ARG_INFO()
@@ -79,7 +79,7 @@ ZEND_END_ARG_INFO()
#define arginfo_ftp_systype arginfo_ftp_pwd
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fget, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -87,7 +87,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fget, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fget, 0, 3, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -95,12 +95,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fget, 0, 3, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_pasv, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_get, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -108,7 +108,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_get, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_get, 0, 3, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -116,11 +116,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_get, 0, 3, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_continue, 0, 1, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fput, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -128,7 +128,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fput, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fput, 0, 3, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_INFO(0, stream)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -136,7 +136,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fput, 0, 3, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_put, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -144,14 +144,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_put, 0, 3, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_append, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nb_put, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, remote_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, local_filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "FTP_BINARY")
@@ -159,20 +159,20 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nb_put, 0, 3, MAY_BE_LONG|MA
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_size, 0, 2, IS_LONG, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_ftp_mdtm arginfo_ftp_size
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_rename, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, from, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, to, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_delete, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -183,13 +183,13 @@ ZEND_END_ARG_INFO()
#define arginfo_ftp_quit arginfo_ftp_cdup
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_set_option, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_get_option, 0, 2, MAY_BE_LONG|MAY_BE_BOOL)
- ZEND_ARG_INFO(0, ftp)
+ ZEND_ARG_OBJ_INFO(0, ftp, FTPConnection, 0)
ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
ZEND_END_ARG_INFO()
diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c
index a6dca8c874..30bffbdd8c 100644
--- a/ext/ftp/php_ftp.c
+++ b/ext/ftp/php_ftp.c
@@ -29,13 +29,15 @@
#include "ext/standard/info.h"
#include "ext/standard/file.h"
+#include "Zend/zend_exceptions.h"
+#include "Zend/zend_interfaces.h"
#include "php_ftp.h"
#include "ftp.h"
#include "ftp_arginfo.h"
-static int le_ftpbuf;
-#define le_ftpbuf_name "FTP Buffer"
+static zend_class_entry *php_ftp_ce = NULL;
+static zend_object_handlers ftp_object_handlers;
zend_module_entry php_ftp_module_entry = {
STANDARD_MODULE_HEADER_EX,
@@ -56,15 +58,42 @@ zend_module_entry php_ftp_module_entry = {
ZEND_GET_MODULE(php_ftp)
#endif
-static void ftp_destructor_ftpbuf(zend_resource *rsrc)
-{
- ftpbuf_t *ftp = (ftpbuf_t *)rsrc->ptr;
+typedef struct _php_ftp_object {
+ ftpbuf_t *ftp;
+ zend_object std;
+} php_ftp_object;
+
+static inline zend_object *ftp_object_to_zend_object(php_ftp_object *obj) {
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static inline php_ftp_object *ftp_object_from_zend_object(zend_object *zobj) {
+ return ((php_ftp_object*)(zobj + 1)) - 1;
+}
+
+static zend_object* ftp_object_create(zend_class_entry* ce) {
+ php_ftp_object *obj = zend_object_alloc(sizeof(php_ftp_object), ce);
+ zend_object *zobj = ftp_object_to_zend_object(obj);
+ obj->ftp = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &ftp_object_handlers;
- ftp_close(ftp);
+ return zobj;
+}
+
+static void ftp_object_destroy(zend_object *zobj) {
+ php_ftp_object *obj = ftp_object_from_zend_object(zobj);
+
+ if (obj->ftp) {
+ ftp_close(obj->ftp);
+ }
}
PHP_MINIT_FUNCTION(ftp)
{
+ zend_class_entry ce;
+
#ifdef HAVE_FTP_SSL
#if OPENSSL_VERSION_NUMBER < 0x10101000 && !defined(LIBRESSL_VERSION_NUMBER)
SSL_library_init();
@@ -76,7 +105,18 @@ PHP_MINIT_FUNCTION(ftp)
#endif
#endif
- le_ftpbuf = zend_register_list_destructors_ex(ftp_destructor_ftpbuf, NULL, le_ftpbuf_name, module_number);
+ INIT_CLASS_ENTRY(ce, "FTPConnection", NULL);
+ php_ftp_ce = zend_register_internal_class(&ce);
+ php_ftp_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ php_ftp_ce->create_object = ftp_object_create;
+ php_ftp_ce->serialize = zend_class_serialize_deny;
+ php_ftp_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&ftp_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ ftp_object_handlers.offset = XtOffsetOf(php_ftp_object, std);
+ ftp_object_handlers.dtor_obj = ftp_object_destroy;
+ ftp_object_handlers.clone_obj = NULL;
+
REGISTER_LONG_CONSTANT("FTP_ASCII", FTPTYPE_ASCII, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("FTP_TEXT", FTPTYPE_ASCII, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("FTP_BINARY", FTPTYPE_IMAGE, CONST_PERSISTENT | CONST_CS);
@@ -143,7 +183,8 @@ PHP_FUNCTION(ftp_connect)
ftp->use_ssl = 0;
#endif
- RETURN_RES(zend_register_resource(ftp, le_ftpbuf));
+ object_init_ex(return_value, php_ftp_ce);
+ ftp_object_from_zend_object(Z_OBJ_P(return_value))->ftp = ftp;
}
/* }}} */
@@ -177,11 +218,19 @@ PHP_FUNCTION(ftp_ssl_connect)
/* enable ssl */
ftp->use_ssl = 1;
- RETURN_RES(zend_register_resource(ftp, le_ftpbuf));
+ object_init_ex(return_value, php_ftp_ce);
+ ftp_object_from_zend_object(Z_OBJ_P(return_value))->ftp = ftp;
}
/* }}} */
#endif
+#define GET_FTPBUF(ftpbuf, zftp) \
+ ftpbuf = ftp_object_from_zend_object(Z_OBJ_P(zftp))->ftp; \
+ if (!ftpbuf) { \
+ zend_throw_exception(zend_ce_value_error, "FTPConnection is already closed", 0); \
+ RETURN_THROWS(); \
+ }
+
/* {{{ Logs into the FTP server */
PHP_FUNCTION(ftp_login)
{
@@ -190,13 +239,10 @@ PHP_FUNCTION(ftp_login)
char *user, *pass;
size_t user_len, pass_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &z_ftp, &user, &user_len, &pass, &pass_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &z_ftp, php_ftp_ce, &user, &user_len, &pass, &pass_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* log in */
if (!ftp_login(ftp, user, user_len, pass, pass_len)) {
@@ -215,13 +261,10 @@ PHP_FUNCTION(ftp_pwd)
ftpbuf_t *ftp;
const char *pwd;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!(pwd = ftp_pwd(ftp))) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -238,13 +281,10 @@ PHP_FUNCTION(ftp_cdup)
zval *z_ftp;
ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp_cdup(ftp)) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -263,13 +303,10 @@ PHP_FUNCTION(ftp_chdir)
char *dir;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* change directories */
if (!ftp_chdir(ftp, dir, dir_len)) {
@@ -289,13 +326,10 @@ PHP_FUNCTION(ftp_exec)
char *cmd;
size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &cmd, &cmd_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* execute serverside command */
if (!ftp_exec(ftp, cmd, cmd_len)) {
@@ -315,13 +349,10 @@ PHP_FUNCTION(ftp_raw)
char *cmd;
size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &cmd, &cmd_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* execute arbitrary ftp command */
ftp_raw(ftp, cmd, cmd_len, return_value);
@@ -337,13 +368,10 @@ PHP_FUNCTION(ftp_mkdir)
zend_string *tmp;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* create directory */
if (NULL == (tmp = ftp_mkdir(ftp, dir, dir_len))) {
@@ -363,13 +391,10 @@ PHP_FUNCTION(ftp_rmdir)
char *dir;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* remove directorie */
if (!ftp_rmdir(ftp, dir, dir_len)) {
@@ -390,13 +415,10 @@ PHP_FUNCTION(ftp_chmod)
size_t filename_len;
zend_long mode;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlp", &z_ftp, &mode, &filename, &filename_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olp", &z_ftp, php_ftp_ce, &mode, &filename, &filename_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp_chmod(ftp, mode, filename, filename_len)) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -415,13 +437,10 @@ PHP_FUNCTION(ftp_alloc)
zend_long size, ret;
zend_string *response = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z", &z_ftp, &size, &zresponse) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol|z", &z_ftp, php_ftp_ce, &size, &zresponse) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
ret = ftp_alloc(ftp, size, zresponse ? &response : NULL);
@@ -445,13 +464,10 @@ PHP_FUNCTION(ftp_nlist)
char **nlist, **ptr, *dir;
size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get list of files */
if (NULL == (nlist = ftp_nlist(ftp, dir, dir_len))) {
@@ -475,13 +491,10 @@ PHP_FUNCTION(ftp_rawlist)
size_t dir_len;
zend_bool recursive = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|b", &z_ftp, &dir, &dir_len, &recursive) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|b", &z_ftp, php_ftp_ce, &dir, &dir_len, &recursive) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get raw directory listing */
if (NULL == (llist = ftp_list(ftp, dir, dir_len, recursive))) {
@@ -505,13 +518,10 @@ PHP_FUNCTION(ftp_mlsd)
size_t dir_len;
zval entry;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &dir, &dir_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get raw directory listing */
if (NULL == (llist = ftp_mlsd(ftp, dir, dir_len))) {
@@ -539,13 +549,10 @@ PHP_FUNCTION(ftp_systype)
ftpbuf_t *ftp;
const char *syst;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (NULL == (syst = ftp_syst(ftp))) {
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
@@ -567,13 +574,10 @@ PHP_FUNCTION(ftp_fget)
size_t file_len;
zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs|ll", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ors|ll", &z_ftp, php_ftp_ce, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_res(stream, Z_RES_P(z_file));
XTYPE(xtype, mode);
@@ -612,13 +616,10 @@ PHP_FUNCTION(ftp_nb_fget)
size_t file_len;
zend_long mode=FTPTYPE_IMAGE, resumepos=0, ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs|ll", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ors|ll", &z_ftp, php_ftp_ce, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_res(stream, Z_RES_P(z_file));
XTYPE(xtype, mode);
@@ -657,13 +658,10 @@ PHP_FUNCTION(ftp_pasv)
ftpbuf_t *ftp;
zend_bool pasv;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rb", &z_ftp, &pasv) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &z_ftp, php_ftp_ce, &pasv) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp_pasv(ftp, pasv ? 1 : 0)) {
RETURN_FALSE;
@@ -684,13 +682,10 @@ PHP_FUNCTION(ftp_get)
size_t local_len, remote_len;
zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|ll", &z_ftp, php_ftp_ce, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
/* ignore autoresume if autoseek is switched off */
@@ -749,13 +744,10 @@ PHP_FUNCTION(ftp_nb_get)
int ret;
zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss|ll", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss|ll", &z_ftp, php_ftp_ce, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
/* ignore autoresume if autoseek is switched off */
@@ -816,13 +808,10 @@ PHP_FUNCTION(ftp_nb_continue)
ftpbuf_t *ftp;
zend_long ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
if (!ftp->nb) {
php_error_docref(NULL, E_WARNING, "No nbronous transfer to continue");
@@ -859,13 +848,10 @@ PHP_FUNCTION(ftp_fput)
php_stream *stream;
char *remote;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsr|ll", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osr|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_zval(stream, z_file);
XTYPE(xtype, mode);
@@ -908,13 +894,10 @@ PHP_FUNCTION(ftp_nb_fput)
php_stream *stream;
char *remote;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsr|ll", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osr|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
php_stream_from_res(stream, Z_RES_P(z_file));
XTYPE(xtype, mode);
@@ -961,13 +944,10 @@ PHP_FUNCTION(ftp_put)
zend_long mode=FTPTYPE_IMAGE, startpos=0;
php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, NULL))) {
@@ -1014,13 +994,10 @@ PHP_FUNCTION(ftp_append)
zend_long mode=FTPTYPE_IMAGE;
php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|l", &z_ftp, &remote, &remote_len, &local, &local_len, &mode) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|l", &z_ftp, php_ftp_ce, &remote, &remote_len, &local, &local_len, &mode) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, NULL))) {
@@ -1049,13 +1026,10 @@ PHP_FUNCTION(ftp_nb_put)
zend_long mode=FTPTYPE_IMAGE, startpos=0, ret;
php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opp|ll", &z_ftp, php_ftp_ce, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
XTYPE(xtype, mode);
if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, NULL))) {
@@ -1107,13 +1081,10 @@ PHP_FUNCTION(ftp_size)
char *file;
size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &file, &file_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &z_ftp, php_ftp_ce, &file, &file_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get file size */
RETURN_LONG(ftp_size(ftp, file, file_len));
@@ -1128,13 +1099,10 @@ PHP_FUNCTION(ftp_mdtm)
char *file;
size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &file, &file_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &z_ftp, php_ftp_ce, &file, &file_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* get file mod time */
RETURN_LONG(ftp_mdtm(ftp, file, file_len));
@@ -1149,13 +1117,10 @@ PHP_FUNCTION(ftp_rename)
char *src, *dest;
size_t src_len, dest_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &z_ftp, &src, &src_len, &dest, &dest_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &z_ftp, php_ftp_ce, &src, &src_len, &dest, &dest_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* rename the file */
if (!ftp_rename(ftp, src, src_len, dest, dest_len)) {
@@ -1175,13 +1140,10 @@ PHP_FUNCTION(ftp_delete)
char *file;
size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &file, &file_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &file, &file_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* delete the file */
if (!ftp_delete(ftp, file, file_len)) {
@@ -1201,13 +1163,10 @@ PHP_FUNCTION(ftp_site)
char *cmd;
size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &z_ftp, php_ftp_ce, &cmd, &cmd_len) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
/* send the site command */
if (!ftp_site(ftp, cmd, cmd_len)) {
@@ -1223,18 +1182,19 @@ PHP_FUNCTION(ftp_site)
PHP_FUNCTION(ftp_close)
{
zval *z_ftp;
- ftpbuf_t *ftp;
+ php_ftp_object *obj;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &z_ftp, php_ftp_ce) == FAILURE) {
RETURN_THROWS();
}
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_THROWS();
+ obj = ftp_object_from_zend_object(Z_OBJ_P(z_ftp));
+ if (obj->ftp) {
+ ftp_quit(obj->ftp);
+ ftp_close(obj->ftp);
+ obj->ftp = NULL;
}
- ftp_quit(ftp);
-
RETURN_TRUE;
}
/* }}} */
@@ -1246,13 +1206,10 @@ PHP_FUNCTION(ftp_set_option)
zend_long option;
ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &z_ftp, &option, &z_value) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olz", &z_ftp, php_ftp_ce, &option, &z_value) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
switch (option) {
case PHP_FTP_OPT_TIMEOUT_SEC:
@@ -1298,13 +1255,10 @@ PHP_FUNCTION(ftp_get_option)
zend_long option;
ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &z_ftp, &option) == FAILURE) {
- RETURN_THROWS();
- }
-
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &z_ftp, php_ftp_ce, &option) == FAILURE) {
RETURN_THROWS();
}
+ GET_FTPBUF(ftp, z_ftp);
switch (option) {
case PHP_FTP_OPT_TIMEOUT_SEC:
diff --git a/ext/ftp/tests/007.phpt b/ext/ftp/tests/007.phpt
index 0520b37293..1ae879f901 100644
--- a/ext/ftp/tests/007.phpt
+++ b/ext/ftp/tests/007.phpt
@@ -180,36 +180,36 @@ try {
fclose($ftp);
?>
--EXPECT--
-ftp_login(): supplied resource is not a valid FTP Buffer resource
-ftp_pwd(): supplied resource is not a valid FTP Buffer resource
-ftp_cdup(): supplied resource is not a valid FTP Buffer resource
-ftp_chdir(): supplied resource is not a valid FTP Buffer resource
-ftp_exec(): supplied resource is not a valid FTP Buffer resource
-ftp_raw(): supplied resource is not a valid FTP Buffer resource
-ftp_mkdir(): supplied resource is not a valid FTP Buffer resource
-ftp_rmdir(): supplied resource is not a valid FTP Buffer resource
-ftp_chmod(): supplied resource is not a valid FTP Buffer resource
-ftp_alloc(): supplied resource is not a valid FTP Buffer resource
-ftp_nlist(): supplied resource is not a valid FTP Buffer resource
-ftp_rawlist(): supplied resource is not a valid FTP Buffer resource
-ftp_mlsd(): supplied resource is not a valid FTP Buffer resource
-ftp_systype(): supplied resource is not a valid FTP Buffer resource
-ftp_fget(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_fget(): supplied resource is not a valid FTP Buffer resource
-ftp_pasv(): supplied resource is not a valid FTP Buffer resource
-ftp_get(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_get(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_continue(): supplied resource is not a valid FTP Buffer resource
-ftp_fput(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_fput(): supplied resource is not a valid FTP Buffer resource
-ftp_put(): supplied resource is not a valid FTP Buffer resource
-ftp_append(): supplied resource is not a valid FTP Buffer resource
-ftp_nb_put(): supplied resource is not a valid FTP Buffer resource
-ftp_size(): supplied resource is not a valid FTP Buffer resource
-ftp_mdtm(): supplied resource is not a valid FTP Buffer resource
-ftp_rename(): supplied resource is not a valid FTP Buffer resource
-ftp_delete(): supplied resource is not a valid FTP Buffer resource
-ftp_site(): supplied resource is not a valid FTP Buffer resource
-ftp_close(): supplied resource is not a valid FTP Buffer resource
-ftp_set_option(): supplied resource is not a valid FTP Buffer resource
-ftp_get_option(): supplied resource is not a valid FTP Buffer resource
+ftp_login(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_pwd(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_cdup(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_chdir(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_exec(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_raw(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_mkdir(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_rmdir(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_chmod(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_alloc(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nlist(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_rawlist(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_mlsd(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_systype(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_fget(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_fget(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_pasv(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_get(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_get(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_continue(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_fput(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_fput(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_put(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_append(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_nb_put(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_size(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_mdtm(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_rename(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_delete(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_site(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_close(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_set_option(): Argument #1 ($ftp) must be of type FTPConnection, resource given
+ftp_get_option(): Argument #1 ($ftp) must be of type FTPConnection, resource given
diff --git a/ext/ftp/tests/CONFLICTS b/ext/ftp/tests/CONFLICTS
deleted file mode 100644
index 254defddb5..0000000000
--- a/ext/ftp/tests/CONFLICTS
+++ /dev/null
@@ -1 +0,0 @@
-server
diff --git a/ext/ftp/tests/dead-resource.phpt b/ext/ftp/tests/dead-resource.phpt
new file mode 100644
index 0000000000..75a9931d54
--- /dev/null
+++ b/ext/ftp/tests/dead-resource.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Attempt to use a closed FTPConnection
+--SKIPIF--
+<?php
+require 'skipif.inc';
+--FILE--
+<?php
+require 'server.inc';
+
+$ftp = ftp_connect('127.0.0.1', $port);
+if (!$ftp) die("Couldn't connect to the server");
+var_dump(ftp_login($ftp, 'user', 'pass'));
+var_dump(ftp_close($ftp));
+
+try {
+ var_dump(ftp_login($ftp, 'user', 'pass'));
+ echo "Login did not throw\n";
+} catch (ValueError $ex) {
+ echo "Exception: ", $ex->getMessage(), "\n";
+}
+--EXPECT--
+bool(true)
+bool(true)
+Exception: FTPConnection is already closed
diff --git a/ext/ftp/tests/ftp_set_option_errors.phpt b/ext/ftp/tests/ftp_set_option_errors.phpt
index 3f5476f6c3..5e5ef328f3 100644
--- a/ext/ftp/tests/ftp_set_option_errors.phpt
+++ b/ext/ftp/tests/ftp_set_option_errors.phpt
@@ -13,40 +13,22 @@ $ftp = ftp_connect('127.0.0.1', $port);
ftp_login($ftp, 'user', 'pass');
$ftp or die("Couldn't connect to the server");
-try {
- ftp_set_option($ftp, FTP_TIMEOUT_SEC, 0);
-} catch (ValueError $exception) {
- echo $exception->getMessage() . "\n";
+$options = [
+ [ 'option' => FTP_TIMEOUT_SEC, 'value' => 0 ],
+ [ 'option' => FTP_TIMEOUT_SEC, 'value' => '0' ],
+ [ 'option' => FTP_USEPASVADDRESS, 'value' => ['1'] ],
+ [ 'option' => FTP_AUTOSEEK, 'value' => 'true' ],
+ [ 'option' => FOO_BAR, 'value' => 1 ],
+];
+foreach ($options as $option) try {
+ var_dump(ftp_set_option($ftp, $option['option'], $option['value']));
+} catch (\Throwable $ex) {
+ echo "Exception: ", $ex->getMessage(), "\n";
}
-try {
- ftp_set_option($ftp, FTP_TIMEOUT_SEC, '0');
-} catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-try {
- ftp_set_option($ftp, FTP_USEPASVADDRESS, ['1']);
-} catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-try {
- ftp_set_option($ftp, FTP_AUTOSEEK, 'true');
-} catch (TypeError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-try {
- ftp_set_option($ftp, FOO_BAR, 1);
-} catch (ValueError $exception) {
- echo $exception->getMessage() . "\n";
-}
-
-?>
--EXPECT--
-ftp_set_option(): Argument #3 ($value) must be greater than 0 for the FTP_TIMEOUT_SEC option
-ftp_set_option(): Argument #3 ($value) must be of type int for the FTP_TIMEOUT_SEC option, string given
-ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_USEPASVADDRESS option, array given
-ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_AUTOSEEK option, string given
-ftp_set_option(): Argument #2 ($option) must be one of FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS
+Exception: ftp_set_option(): Argument #3 ($value) must be greater than 0 for the FTP_TIMEOUT_SEC option
+Exception: ftp_set_option(): Argument #3 ($value) must be of type int for the FTP_TIMEOUT_SEC option, string given
+Exception: ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_USEPASVADDRESS option, array given
+Exception: ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_AUTOSEEK option, string given
+Exception: ftp_set_option(): Argument #2 ($option) must be one of FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS
diff --git a/ext/ftp/tests/server.inc b/ext/ftp/tests/server.inc
index 38599391d6..8bc836fc40 100644
--- a/ext/ftp/tests/server.inc
+++ b/ext/ftp/tests/server.inc
@@ -4,59 +4,21 @@ $socket = null;
$errno = 0;
$context = stream_context_create(array('ssl' => array('local_cert' => dirname(__FILE__).'/cert.pem')));
-for ($i=0; $i<10 && !$socket; ++$i) {
- $port = rand(50000, 65535);
-
- $socket = @stream_socket_server("tcp://127.0.0.1:$port", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
-}
-//set anther random port that is not the same as $port
-do{
- $pasv_port = rand(50000, 65535);
-}while($pasv_port == $port);
-
+$socket = stream_socket_server("tcp://127.0.0.1:0", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
if (!$socket) {
echo "$errstr ($errno)\n";
die("could not start/bind the ftp server\n");
}
-$pid = pcntl_fork();
+$socket_name = stream_socket_get_name($socket, false);
+$port = (int) substr($socket_name, strrpos($socket_name, ':') + 1);
-function pasv_listen($action){
- global $pasv_port, $tmp_file;
- $tmp_file = 'nm2.php';
- $pid = pcntl_fork();
- if($pid === 0){
- $soc = stream_socket_server("tcp://127.0.0.1:$pasv_port");
- $fs = stream_socket_accept($soc, 3);
- switch ($action) {
- case 'fget':
- case 'get':
- //listen for 3 seconds 3 seconds
- fputs($fs, "I am passive.\r\n");
- break;
- case 'put':
- file_put_contents($tmp_file, stream_get_contents($fs));
- break;
- case 'list':
- fputs($fs, "drwxr-x--- 3 owner group 4096 Jul 12 12:16 .\r\n");
- fputs($fs, "drwxr-x--- 3 owner group 4096 Jul 12 12:16 ..\r\n");
- fputs($fs, "drwxr-x--- 3 owner group 4096 Jul 12 12:16 public_ftp\r\n");
- break;
- case 'list_null':
- fputs($fs, "\r\n");
- break;
- }
- fclose($fs);
- exit;
- }
-}
+$pid = pcntl_fork();
if ($pid) {
-
function dump_and_exit($buf)
{
var_dump($buf);
- fclose($GLOBALS['s']);
exit;
}
@@ -90,10 +52,14 @@ if ($pid) {
if (!$s) die("Error accepting a new connection\n");
+ register_shutdown_function(function() use($pid, $s) {
+ fclose($s);
+ pcntl_waitpid($pid, $status);
+ });
+
fputs($s, "220----- PHP FTP server 0.3 -----\r\n220 Service ready\r\n");
$buf = fread($s, 2048);
-
function user_auth($buf) {
global $user, $s, $ssl, $bug37799;
@@ -143,7 +109,6 @@ if ($pid) {
$user = $m[1];
if ($user !== 'user' && $user !== 'anonymous') {
fputs($s, "530 Not logged in.\r\n");
- fclose($s);
exit;
}
@@ -163,7 +128,6 @@ if ($pid) {
fputs($s, "230 User logged in\r\n");
} else {
fputs($s, "530 Not logged in.\r\n");
- fclose($s);
exit;
}
}
@@ -432,25 +396,20 @@ if ($pid) {
$i=0;
if (empty($bug73457)) {
- do {
- if (!empty($ssl)) {
- $soc = @stream_socket_server("tcp://127.0.0.1:$pasv_port", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
- } else {
- $soc = @stream_socket_server("tcp://127.0.0.1:$pasv_port");
- }
- /* Could bind port, Try another port */
- if (!$soc) {
- $pasv_port = rand(50000, 65535);
- }
- $i++;
- } while ($i<10 && !$soc);
-
+ if (!empty($ssl)) {
+ $soc = stream_socket_server("tcp://127.0.0.1:0", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
+ } else {
+ $soc = stream_socket_server("tcp://127.0.0.1:0");
+ }
if (!$soc) {
echo "$errstr ($errno)\n";
die("could not bind passive port\n");
}
+
+ $soc_name = stream_socket_get_name($soc, false);
+ $pasv_port = (int) substr($soc_name, strrpos($soc_name, ':') + 1);
} else {
- $pasv_port=1234;
+ $pasv_port = 1234;
}
$p2 = $pasv_port % ((int) 1 << 8);
@@ -548,7 +507,6 @@ if ($pid) {
dump_and_exit($buf);
}
}
- fclose($s);
exit;
}
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 88d04824ea..d811b66866 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -57,8 +57,6 @@
#include "gd_compat.h"
-static int le_gd_font;
-
#include <gd.h>
#include <gd_errors.h>
#include <gdfontt.h> /* 1 Tiny font */
@@ -235,6 +233,75 @@ static void php_gd_object_minit_helper()
php_gd_image_object_handlers.offset = XtOffsetOf(php_gd_image_object, std);
}
+static zend_class_entry *gd_font_ce = NULL;
+static zend_object_handlers php_gd_font_object_handlers;
+
+typedef struct _php_gd_font_object {
+ gdFontPtr font;
+ zend_object std;
+} php_gd_font_object;
+
+static php_gd_font_object *php_gd_font_object_from_zend_object(zend_object *zobj)
+{
+ return ((php_gd_font_object*)(zobj + 1)) - 1;
+}
+
+static zend_object *php_gd_font_object_to_zend_object(php_gd_font_object *obj)
+{
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static zend_object *php_gd_font_object_create(zend_class_entry *ce)
+{
+ php_gd_font_object *obj = zend_object_alloc(sizeof(php_gd_font_object), ce);
+ zend_object *zobj = php_gd_font_object_to_zend_object(obj);
+
+ obj->font = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &php_gd_font_object_handlers;
+
+ return zobj;
+}
+
+static void php_gd_font_object_free(zend_object *zobj)
+{
+ php_gd_font_object *obj = php_gd_font_object_from_zend_object(zobj);
+
+ if (obj->font) {
+ if (obj->font->data) {
+ efree(obj->font->data);
+ }
+ efree(obj->font);
+ obj->font = NULL;
+ }
+
+ zend_object_std_dtor(zobj);
+}
+
+static zend_function *php_gd_font_object_get_constructor(zend_object *object)
+{
+ zend_throw_error(NULL, "You cannot initialize a GdFont object except through helper functions");
+ return NULL;
+}
+
+static void php_gd_font_minit_helper()
+{
+ zend_class_entry ce;
+ INIT_CLASS_ENTRY(ce, "GdFont", class_GdFont_methods);
+ gd_font_ce = zend_register_internal_class(&ce);
+ gd_font_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ gd_font_ce->create_object = php_gd_font_object_create;
+ gd_font_ce->serialize = zend_class_serialize_deny;
+ gd_font_ce->unserialize = zend_class_unserialize_deny;
+
+ /* setting up the object handlers for the GdFont class */
+ memcpy(&php_gd_font_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ php_gd_font_object_handlers.clone_obj = NULL;
+ php_gd_font_object_handlers.free_obj = php_gd_font_object_free;
+ php_gd_font_object_handlers.get_constructor = php_gd_font_object_get_constructor;
+ php_gd_font_object_handlers.offset = XtOffsetOf(php_gd_font_object, std);
+}
/*********************************************************
*
@@ -265,19 +332,6 @@ PHP_INI_BEGIN()
PHP_INI_END()
/* }}} */
-/* {{{ php_free_gd_font */
-static void php_free_gd_font(zend_resource *rsrc)
-{
- gdFontPtr fp = (gdFontPtr) rsrc->ptr;
-
- if (fp->data) {
- efree(fp->data);
- }
-
- efree(fp);
-}
-/* }}} */
-
/* {{{ php_gd_error_method */
void php_gd_error_method(int type, const char *format, va_list args)
{
@@ -302,8 +356,8 @@ void php_gd_error_method(int type, const char *format, va_list args)
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(gd)
{
- le_gd_font = zend_register_list_destructors_ex(php_free_gd_font, NULL, "gd font", module_number);
php_gd_object_minit_helper();
+ php_gd_font_minit_helper();
#if defined(HAVE_GD_FREETYPE) && defined(HAVE_GD_BUNDLED)
gdFontCacheMutexSetup();
@@ -614,7 +668,6 @@ PHP_FUNCTION(gd_info)
/* {{{ Load a new font */
PHP_FUNCTION(imageloadfont)
{
- zval *ind;
zend_string *file;
int hdr_size = sizeof(gdFont) - sizeof(char *);
int body_size, n = 0, b, i, body_size_check;
@@ -625,7 +678,7 @@ PHP_FUNCTION(imageloadfont)
RETURN_THROWS();
}
- stream = php_stream_open_wrapper(ZSTR_VAL(file), "rb", IGNORE_PATH | IGNORE_URL_WIN | REPORT_ERRORS, NULL);
+ stream = php_stream_open_wrapper(ZSTR_VAL(file), "rb", IGNORE_PATH | REPORT_ERRORS, NULL);
if (stream == NULL) {
RETURN_FALSE;
}
@@ -704,13 +757,8 @@ PHP_FUNCTION(imageloadfont)
}
php_stream_close(stream);
- ind = zend_list_insert(font, le_gd_font);
-
- /* Adding 5 to the font index so we will never have font indices
- * that overlap with the old fonts (with indices 1-5). The first
- * list index given out is always 1.
- */
- RETURN_LONG(Z_RES_HANDLE_P(ind) + 5);
+ object_init_ex(return_value, gd_font_ce);
+ php_gd_font_object_from_zend_object(Z_OBJ_P(return_value))->font = font;
}
/* }}} */
@@ -1584,7 +1632,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type,
}
- stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+ stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|IGNORE_PATH, NULL);
if (stream == NULL) {
RETURN_FALSE;
}
@@ -1883,7 +1931,7 @@ PHP_FUNCTION(imagexbm)
im = php_gd_libgdimageptr_from_zval_p(imgind);
if (file != NULL) {
- stream = php_stream_open_wrapper(file, "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+ stream = php_stream_open_wrapper(file, "wb", REPORT_ERRORS|IGNORE_PATH, NULL);
if (stream == NULL) {
RETURN_FALSE;
}
@@ -2695,42 +2743,21 @@ PHP_FUNCTION(imagefilledpolygon)
/* }}} */
/* {{{ php_find_gd_font */
-static gdFontPtr php_find_gd_font(int size)
+static gdFontPtr php_find_gd_font(zend_object *font_obj, zend_long font_int)
{
- gdFontPtr font;
+ if (font_obj) {
+ return php_gd_font_object_from_zend_object(font_obj)->font;
+ }
- switch (size) {
- case 1:
- font = gdFontTiny;
- break;
- case 2:
- font = gdFontSmall;
- break;
- case 3:
- font = gdFontMediumBold;
- break;
- case 4:
- font = gdFontLarge;
- break;
- case 5:
- font = gdFontGiant;
- break;
- default: {
- zval *zv = zend_hash_index_find(&EG(regular_list), size - 5);
- if (!zv || (Z_RES_P(zv))->type != le_gd_font) {
- if (size < 1) {
- font = gdFontTiny;
- } else {
- font = gdFontGiant;
- }
- } else {
- font = (gdFontPtr)Z_RES_P(zv)->ptr;
- }
- }
- break;
- }
-
- return font;
+ switch (font_int) {
+ case 1: return gdFontTiny;
+ case 2: return gdFontSmall;
+ case 3: return gdFontMediumBold;
+ case 4: return gdFontLarge;
+ case 5: return gdFontGiant;
+ }
+
+ return font_int < 1 ? gdFontTiny : gdFontGiant;
}
/* }}} */
@@ -2740,14 +2767,15 @@ static gdFontPtr php_find_gd_font(int size)
*/
static void php_imagefontsize(INTERNAL_FUNCTION_PARAMETERS, int arg)
{
- zend_long SIZE;
+ zend_object *font_obj;
+ zend_long font_int;
gdFontPtr font;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &SIZE) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_OBJ_OF_CLASS_OR_LONG(font_obj, gd_font_ce, font_int)
+ ZEND_PARSE_PARAMETERS_END();
- font = php_find_gd_font(SIZE);
+ font = php_find_gd_font(font_obj, font_int);
RETURN_LONG(arg ? font->h : font->w);
}
/* }}} */
@@ -2801,17 +2829,24 @@ static void php_gdimagecharup(gdImagePtr im, gdFontPtr f, int x, int y, int c, i
static void php_imagechar(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
zval *IM;
- zend_long SIZE, X, Y, COL;
+ zend_long X, Y, COL;
char *C;
size_t C_len;
gdImagePtr im;
- int ch = 0, col, x, y, size, i, l = 0;
+ int ch = 0, col, x, y, i, l = 0;
unsigned char *str = NULL;
+ zend_object *font_obj;
+ zend_long font_int;
gdFontPtr font;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "Olllsl", &IM, gd_image_ce, &SIZE, &X, &Y, &C, &C_len, &COL) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(6, 6)
+ Z_PARAM_OBJECT_OF_CLASS(IM, gd_image_ce)
+ Z_PARAM_OBJ_OF_CLASS_OR_LONG(font_obj, gd_font_ce, font_int)
+ Z_PARAM_LONG(X)
+ Z_PARAM_LONG(Y)
+ Z_PARAM_STRING(C, C_len)
+ Z_PARAM_LONG(COL)
+ ZEND_PARSE_PARAMETERS_END();
im = php_gd_libgdimageptr_from_zval_p(IM);
@@ -2826,9 +2861,8 @@ static void php_imagechar(INTERNAL_FUNCTION_PARAMETERS, int mode)
y = Y;
x = X;
- size = SIZE;
- font = php_find_gd_font(size);
+ font = php_find_gd_font(font_obj, font_int);
switch (mode) {
case 0:
@@ -4092,7 +4126,7 @@ static gdIOCtx *create_stream_context_from_zval(zval *to_zval) {
return NULL;
}
- stream = php_stream_open_wrapper(Z_STRVAL_P(to_zval), "wb", REPORT_ERRORS|IGNORE_PATH|IGNORE_URL_WIN, NULL);
+ stream = php_stream_open_wrapper(Z_STRVAL_P(to_zval), "wb", REPORT_ERRORS|IGNORE_PATH, NULL);
if (stream == NULL) {
return NULL;
}
diff --git a/ext/gd/gd.stub.php b/ext/gd/gd.stub.php
index fe0d5658ee..0ef410fc1e 100644
--- a/ext/gd/gd.stub.php
+++ b/ext/gd/gd.stub.php
@@ -2,13 +2,12 @@
/** @generate-function-entries */
-final class GdImage
-{
-}
+final class GdImage {}
+final class GdFont {}
function gd_info(): array {}
-function imageloadfont(string $filename): int|false {}
+function imageloadfont(string $filename): GdFont|false {}
function imagesetstyle(GdImage $image, array $style): bool {}
@@ -187,17 +186,17 @@ function imageopenpolygon(GdImage $image, array $points, int $num_points_or_colo
function imagefilledpolygon(GdImage $image, array $points, int $num_points_or_color, ?int $color = null): bool {}
-function imagefontwidth(int $font): int {}
+function imagefontwidth(GdFont|int $font): int {}
-function imagefontheight(int $font): int {}
+function imagefontheight(GdFont|int $font): int {}
-function imagechar(GdImage $image, int $font, int $x, int $y, string $char, int $color): bool {}
+function imagechar(GdImage $image, GdFont|int $font, int $x, int $y, string $char, int $color): bool {}
-function imagecharup(GdImage $image, int $font, int $x, int $y, string $char, int $color): bool {}
+function imagecharup(GdImage $image, GdFont|int $font, int $x, int $y, string $char, int $color): bool {}
-function imagestring(GdImage $image, int $font, int $x, int $y, string $string, int $color): bool {}
+function imagestring(GdImage $image, GdFont|int $font, int $x, int $y, string $string, int $color): bool {}
-function imagestringup(GdImage $image, int $font, int $x, int $y, string $string, int $color): bool {}
+function imagestringup(GdImage $image, GdFont|int $font, int $x, int $y, string $string, int $color): bool {}
function imagecopy(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): bool {}
diff --git a/ext/gd/gd_arginfo.h b/ext/gd/gd_arginfo.h
index 4d59767b4e..ea61b08374 100644
--- a/ext/gd/gd_arginfo.h
+++ b/ext/gd/gd_arginfo.h
@@ -1,10 +1,10 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 59256d0de105f1a2f5d5fc1e20f8090031b42a76 */
+ * Stub hash: 23b7c8395c628239fb10d746ca6bba72871ee9f3 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gd_info, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imageloadfont, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imageloadfont, 0, 1, GdFont, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -380,14 +380,14 @@ ZEND_END_ARG_INFO()
#define arginfo_imagefilledpolygon arginfo_imagepolygon
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagefontwidth, 0, 1, IS_LONG, 0)
- ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
+ ZEND_ARG_OBJ_TYPE_MASK(0, font, GdFont, MAY_BE_LONG, NULL)
ZEND_END_ARG_INFO()
#define arginfo_imagefontheight arginfo_imagefontwidth
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagechar, 0, 6, _IS_BOOL, 0)
ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
- ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
+ ZEND_ARG_OBJ_TYPE_MASK(0, font, GdFont, MAY_BE_LONG, NULL)
ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, char, IS_STRING, 0)
@@ -398,7 +398,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagestring, 0, 6, _IS_BOOL, 0)
ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
- ZEND_ARG_TYPE_INFO(0, font, IS_LONG, 0)
+ ZEND_ARG_OBJ_TYPE_MASK(0, font, GdFont, MAY_BE_LONG, NULL)
ZEND_ARG_TYPE_INFO(0, x, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, y, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
@@ -831,3 +831,8 @@ static const zend_function_entry ext_functions[] = {
static const zend_function_entry class_GdImage_methods[] = {
ZEND_FE_END
};
+
+
+static const zend_function_entry class_GdFont_methods[] = {
+ ZEND_FE_END
+};
diff --git a/ext/hash/bench.php b/ext/hash/bench.php
index 436390f7d5..846163315b 100755
--- a/ext/hash/bench.php
+++ b/ext/hash/bench.php
@@ -1,81 +1,12 @@
#!/usr/bin/env php
<?php
-/*
- This gives rather interesting results :)
+error_reporting(E_ALL);
- Measures on a Notebook P4M-1.7 256MB Windows 2000:
- sha1 0.556691
- tiger160,3 0.774469
- tiger192,3 0.776314
- tiger128,3 0.777004
- ripemd128 0.896674
- sha256 1.011164
- md5 1.016032
- tiger160,4 1.056617
- tiger128,4 1.063101
- tiger192,4 1.069258
- haval160,3 1.125099
- haval128,3 1.125679
- haval224,3 1.128017
- haval192,3 1.130026
- haval256,3 1.134846
- ripemd160 1.150693
- haval128,4 1.686261
- haval192,4 1.687274
- haval160,4 1.693091
- haval256,4 1.699323
- haval224,4 1.743094
- haval160,5 2.003452
- haval192,5 2.008341
- haval256,5 2.009048
- haval128,5 2.009555
- haval224,5 2.015539
- sha384 3.370734
- sha512 3.381121
- whirlpool 6.912327
- snefru 9.268168
-
- Measures on a Desktop P4-2.4 512MB Debian (Linux-2.4):
- md5 0.147739
- haval128,3 0.317006
- haval192,3 0.317524
- haval256,3 0.317526
- haval160,3 0.323035
- haval224,3 0.333318
- ripemd128 0.353447
- sha1 0.376200
- ripemd160 0.413758
- sha256 0.435957
- haval160,4 0.452357
- haval224,4 0.454531
- haval128,4 0.458026
- haval256,4 0.459051
- haval192,4 0.468094
- haval128,5 0.524262
- haval160,5 0.529573
- haval224,5 0.533655
- haval256,5 0.534446
- haval192,5 0.543726
- tiger128,3 0.577975
- tiger160,3 0.579951
- tiger192,3 0.597111
- tiger192,4 0.781408
- tiger160,4 0.801243
- tiger128,4 0.812239
- sha512 1.298627
- sha384 1.313607
- whirlpool 1.556159
- snefru 5.703742
-
-*/
-
-error_reporting(E_ALL&~E_NOTICE);
-
-$data = file_get_contents(__FILE__);
+$data = str_repeat("\x00", (int) ($argv[1] ?? (2 * 1024)));
$time = array();
foreach (hash_algos() as $algo) {
- $time[$algo] = 0;
+ $time[$algo] = 0;
}
for ($j = 0; $j < 10; $j++) {
@@ -92,4 +23,3 @@ asort($time, SORT_NUMERIC);
foreach ($time as $a => $t) {
printf("%-12s %02.6f\n", $a, $t);
}
-?>
diff --git a/ext/hash/config.m4 b/ext/hash/config.m4
index d84e89cc6b..2d6a81b7fe 100644
--- a/ext/hash/config.m4
+++ b/ext/hash/config.m4
@@ -35,11 +35,12 @@ fi
EXT_HASH_SOURCES="hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c \
hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c hash_adler32.c \
- hash_crc32.c hash_fnv.c hash_joaat.c $EXT_HASH_SHA3_SOURCES"
+ hash_crc32.c hash_fnv.c hash_joaat.c $EXT_HASH_SHA3_SOURCES
+ murmur/PMurHash.c murmur/PMurHash128.c hash_murmur.c"
EXT_HASH_HEADERS="php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h \
php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h \
php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h \
- php_hash_fnv.h php_hash_joaat.h php_hash_sha3.h"
+ php_hash_fnv.h php_hash_joaat.h php_hash_sha3.h php_hash_murmur.h"
PHP_NEW_EXTENSION(hash, $EXT_HASH_SOURCES, 0,,$PHP_HASH_CFLAGS)
PHP_INSTALL_HEADERS(ext/hash, $EXT_HASH_HEADERS)
diff --git a/ext/hash/config.w32 b/ext/hash/config.w32
index 5d6be6b922..a0cb3f2477 100644
--- a/ext/hash/config.w32
+++ b/ext/hash/config.w32
@@ -11,7 +11,7 @@ PHP_HASH = 'yes';
EXTENSION('hash', 'hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c ' +
'hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c ' +
'hash_adler32.c hash_crc32.c hash_joaat.c hash_fnv.c ' +
- 'hash_sha3.c', false);
+ 'hash_sha3.c hash_murmur.c', false);
var hash_sha3_dir = 'ext/hash/sha3/generic' + (X64 ? '64' : '32') + 'lc';
@@ -28,7 +28,14 @@ if (!CHECK_HEADER_ADD_INCLUDE('KeccakHash.h', 'CFLAGS_HASH', hash_sha3_dir)) {
ADD_FLAG('CFLAGS_HASH', '/DKeccakP200_excluded /DKeccakP400_excluded /DKeccakP800_excluded /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
+var hash_murmur_dir = 'ext/hash/murmur';
+if (!CHECK_HEADER_ADD_INCLUDE('PMurHash.h', 'CFLAGS_HASH', hash_murmur_dir)) {
+ ERROR('Unable to locate murmur headers');
+}
+ADD_SOURCES(hash_murmur_dir, 'PMurHash.c PMurHash128.c', 'hash');
+
PHP_INSTALL_HEADERS('ext/hash/', 'php_hash.h php_hash_md.h php_hash_sha.h ' +
'php_hash_ripemd.h php_hash_haval.h php_hash_tiger.h ' +
'php_hash_gost.h php_hash_snefru.h php_hash_whirlpool.h ' +
- 'php_hash_adler32.h php_hash_crc32.h php_hash_sha3.h');
+ 'php_hash_adler32.h php_hash_crc32.h php_hash_sha3.h ' +
+ 'php_hash_murmur.h');
diff --git a/ext/hash/hash.c b/ext/hash/hash.c
index 4e3820f35e..f7b851f5a4 100644
--- a/ext/hash/hash.c
+++ b/ext/hash/hash.c
@@ -52,7 +52,7 @@ struct mhash_bc_entry {
int value;
};
-#define MHASH_NUM_ALGOS 35
+#define MHASH_NUM_ALGOS 38
static struct mhash_bc_entry mhash_to_hash[MHASH_NUM_ALGOS] = {
{"CRC32", "crc32", 0}, /* used by bzip */
@@ -90,6 +90,9 @@ static struct mhash_bc_entry mhash_to_hash[MHASH_NUM_ALGOS] = {
{"FNV1A64", "fnv1a64", 32},
{"JOAAT", "joaat", 33},
{"CRC32C", "crc32c", 34}, /* Castagnoli's CRC, used by iSCSI, SCTP, Btrfs, ext4, etc */
+ {"MURMUR3A", "murmur3a", 35},
+ {"MURMUR3C", "murmur3c", 36},
+ {"MURMUR3F", "murmur3f", 37},
};
#endif
@@ -1586,6 +1589,9 @@ PHP_MINIT_FUNCTION(hash)
php_hash_register_algo("fnv164", &php_hash_fnv164_ops);
php_hash_register_algo("fnv1a64", &php_hash_fnv1a64_ops);
php_hash_register_algo("joaat", &php_hash_joaat_ops);
+ php_hash_register_algo("murmur3a", &php_hash_murmur3a_ops);
+ php_hash_register_algo("murmur3c", &php_hash_murmur3c_ops);
+ php_hash_register_algo("murmur3f", &php_hash_murmur3f_ops);
PHP_HASH_HAVAL_REGISTER(3,128);
PHP_HASH_HAVAL_REGISTER(3,160);
diff --git a/ext/hash/hash_murmur.c b/ext/hash/hash_murmur.c
new file mode 100644
index 0000000000..ab01b4f19f
--- /dev/null
+++ b/ext/hash/hash_murmur.c
@@ -0,0 +1,186 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Anatol Belski <ab@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "php_hash.h"
+#include "php_hash_murmur.h"
+
+#include "murmur/PMurHash.h"
+#include "murmur/PMurHash128.h"
+
+
+const php_hash_ops php_hash_murmur3a_ops = {
+ "murmur3a",
+ (php_hash_init_func_t) PHP_MURMUR3AInit,
+ (php_hash_update_func_t) PHP_MURMUR3AUpdate,
+ (php_hash_final_func_t) PHP_MURMUR3AFinal,
+ (php_hash_copy_func_t) PHP_MURMUR3ACopy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ PHP_MURMUR3A_SPEC,
+ 4,
+ 4,
+ sizeof(PHP_MURMUR3A_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx)
+{
+ ctx->h = 0;
+ ctx->carry = 0;
+ ctx->len = 0;
+}
+
+PHP_HASH_API void PHP_MURMUR3AUpdate(PHP_MURMUR3A_CTX *ctx, const unsigned char *in, size_t len)
+{
+ ctx->len += len;
+ PMurHash32_Process(&ctx->h, &ctx->carry, in, len);
+}
+
+PHP_HASH_API void PHP_MURMUR3AFinal(unsigned char digest[4], PHP_MURMUR3A_CTX *ctx)
+{
+ ctx->h = PMurHash32_Result(ctx->h, ctx->carry, ctx->len);
+
+ digest[0] = (unsigned char)((ctx->h >> 24) & 0xff);
+ digest[1] = (unsigned char)((ctx->h >> 16) & 0xff);
+ digest[2] = (unsigned char)((ctx->h >> 8) & 0xff);
+ digest[3] = (unsigned char)(ctx->h & 0xff);
+}
+
+PHP_HASH_API int PHP_MURMUR3ACopy(const php_hash_ops *ops, PHP_MURMUR3A_CTX *orig_context, PHP_MURMUR3A_CTX *copy_context)
+{
+ copy_context->h = orig_context->h;
+ copy_context->carry = orig_context->carry;
+ copy_context->len = orig_context->len;
+ return SUCCESS;
+}
+
+const php_hash_ops php_hash_murmur3c_ops = {
+ "murmur3c",
+ (php_hash_init_func_t) PHP_MURMUR3CInit,
+ (php_hash_update_func_t) PHP_MURMUR3CUpdate,
+ (php_hash_final_func_t) PHP_MURMUR3CFinal,
+ (php_hash_copy_func_t) PHP_MURMUR3CCopy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ PHP_MURMUR3C_SPEC,
+ 16,
+ 4,
+ sizeof(PHP_MURMUR3C_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx)
+{
+ memset(&ctx->h, 0, sizeof ctx->h);
+ memset(&ctx->carry, 0, sizeof ctx->carry);
+ ctx->len = 0;
+}
+
+PHP_HASH_API void PHP_MURMUR3CUpdate(PHP_MURMUR3C_CTX *ctx, const unsigned char *in, size_t len)
+{
+ ctx->len += len;
+ PMurHash128x86_Process(ctx->h, ctx->carry, in, len);
+}
+
+PHP_HASH_API void PHP_MURMUR3CFinal(unsigned char digest[4], PHP_MURMUR3C_CTX *ctx)
+{
+ uint32_t h[4] = {0, 0, 0, 0};
+ PMurHash128x86_Result(ctx->h, ctx->carry, ctx->len, h);
+
+ digest[0] = (unsigned char)((h[0] >> 24) & 0xff);
+ digest[1] = (unsigned char)((h[0] >> 16) & 0xff);
+ digest[2] = (unsigned char)((h[0] >> 8) & 0xff);
+ digest[3] = (unsigned char)(h[0] & 0xff);
+ digest[4] = (unsigned char)((h[1] >> 24) & 0xff);
+ digest[5] = (unsigned char)((h[1] >> 16) & 0xff);
+ digest[6] = (unsigned char)((h[1] >> 8) & 0xff);
+ digest[7] = (unsigned char)(h[1] & 0xff);
+ digest[8] = (unsigned char)((h[2] >> 24) & 0xff);
+ digest[9] = (unsigned char)((h[2] >> 16) & 0xff);
+ digest[10] = (unsigned char)((h[2] >> 8) & 0xff);
+ digest[11] = (unsigned char)(h[2] & 0xff);
+ digest[12] = (unsigned char)((h[3] >> 24) & 0xff);
+ digest[13] = (unsigned char)((h[3] >> 16) & 0xff);
+ digest[14] = (unsigned char)((h[3] >> 8) & 0xff);
+ digest[15] = (unsigned char)(h[3] & 0xff);
+}
+
+PHP_HASH_API int PHP_MURMUR3CCopy(const php_hash_ops *ops, PHP_MURMUR3C_CTX *orig_context, PHP_MURMUR3C_CTX *copy_context)
+{
+ memcpy(&copy_context->h, &orig_context->h, sizeof orig_context->h);
+ memcpy(&copy_context->carry, &orig_context->carry, sizeof orig_context->carry);
+ copy_context->len = orig_context->len;
+ return SUCCESS;
+}
+
+const php_hash_ops php_hash_murmur3f_ops = {
+ "murmur3f",
+ (php_hash_init_func_t) PHP_MURMUR3FInit,
+ (php_hash_update_func_t) PHP_MURMUR3FUpdate,
+ (php_hash_final_func_t) PHP_MURMUR3FFinal,
+ (php_hash_copy_func_t) PHP_MURMUR3FCopy,
+ php_hash_serialize,
+ php_hash_unserialize,
+ PHP_MURMUR3F_SPEC,
+ 16,
+ 8,
+ sizeof(PHP_MURMUR3F_CTX),
+ 0
+};
+
+PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx)
+{
+ memset(&ctx->h, 0, sizeof ctx->h);
+ memset(&ctx->carry, 0, sizeof ctx->carry);
+ ctx->len = 0;
+}
+
+PHP_HASH_API void PHP_MURMUR3FUpdate(PHP_MURMUR3F_CTX *ctx, const unsigned char *in, size_t len)
+{
+ ctx->len += len;
+ PMurHash128x64_Process(ctx->h, ctx->carry, in, len);
+}
+
+PHP_HASH_API void PHP_MURMUR3FFinal(unsigned char digest[4], PHP_MURMUR3F_CTX *ctx)
+{
+ uint64_t h[2] = {0, 0};
+ PMurHash128x64_Result(ctx->h, ctx->carry, ctx->len, h);
+
+ digest[0] = (unsigned char)((h[0] >> 56) & 0xff);
+ digest[1] = (unsigned char)((h[0] >> 48) & 0xff);
+ digest[2] = (unsigned char)((h[0] >> 40) & 0xff);
+ digest[3] = (unsigned char)((h[0] >> 32) & 0xff);
+ digest[4] = (unsigned char)((h[0] >> 24) & 0xff);
+ digest[5] = (unsigned char)((h[0] >> 16) & 0xff);
+ digest[6] = (unsigned char)((h[0] >> 8) & 0xff);
+ digest[7] = (unsigned char)(h[0] & 0xff);
+ digest[8] = (unsigned char)((h[1] >> 56) & 0xff);
+ digest[9] = (unsigned char)((h[1] >> 48) & 0xff);
+ digest[10] = (unsigned char)((h[1] >> 40) & 0xff);
+ digest[11] = (unsigned char)((h[1] >> 32) & 0xff);
+ digest[12] = (unsigned char)((h[1] >> 24) & 0xff);
+ digest[13] = (unsigned char)((h[1] >> 16) & 0xff);
+ digest[14] = (unsigned char)((h[1] >> 8) & 0xff);
+ digest[15] = (unsigned char)(h[1] & 0xff);
+}
+
+PHP_HASH_API int PHP_MURMUR3FCopy(const php_hash_ops *ops, PHP_MURMUR3F_CTX *orig_context, PHP_MURMUR3F_CTX *copy_context)
+{
+ memcpy(&copy_context->h, &orig_context->h, sizeof orig_context->h);
+ memcpy(&copy_context->carry, &orig_context->carry, sizeof orig_context->carry);
+ copy_context->len = orig_context->len;
+ return SUCCESS;
+}
diff --git a/ext/hash/murmur/PMurHash.c b/ext/hash/murmur/PMurHash.c
new file mode 100644
index 0000000000..0716ca13c8
--- /dev/null
+++ b/ext/hash/murmur/PMurHash.c
@@ -0,0 +1,226 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This implementation was written by Shane Day, and is also public domain.
+ *
+ * This is a portable ANSI C implementation of MurmurHash3_x86_32 (Murmur3A)
+ * with support for progressive processing.
+ */
+
+/*-----------------------------------------------------------------------------
+
+If you want to understand the MurmurHash algorithm you would be much better
+off reading the original source. Just point your browser at:
+http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
+
+
+What this version provides?
+
+1. Progressive data feeding. Useful when the entire payload to be hashed
+does not fit in memory or when the data is streamed through the application.
+Also useful when hashing a number of strings with a common prefix. A partial
+hash of a prefix string can be generated and reused for each suffix string.
+
+How does it work?
+
+We can only process entire 32 bit chunks of input, except for the very end
+that may be shorter. So along with the partial hash we need to give back to
+the caller a carry containing up to 3 bytes that we were unable to process.
+This carry also needs to record the number of bytes the carry holds. I use
+the low 2 bits as a count (0..3) and the carry bytes are shifted into the
+high byte in stream order.
+
+To handle endianess I simply use a macro that reads a uint32_t and define
+that macro to be a direct read on little endian machines, a read and swap
+on big endian machines, or a byte-by-byte read if the endianess is unknown.
+
+-----------------------------------------------------------------------------*/
+
+
+#include "PMurHash.h"
+
+// /* MSVC warnings we choose to ignore */
+// #if defined(_MSC_VER)
+// #pragma warning(disable: 4127) /* conditional expression is constant */
+// #endif
+
+/*-----------------------------------------------------------------------------
+ * Endianess, misalignment capabilities and util macros
+ *
+ * The following 3 macros are defined in this section. The other macros defined
+ * are only needed to help derive these 3.
+ *
+ * READ_UINT32(x) Read a little endian unsigned 32-bit int
+ * UNALIGNED_SAFE Defined if READ_UINT32 works on non-word boundaries
+ * ROTL32(x,r) Rotate x left by r bits
+ */
+
+/* I386 or AMD64 */
+#if defined(_M_I86) || defined(_M_IX86) || defined(_X86_) || defined(__i386__) || defined(__i386) || defined(i386) \
+ || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64)
+ #define UNALIGNED_SAFE
+#endif
+/* I386 or AMD64 */
+#if defined(_M_I86) || defined(_M_IX86) || defined(_X86_) || defined(__i386__) || defined(__i386) || defined(i386) \
+ || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64)
+ #define UNALIGNED_SAFE
+#endif
+
+/* Find best way to ROTL */
+#if defined(_MSC_VER)
+ #define FORCE_INLINE static __forceinline
+ #include <stdlib.h> /* Microsoft put _rotl declaration in here */
+ #define ROTL32(x,y) _rotl(x,y)
+#else
+ #define FORCE_INLINE static inline __attribute__((always_inline))
+ /* gcc recognises this code and generates a rotate instruction for CPUs with one */
+ #define ROTL32(x,r) (((uint32_t)x << r) | ((uint32_t)x >> (32 - r)))
+#endif
+
+#include "endianness.h"
+
+#define READ_UINT32(ptr) getblock32((uint32_t *)ptr, 0)
+
+/*-----------------------------------------------------------------------------
+ * Core murmurhash algorithm macros */
+
+static const uint32_t kC1 = 0xcc9e2d51;
+static const uint32_t kC2 = 0x1b873593;
+
+/* This is the main processing body of the algorithm. It operates
+ * on each full 32-bits of input. */
+#define doblock(h1, k1) \
+do {\
+ k1 *= kC1;\
+ k1 = ROTL32(k1,15);\
+ k1 *= kC2;\
+\
+ h1 ^= k1;\
+ h1 = ROTL32(h1,13);\
+ h1 = h1*5+0xe6546b64;\
+} while(0)
+
+/* Append unaligned bytes to carry, forcing hash churn if we have 4 bytes */
+/* cnt=bytes to process, h1=name of h1 var, c=carry, n=bytes in c, ptr/len=payload */
+#define dobytes(cnt, h1, c, n, ptr, len) \
+do {\
+ unsigned __cnt = cnt;\
+ while(__cnt--) {\
+ c = c>>8 | (uint32_t)*ptr++<<24;\
+ n++; len--;\
+ if(n==4) {\
+ doblock(h1, c);\
+ n = 0;\
+ }\
+ }\
+} while(0)
+
+/*---------------------------------------------------------------------------*/
+
+/* Main hashing function. Initialise carry to 0 and h1 to 0 or an initial seed
+ * if wanted. Both ph1 and pcarry are required arguments. */
+void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int len)
+{
+ uint32_t h1 = *ph1;
+ uint32_t c = *pcarry;
+
+ const uint8_t *ptr = (uint8_t*)key;
+ const uint8_t *end;
+
+ /* Extract carry count from low 2 bits of c value */
+ int n = c & 3;
+
+#if defined(UNALIGNED_SAFE)
+ /* This CPU handles unaligned word access */
+// #pragma message ( "UNALIGNED_SAFE" )
+ /* Consume any carry bytes */
+ int i = (4-n) & 3;
+ if(i && i <= len) {
+ dobytes(i, h1, c, n, ptr, len);
+ }
+
+ /* Process 32-bit chunks */
+ end = ptr + (len & ~3);
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = READ_UINT32(ptr);
+ doblock(h1, k1);
+ }
+
+#else /*UNALIGNED_SAFE*/
+ /* This CPU does not handle unaligned word access */
+// #pragma message ( "ALIGNED" )
+ /* Consume enough so that the next data byte is word aligned */
+ int i = -(intptr_t)(void *)ptr & 3;
+ if(i && i <= len) {
+ dobytes(i, h1, c, n, ptr, len);
+ }
+
+ /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */
+ end = ptr + (len & ~3);
+ switch(n) { /* how many bytes in c */
+ case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = READ_UINT32(ptr);
+ doblock(h1, k1);
+ }
+ break;
+ case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = c>>24;
+ c = READ_UINT32(ptr);
+ k1 |= c<<8;
+ doblock(h1, k1);
+ }
+ break;
+ case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = c>>16;
+ c = READ_UINT32(ptr);
+ k1 |= c<<16;
+ doblock(h1, k1);
+ }
+ break;
+ case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */
+ for( ; ptr < end ; ptr+=4) {
+ uint32_t k1 = c>>8;
+ c = READ_UINT32(ptr);
+ k1 |= c<<24;
+ doblock(h1, k1);
+ }
+ }
+#endif /*UNALIGNED_SAFE*/
+
+ /* Advance over whole 32-bit chunks, possibly leaving 1..3 bytes */
+ len -= len & ~3;
+
+ /* Append any remaining bytes into carry */
+ dobytes(len, h1, c, n, ptr, len);
+
+ /* Copy out new running hash and carry */
+ *ph1 = h1;
+ *pcarry = (c & ~0xff) | n;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* Finalize a hash. To match the original Murmur3A the total_length must be provided */
+uint32_t PMurHash32_Result(uint32_t h, uint32_t carry, uint32_t total_length)
+{
+ uint32_t k1;
+ int n = carry & 3;
+ if(n) {
+ k1 = carry >> (4-n)*8;
+ k1 *= kC1; k1 = ROTL32(k1,15); k1 *= kC2; h ^= k1;
+ }
+ h ^= total_length;
+
+ /* fmix */
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+
+ return h;
+}
diff --git a/ext/hash/murmur/PMurHash.h b/ext/hash/murmur/PMurHash.h
new file mode 100644
index 0000000000..f80eb11f40
--- /dev/null
+++ b/ext/hash/murmur/PMurHash.h
@@ -0,0 +1,31 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This implementation was written by Shane Day, and is also public domain.
+ *
+ * This implementation was modified to match PMurHash128.cpp.
+ */
+
+/* ------------------------------------------------------------------------- */
+
+// Microsoft Visual Studio
+
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+
+// Other compilers
+
+#else // defined(_MSC_VER)
+
+#include <stdint.h>
+
+#endif // !defined(_MSC_VER)
+
+/* ------------------------------------------------------------------------- */
+/* Prototypes */
+
+void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int len);
+uint32_t PMurHash32_Result(uint32_t h1, uint32_t carry, uint32_t total_length);
diff --git a/ext/hash/murmur/PMurHash128.c b/ext/hash/murmur/PMurHash128.c
new file mode 100644
index 0000000000..2856542190
--- /dev/null
+++ b/ext/hash/murmur/PMurHash128.c
@@ -0,0 +1,640 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This is a c++ implementation of MurmurHash3_128 with support for progressive
+ * processing based on PMurHash implementation written by Shane Day.
+ */
+
+/*-----------------------------------------------------------------------------
+
+If you want to understand the MurmurHash algorithm you would be much better
+off reading the original source. Just point your browser at:
+http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
+
+
+What this version provides?
+
+1. Progressive data feeding. Useful when the entire payload to be hashed
+does not fit in memory or when the data is streamed through the application.
+Also useful when hashing a number of strings with a common prefix. A partial
+hash of a prefix string can be generated and reused for each suffix string.
+
+How does it work?
+
+We can only process entire 128 bit chunks of input, except for the very end
+that may be shorter. So along with the partial hash we need to give back to
+the caller a carry containing up to 15 bytes that we were unable to process.
+This carry also needs to record the number of bytes the carry holds. I use
+the low 4 bits as a count (0..15) and the carry bytes are shifted into the
+high byte in stream order.
+
+To handle endianess I simply use a macro that reads an uint and define
+that macro to be a direct read on little endian machines, a read and swap
+on big endian machines.
+
+-----------------------------------------------------------------------------*/
+
+
+#include "PMurHash128.h"
+
+/*-----------------------------------------------------------------------------
+ * Endianess, misalignment capabilities and util macros
+ *
+ * The following 5 macros are defined in this section. The other macros defined
+ * are only needed to help derive these 5.
+ *
+ * READ_UINT32(x,i) Read a little endian unsigned 32-bit int at index
+ * READ_UINT64(x,i) Read a little endian unsigned 64-bit int at index
+ * UNALIGNED_SAFE Defined if READ_UINTXX works on non-word boundaries
+ * ROTL32(x,r) Rotate x left by r bits
+ * ROTL64(x,r) Rotate x left by r bits
+ * BIG_CONSTANT
+ * FORCE_INLINE
+ */
+
+/* I386 or AMD64 */
+#if defined(_M_I86) || defined(_M_IX86) || defined(_X86_) || defined(__i386__) || defined(__i386) || defined(i386) \
+ || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64)
+ #define UNALIGNED_SAFE
+#endif
+
+/* Find best way to ROTL */
+#if defined(_MSC_VER)
+ #define FORCE_INLINE static __forceinline
+ #include <stdlib.h> /* Microsoft put _rotl declaration in here */
+ #define ROTL32(x,y) _rotl(x,y)
+ #define ROTL64(x,y) _rotl64(x,y)
+ #define BIG_CONSTANT(x) (x)
+#else
+ #define FORCE_INLINE static inline __attribute__((always_inline))
+ /* gcc recognises this code and generates a rotate instruction for CPUs with one */
+ #define ROTL32(x,r) (((uint32_t)x << r) | ((uint32_t)x >> (32 - r)))
+ #define ROTL64(x,r) (((uint64_t)x << r) | ((uint64_t)x >> (64 - r)))
+ #define BIG_CONSTANT(x) (x##LLU)
+#endif
+
+#include "endianness.h"
+
+#define READ_UINT64(ptr,i) getblock64((uint64_t *)ptr,i)
+#define READ_UINT32(ptr,i) getblock32((uint32_t *)ptr,i)
+
+//-----------------------------------------------------------------------------
+// Finalization mix - force all bits of a hash block to avalanche
+
+FORCE_INLINE uint32_t fmix32 ( uint32_t h )
+{
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+
+ return h;
+}
+
+//----------
+
+FORCE_INLINE uint64_t fmix64 ( uint64_t k )
+{
+ k ^= k >> 33;
+ k *= BIG_CONSTANT(0xff51afd7ed558ccd);
+ k ^= k >> 33;
+ k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53);
+ k ^= k >> 33;
+
+ return k;
+}
+
+/*-----------------------------------------------------------------------------*
+ PMurHash128x86
+ *-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------
+ * Core murmurhash algorithm macros */
+
+static const uint32_t kC1 = 0x239b961b;
+static const uint32_t kC2 = 0xab0e9789;
+static const uint32_t kC3 = 0x38b34ae5;
+static const uint32_t kC4 = 0xa1e38b93;
+
+/* This is the main processing body of the algorithm. It operates
+ * on each full 128-bits of input. */
+#define doblock128x86(h1, h2, h3, h4, k1, k2, k3,k4)\
+do {\
+ k1 *= kC1; k1 = ROTL32(k1,15); k1 *= kC2; h1 ^= k1;\
+\
+ h1 = ROTL32(h1,19); h1 += h2; h1 = h1*5+0x561ccd1b;\
+\
+ k2 *= kC2; k2 = ROTL32(k2,16); k2 *= kC3; h2 ^= k2;\
+\
+ h2 = ROTL32(h2,17); h2 += h3; h2 = h2*5+0x0bcaa747;\
+\
+ k3 *= kC3; k3 = ROTL32(k3,17); k3 *= kC4; h3 ^= k3;\
+\
+ h3 = ROTL32(h3,15); h3 += h4; h3 = h3*5+0x96cd1c35;\
+\
+ k4 *= kC4; k4 = ROTL32(k4,18); k4 *= kC1; h4 ^= k4;\
+\
+ h4 = ROTL32(h4,13); h4 += h1; h4 = h4*5+0x32ac3b17;\
+} while(0)
+
+/* Append unaligned bytes to carry, forcing hash churn if we have 16 bytes */
+/* cnt=bytes to process, h1-h4=hash k1-k4=carry, n=bytes in carry, ptr/len=payload */
+#define dobytes128x86(cnt, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len)\
+do {\
+ unsigned __cnt = cnt;\
+ for(;__cnt--; len--) {\
+ switch(n) {\
+ case 0: case 1: case 2: case 3:\
+ k1 = k1>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 4: case 5: case 6: case 7:\
+ k2 = k2>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 8: case 9: case 10: case 11:\
+ k3 = k3>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 12: case 13: case 14:\
+ k4 = k4>>8 | (uint32_t)*ptr++<<24;\
+ ++n; break;\
+\
+ case 15:\
+ k4 = k4>>8 | (uint32_t)*ptr++<<24;\
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);\
+ n = 0; break;\
+ }\
+ }\
+} while(0)
+
+/* Finalize a hash. To match the original Murmur3_128x86 the total_length must be provided */
+void PMurHash128x86_Result(const uint32_t *ph, const uint32_t *pcarry, uint32_t total_length, uint32_t *out)
+{
+ uint32_t h1 = ph[0];
+ uint32_t h2 = ph[1];
+ uint32_t h3 = ph[2];
+ uint32_t h4 = ph[3];
+
+ uint32_t k1, k2, k3, k4 = pcarry[3];
+
+ int n = k4 & 15;
+ switch(n) {
+ case 1: case 2: case 3: case 4:
+ k1 = pcarry[0] >> (4-n)*8;
+ goto finrot_k1;
+
+ case 5: case 6: case 7: case 8:
+ k2 = pcarry[1] >> (8-n)*8;
+ goto finrot_k21;
+
+ case 9: case 10: case 11: case 12:
+ k3 = pcarry[2] >> (12-n)*8;
+ goto finrot_k321;
+
+ case 13: case 14: case 15:
+ k4 >>= (16-n)*8;
+ goto finrot_k4321;
+
+ default:
+ goto skiprot;
+ }
+finrot_k4321:
+ k4 *= kC4; k4 = ROTL32(k4,18); k4 *= kC1; h4 ^= k4;
+ k3 = pcarry[2];
+finrot_k321:
+ k3 *= kC3; k3 = ROTL32(k3,17); k3 *= kC4; h3 ^= k3;
+ k2 = pcarry[1];
+finrot_k21:
+ k2 *= kC2; k2 = ROTL32(k2,16); k2 *= kC3; h2 ^= k2;
+ k1 = pcarry[0];
+finrot_k1:
+ k1 *= kC1; k1 = ROTL32(k1,15); k1 *= kC2; h1 ^= k1;
+skiprot:
+
+ //----------
+ // finalization
+
+ h1 ^= total_length; h2 ^= total_length;
+ h3 ^= total_length; h4 ^= total_length;
+
+ h1 += h2; h1 += h3; h1 += h4;
+ h2 += h1; h3 += h1; h4 += h1;
+
+ h1 = fmix32(h1);
+ h2 = fmix32(h2);
+ h3 = fmix32(h3);
+ h4 = fmix32(h4);
+
+ h1 += h2; h1 += h3; h1 += h4;
+ h2 += h1; h3 += h1; h4 += h1;
+
+ out[0] = h1;
+ out[1] = h2;
+ out[2] = h3;
+ out[3] = h4;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* Main hashing function. Initialise carry[4] to {0,0,0,0} and h[4] to an initial {seed,seed,seed,seed}
+ * if wanted. Both ph and pcarry are required arguments. */
+void PMurHash128x86_Process(uint32_t * const ph, uint32_t * const pcarry, const void * const key, int len)
+{
+ uint32_t h1 = ph[0];
+ uint32_t h2 = ph[1];
+ uint32_t h3 = ph[2];
+ uint32_t h4 = ph[3];
+
+ uint32_t k1 = pcarry[0];
+ uint32_t k2 = pcarry[1];
+ uint32_t k3 = pcarry[2];
+ uint32_t k4 = pcarry[3];
+
+ const uint8_t *ptr = (uint8_t*)key;
+ const uint8_t *end;
+
+ /* Extract carry count from low 4 bits of c value */
+ int n = k4 & 15;
+
+#if defined(UNALIGNED_SAFE)
+ /* This CPU handles unaligned word access */
+// #pragma message ( "UNALIGNED_SAFE" )
+ /* Consume any carry bytes */
+ int i = (16-n) & 15;
+ if(i && i <= len) {
+ dobytes128x86(i, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len);
+ }
+
+ /* Process 128-bit chunks */
+ end = ptr + (len & ~15);
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT32(ptr, 0);
+ k2 = READ_UINT32(ptr, 1);
+ k3 = READ_UINT32(ptr, 2);
+ k4 = READ_UINT32(ptr, 3);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ }
+
+#else /*UNALIGNED_SAFE*/
+ /* This CPU does not handle unaligned word access */
+// #pragma message ( "ALIGNED" )
+ /* Consume enough so that the next data byte is word aligned */
+ int i = -(intptr_t)(void *)ptr & 3;
+ if(i && i <= len) {
+ dobytes128x86(i, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len);
+ }
+ /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */
+ end = ptr + (len & ~15);
+
+ switch(n) { /* how many bytes in c */
+ case 0: /*
+ k1=[----] k2=[----] k2=[----] k4=[----] w=[3210 7654 ba98 fedc] b=[3210 7654 ba98 fedc] */
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT32(ptr, 0);
+ k2 = READ_UINT32(ptr, 1);
+ k3 = READ_UINT32(ptr, 2);
+ k4 = READ_UINT32(ptr, 3);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ }
+ break;
+ case 1: case 2: case 3: /*
+ k1=[10--] k2=[----] k3=[----] k4=[----] w=[5432 9876 dcba hgfe] b=[3210 7654 ba98 fedc] k1'=[hg--] */
+ {
+ const int lshift = n*8, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k1>>rshift; // --10
+ k2 = READ_UINT32(ptr, 0); // 5432
+ c |= k2<<lshift; // 3210.
+ k1 = READ_UINT32(ptr, 1); // 9876
+ k2 = k1<<lshift | k2>>rshift; // 7654.
+ k4 = READ_UINT32(ptr, 2); // dcba
+ k3 = k4<<lshift | k1>>rshift; // ba98.
+ k1 = READ_UINT32(ptr, 3); // hgfe.
+ k4 = k1<<lshift | k4>>rshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, c, k2, k3, k4);
+ }
+ }
+ break;
+ case 4: /*
+ k1=[3210] k2=[----] k3=[----] k4=[----] w=[7654 ba98 fedc jihg] b=[3210 7654 ba98 fedc] k1'=[jihg] */
+ for( ; ptr < end ; ptr+=16) {
+ k2 = READ_UINT32(ptr, 0);
+ k3 = READ_UINT32(ptr, 1);
+ k4 = READ_UINT32(ptr, 2);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ k1 = READ_UINT32(ptr, 3);
+ }
+ break;
+ case 5: case 6: case 7: /*
+ k1=[3210] k2=[54--] k3=[----] k4=[----] w=[9876 dcba hgfe lkji] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[lk--] */
+ {
+ const int lshift = n*8-32, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k2>>rshift; // --54
+ k3 = READ_UINT32(ptr, 0); // 9876
+ c |= k3<<lshift; // 7654.
+ k4 = READ_UINT32(ptr, 1); // dcba
+ k3 = k4<<lshift | k3>>rshift; // ba98.
+ k2 = READ_UINT32(ptr, 2); // hgfe
+ k4 = k2<<lshift | k4>>rshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, k1, c, k3, k4);
+ k1 = k2>>rshift; // --hg
+ k2 = READ_UINT32(ptr, 3); // lkji.
+ k1 |= k2<<lshift; // jihg.
+ }
+ }
+ case 8: /*
+ k1=[3210] k2=[7654] k3=[----] k4=[----] w=[ba98 fedc jihg nmlk] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] */
+ for( ; ptr < end ; ptr+=16) {
+ k3 = READ_UINT32(ptr, 0);
+ k4 = READ_UINT32(ptr, 1);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ k1 = READ_UINT32(ptr, 2);
+ k2 = READ_UINT32(ptr, 3);
+ }
+ break;
+ case 9: case 10: case 11: /*
+ k1=[3210] k2=[7654] k3=[98--] k4=[----] w=[dcba hgfe lkji ponm] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] k3'=[po--] */
+ {
+ const int lshift = n*8-64, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k3>>rshift; // --98
+ k4 = READ_UINT32(ptr, 0); // dcba
+ c |= k4<<lshift; // ba98.
+ k3 = READ_UINT32(ptr, 1); // hgfe
+ k4 = k3<<lshift | k4>>rshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, k1, k2, c, k4);
+ k2 = READ_UINT32(ptr, 2); // lkji
+ k1 = k2<<lshift | k3>>rshift; // jihg.
+ k3 = READ_UINT32(ptr, 3); // ponm.
+ k2 = k3<<lshift | k2>>rshift; // nmlk.
+ }
+ }
+ case 12: /*
+ k1=[3210] k2=[7654] k3=[ba98] k4=[----] w=[fedc jihg nmlk rqpo] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] k3'=[rqpo] */
+ for( ; ptr < end ; ptr+=16) {
+ k4 = READ_UINT32(ptr, 0);
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, k4);
+ k1 = READ_UINT32(ptr, 1);
+ k2 = READ_UINT32(ptr, 2);
+ k3 = READ_UINT32(ptr, 3);
+ }
+ break;
+ default: /* 12 < n <= 15
+ k1=[3210] k2=[7654] k3=[ba98] k4=[dc--] w=[hgfe lkji ponm tsrq] b=[3210 7654 ba98 fedc] k1'=[jihg] k2'=[nmlk] k3'=[rqpo] k3'=[ts--] */
+ {
+ const int lshift = n*8-96, rshift = 32-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint32_t c = k4>>rshift; // --dc
+ k4 = READ_UINT32(ptr, 0); // hgfe
+ c |= k4<<lshift; // fedc.
+ doblock128x86(h1, h2, h3, h4, k1, k2, k3, c);
+ k3 = READ_UINT32(ptr, 1); // lkji
+ k1 = k3<<lshift | k4>>rshift; // jihg.
+ c = READ_UINT32(ptr, 2); // ponm
+ k2 = c<<lshift | k3>>rshift; // nmlk.
+ k4 = READ_UINT32(ptr, 3); // tsrq.
+ k3 = k4<<lshift | c>>rshift; // rqpo.
+ }
+ }
+ }
+#endif /*UNALIGNED_SAFE*/
+
+ /* Advance over whole 128-bit chunks, possibly leaving 1..15 bytes */
+ len -= len & ~15;
+
+ /* Append any remaining bytes into carry */
+ dobytes128x86(len, h1, h2, h3, h4, k1, k2, k3, k4, n, ptr, len);
+
+ /* Copy out new running hash and carry */
+ ph[0] = h1;
+ ph[1] = h2;
+ ph[2] = h3;
+ ph[3] = h4;
+ pcarry[0] = k1;
+ pcarry[1] = k2;
+ pcarry[2] = k3;
+ pcarry[3] = (k4 & ~0xff) | n;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* All in one go */
+
+/* MurmurHash3_x86_128 api */
+void PMurHash128x86(const void * key, const int len, uint32_t seed, void * out)
+{
+ uint32_t carry[4] = {0, 0, 0, 0};
+ uint32_t h[4] = {seed, seed, seed, seed};
+ PMurHash128x86_Process(h, carry, key, len);
+ PMurHash128x86_Result(h, carry, (uint32_t) len, (uint32_t *) out);
+}
+
+/*-----------------------------------------------------------------------------*
+ PMurHash128x64
+ *-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------
+ * Core murmurhash algorithm macros */
+
+static const uint64_t kC1L = BIG_CONSTANT(0x87c37b91114253d5);
+static const uint64_t kC2L = BIG_CONSTANT(0x4cf5ad432745937f);
+
+/* This is the main processing body of the algorithm. It operates
+ * on each full 128-bits of input. */
+#define doblock128x64(h1, h2, k1, k2)\
+do {\
+ k1 *= kC1L; k1 = ROTL64(k1,31); k1 *= kC2L; h1 ^= k1;\
+\
+ h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729;\
+\
+ k2 *= kC2L; k2 = ROTL64(k2,33); k2 *= kC1L; h2 ^= k2;\
+\
+ h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5;\
+} while(0)
+
+/* Append unaligned bytes to carry, forcing hash churn if we have 16 bytes */
+/* cnt=bytes to process, h1,h2=hash k1,k2=carry, n=bytes in carry, ptr/len=payload */
+#define dobytes128x64(cnt, h1, h2, k1, k2, n, ptr, len) \
+do {\
+ unsigned __cnt = cnt;\
+ for(;__cnt--; len--) {\
+ switch(n) {\
+ case 0: case 1: case 2: case 3:\
+ case 4: case 5: case 6: case 7:\
+ k1 = k1>>8 | (uint64_t)*ptr++<<56;\
+ n++; break;\
+\
+ case 8: case 9: case 10: case 11:\
+ case 12: case 13: case 14:\
+ k2 = k2>>8 | (uint64_t)*ptr++<<56;\
+ n++; break;\
+\
+ case 15:\
+ k2 = k2>>8 | (uint64_t)*ptr++<<56;\
+ doblock128x64(h1, h2, k1, k2);\
+ n = 0; break;\
+ }\
+ }\
+} while(0)
+
+/* Finalize a hash. To match the original Murmur3_128x64 the total_length must be provided */
+void PMurHash128x64_Result(const uint64_t * const ph, const uint64_t * const pcarry,
+ const uint32_t total_length, uint64_t * const out)
+{
+ uint64_t h1 = ph[0];
+ uint64_t h2 = ph[1];
+
+ uint64_t k1;
+ uint64_t k2 = pcarry[1];
+
+ int n = k2 & 15;
+ if (n) {
+ k1 = pcarry[0];
+ if (n > 8) {
+ k2 >>= (16-n)*8;
+ k2 *= kC2L; k2 = ROTL64(k2,33); k2 *= kC1L; h2 ^= k2;
+ } else {
+ k1 >>= (8-n)*8;
+ }
+ k1 *= kC1L; k1 = ROTL64(k1,31); k1 *= kC2L; h1 ^= k1;
+ }
+
+ //----------
+ // finalization
+
+ h1 ^= total_length; h2 ^= total_length;
+
+ h1 += h2;
+ h2 += h1;
+
+ h1 = fmix64(h1);
+ h2 = fmix64(h2);
+
+ h1 += h2;
+ h2 += h1;
+
+ out[0] = h1;
+ out[1] = h2;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* Main hashing function. Initialise carry[2] to {0,0} and h[2] to an initial {seed,seed}
+ * if wanted. Both ph and pcarry are required arguments. */
+void PMurHash128x64_Process(uint64_t * const ph, uint64_t * const pcarry, const void * const key, int len)
+{
+ uint64_t h1 = ph[0];
+ uint64_t h2 = ph[1];
+
+ uint64_t k1 = pcarry[0];
+ uint64_t k2 = pcarry[1];
+
+ const uint8_t *ptr = (uint8_t*)key;
+ const uint8_t *end;
+
+ /* Extract carry count from low 4 bits of c value */
+ int n = k2 & 15;
+
+#if defined(UNALIGNED_SAFE)
+ /* This CPU handles unaligned word access */
+// #pragma message ( "UNALIGNED_SAFE" )
+ /* Consume any carry bytes */
+ int i = (16-n) & 15;
+ if(i && i <= len) {
+ dobytes128x64(i, h1, h2, k1, k2, n, ptr, len);
+ }
+
+ /* Process 128-bit chunks */
+ end = ptr + (len & ~15);
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT64(ptr, 0);
+ k2 = READ_UINT64(ptr, 1);
+ doblock128x64(h1, h2, k1, k2);
+ }
+
+#else /*UNALIGNED_SAFE*/
+ /* This CPU does not handle unaligned word access */
+// #pragma message ( "ALIGNED" )
+ /* Consume enough so that the next data byte is word aligned */
+ int i = -(intptr_t)(void *)ptr & 7;
+ if(i && i <= len) {
+ dobytes128x64(i, h1, h2, k1, k2, n, ptr, len);
+ }
+ /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */
+ end = ptr + (len & ~15);
+
+ switch(n) { /* how many bytes in c */
+ case 0: /*
+ k1=[--------] k2=[--------] w=[76543210 fedcba98] b=[76543210 fedcba98] */
+ for( ; ptr < end ; ptr+=16) {
+ k1 = READ_UINT64(ptr, 0);
+ k2 = READ_UINT64(ptr, 1);
+ doblock128x64(h1, h2, k1, k2);
+ }
+ break;
+ case 1: case 2: case 3: case 4: case 5: case 6: case 7: /*
+ k1=[10------] k2=[--------] w=[98765432 hgfedcba] b=[76543210 fedcba98] k1'=[hg------] */
+ {
+ const int lshift = n*8, rshift = 64-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint64_t c = k1>>rshift;
+ k2 = READ_UINT64(ptr, 0);
+ c |= k2<<lshift;
+ k1 = READ_UINT64(ptr, 1);
+ k2 = k2>>rshift | k1<<lshift;
+ doblock128x64(h1, h2, c, k2);
+ }
+ }
+ break;
+ case 8: /*
+ k1=[76543210] k2=[--------] w=[fedcba98 nmlkjihg] b=[76543210 fedcba98] k1`=[nmlkjihg] */
+ for( ; ptr < end ; ptr+=16) {
+ k2 = READ_UINT64(ptr, 0);
+ doblock128x64(h1, h2, k1, k2);
+ k1 = READ_UINT64(ptr, 1);
+ }
+ break;
+ default: /* 8 < n <= 15
+ k1=[76543210] k2=[98------] w=[hgfedcba ponmlkji] b=[76543210 fedcba98] k1`=[nmlkjihg] k2`=[po------] */
+ {
+ const int lshift = n*8-64, rshift = 64-lshift;
+ for( ; ptr < end ; ptr+=16) {
+ uint64_t c = k2 >> rshift;
+ k2 = READ_UINT64(ptr, 0);
+ c |= k2 << lshift;
+ doblock128x64(h1, h2, k1, c);
+ k1 = k2 >> rshift;
+ k2 = READ_UINT64(ptr, 1);
+ k1 |= k2 << lshift;
+ }
+ }
+ }
+#endif /*UNALIGNED_SAFE*/
+
+ /* Advance over whole 128-bit chunks, possibly leaving 1..15 bytes */
+ len -= len & ~15;
+
+ /* Append any remaining bytes into carry */
+ dobytes128x64(len, h1, h2, k1, k2, n, ptr, len);
+
+ /* Copy out new running hash and carry */
+ ph[0] = h1;
+ ph[1] = h2;
+ pcarry[0] = k1;
+ pcarry[1] = (k2 & ~0xff) | n;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* All in one go */
+
+/* MurmurHash3_x64_128 api */
+void PMurHash128x64(const void * key, const int len, uint32_t seed, void * out)
+{
+ uint64_t carry[2] = {0, 0};
+ uint64_t h[2] = {seed, seed};
+ PMurHash128x64_Process(h, carry, key, len);
+ PMurHash128x64_Result(h, carry, (uint32_t) len, (uint64_t *) out);
+}
diff --git a/ext/hash/murmur/PMurHash128.h b/ext/hash/murmur/PMurHash128.h
new file mode 100644
index 0000000000..0d372ff355
--- /dev/null
+++ b/ext/hash/murmur/PMurHash128.h
@@ -0,0 +1,39 @@
+/*-----------------------------------------------------------------------------
+ * MurmurHash3 was written by Austin Appleby, and is placed in the public
+ * domain.
+ *
+ * This is a c++ implementation of MurmurHash3_128 with support for progressive
+ * processing based on PMurHash implementation written by Shane Day.
+ */
+
+/* ------------------------------------------------------------------------- */
+
+// Microsoft Visual Studio
+
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+
+typedef unsigned char uint8_t;
+typedef unsigned int uint32_t;
+typedef unsigned __int64 uint64_t;
+
+// Other compilers
+
+#else // defined(_MSC_VER)
+
+#include <stdint.h>
+
+#endif // !defined(_MSC_VER)
+
+/* ------------------------------------------------------------------------- */
+/* Formal prototypes */
+
+// PMurHash128x64
+void PMurHash128x64_Process(uint64_t ph[2], uint64_t pcarry[2], const void *key, int len);
+void PMurHash128x64_Result(const uint64_t ph[2], const uint64_t pcarry[2], uint32_t total_length, uint64_t out[2]);
+void PMurHash128x64(const void * key, const int len, uint32_t seed, void * out);
+
+// PMurHash128x86
+void PMurHash128x86_Process(uint32_t ph[4], uint32_t pcarry[4], const void *key, int len);
+void PMurHash128x86_Result(const uint32_t ph[4], const uint32_t pcarry[4], uint32_t total_length, uint32_t out[4]);
+void PMurHash128x86(const void * key, const int len, uint32_t seed, void * out);
+
diff --git a/ext/hash/murmur/endianness.h b/ext/hash/murmur/endianness.h
new file mode 100644
index 0000000000..3dbb2e6a3d
--- /dev/null
+++ b/ext/hash/murmur/endianness.h
@@ -0,0 +1,84 @@
+static const union {
+ uint8_t u8[2];
+ uint16_t u16;
+} EndianMix = {{ 1, 0 }};
+FORCE_INLINE int IsBigEndian()
+{
+ // Constant-folded by the compiler.
+ return EndianMix.u16 != 1;
+}
+
+#if defined(_MSC_VER)
+# include <stdlib.h>
+# define BSWAP32(u) _byteswap_ulong(u)
+# define BSWAP64(u) _byteswap_uint64(u)
+#else
+# ifdef __has_builtin
+# if __has_builtin(__builtin_bswap32)
+# define BSWAP32(u) __builtin_bswap32(u)
+# endif // __has_builtin(__builtin_bswap32)
+# if __has_builtin(__builtin_bswap64)
+# define BSWAP64(u) __builtin_bswap64(u)
+# endif // __has_builtin(__builtin_bswap64)
+# elif defined(__GNUC__) && ( \
+ __GNUC__ > 4 || ( \
+ __GNUC__ == 4 && ( \
+ __GNUC_MINOR__ >= 3 \
+ ) \
+ ) \
+ )
+# define BSWAP32(u) __builtin_bswap32(u)
+# define BSWAP64(u) __builtin_bswap64(u)
+# endif // __has_builtin
+#endif // defined(_MSC_VER)
+
+#ifndef BSWAP32
+FORCE_INLINE uint32_t BSWAP32(uint32_t u)
+{
+ return (((u & 0xff000000) >> 24)
+ | ((u & 0x00ff0000) >> 8)
+ | ((u & 0x0000ff00) << 8)
+ | ((u & 0x000000ff) << 24));
+}
+#endif
+#ifndef BSWAP64
+FORCE_INLINE uint64_t BSWAP64(uint64_t u)
+{
+ return (((u & 0xff00000000000000ULL) >> 56)
+ | ((u & 0x00ff000000000000ULL) >> 40)
+ | ((u & 0x0000ff0000000000ULL) >> 24)
+ | ((u & 0x000000ff00000000ULL) >> 8)
+ | ((u & 0x00000000ff000000ULL) << 8)
+ | ((u & 0x0000000000ff0000ULL) << 24)
+ | ((u & 0x000000000000ff00ULL) << 40)
+ | ((u & 0x00000000000000ffULL) << 56));
+}
+#endif
+
+#if defined(__clang__) || defined(__GNUC__) && __GNUC__ >= 8
+# define NO_SANITIZE_ALIGNMENT __attribute__((no_sanitize("alignment")))
+#else
+# define NO_SANITIZE_ALIGNMENT
+#endif
+
+NO_SANITIZE_ALIGNMENT
+FORCE_INLINE uint32_t getblock32 ( const uint32_t * const p, const int i)
+{
+ if (IsBigEndian()) {
+ return BSWAP32(p[i]);
+ } else {
+ return p[i];
+ }
+}
+
+NO_SANITIZE_ALIGNMENT
+FORCE_INLINE uint64_t getblock64 ( const uint64_t * const p, const int i)
+{
+ if (IsBigEndian()) {
+ return BSWAP64(p[i]);
+ } else {
+ return p[i];
+ }
+}
+
+#undef NO_SANITIZE_ALIGNMENT
diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h
index 33cc6a473a..69d1330072 100644
--- a/ext/hash/php_hash.h
+++ b/ext/hash/php_hash.h
@@ -105,6 +105,9 @@ extern const php_hash_ops php_hash_fnv1a32_ops;
extern const php_hash_ops php_hash_fnv164_ops;
extern const php_hash_ops php_hash_fnv1a64_ops;
extern const php_hash_ops php_hash_joaat_ops;
+extern const php_hash_ops php_hash_murmur3a_ops;
+extern const php_hash_ops php_hash_murmur3c_ops;
+extern const php_hash_ops php_hash_murmur3f_ops;
#define PHP_HASH_HAVAL_OPS(p,b) extern const php_hash_ops php_hash_##p##haval##b##_ops;
diff --git a/ext/hash/php_hash_murmur.h b/ext/hash/php_hash_murmur.h
new file mode 100644
index 0000000000..100a8d1fa3
--- /dev/null
+++ b/ext/hash/php_hash_murmur.h
@@ -0,0 +1,57 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Anatol Belski <ab@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef PHP_HASH_MURMUR_H
+#define PHP_HASH_MURMUR_H
+
+typedef struct {
+ uint32_t h;
+ uint32_t carry;
+ uint32_t len;
+} PHP_MURMUR3A_CTX;
+#define PHP_MURMUR3A_SPEC "lll"
+
+PHP_HASH_API void PHP_MURMUR3AInit(PHP_MURMUR3A_CTX *ctx);
+PHP_HASH_API void PHP_MURMUR3AUpdate(PHP_MURMUR3A_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_MURMUR3AFinal(unsigned char digest[4], PHP_MURMUR3A_CTX *ctx);
+PHP_HASH_API int PHP_MURMUR3ACopy(const php_hash_ops *ops, PHP_MURMUR3A_CTX *orig_context, PHP_MURMUR3A_CTX *copy_context);
+
+typedef struct {
+ uint32_t h[4];
+ uint32_t carry[4];
+ uint32_t len;
+} PHP_MURMUR3C_CTX;
+#define PHP_MURMUR3C_SPEC "lllllllll"
+
+PHP_HASH_API void PHP_MURMUR3CInit(PHP_MURMUR3C_CTX *ctx);
+PHP_HASH_API void PHP_MURMUR3CUpdate(PHP_MURMUR3C_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_MURMUR3CFinal(unsigned char digest[16], PHP_MURMUR3C_CTX *ctx);
+PHP_HASH_API int PHP_MURMUR3CCopy(const php_hash_ops *ops, PHP_MURMUR3C_CTX *orig_context, PHP_MURMUR3C_CTX *copy_context);
+
+typedef struct {
+ uint64_t h[2];
+ uint64_t carry[2];
+ uint32_t len;
+} PHP_MURMUR3F_CTX;
+#define PHP_MURMUR3F_SPEC "qqqql"
+
+PHP_HASH_API void PHP_MURMUR3FInit(PHP_MURMUR3F_CTX *ctx);
+PHP_HASH_API void PHP_MURMUR3FUpdate(PHP_MURMUR3F_CTX *ctx, const unsigned char *in, size_t len);
+PHP_HASH_API void PHP_MURMUR3FFinal(unsigned char digest[16], PHP_MURMUR3F_CTX *ctx);
+PHP_HASH_API int PHP_MURMUR3FCopy(const php_hash_ops *ops, PHP_MURMUR3F_CTX *orig_context, PHP_MURMUR3F_CTX *copy_context);
+
+#endif /* PHP_HASH_MURMUR_H */
+
diff --git a/ext/hash/tests/hash-clone.phpt b/ext/hash/tests/hash-clone.phpt
index 57567c0bc5..232d0a437f 100644
--- a/ext/hash/tests/hash-clone.phpt
+++ b/ext/hash/tests/hash-clone.phpt
@@ -143,6 +143,15 @@ string(16) "bebc746a33b6ab62"
string(5) "joaat"
string(8) "aaebf370"
string(8) "aaebf370"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "1b328135"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -302,6 +311,15 @@ string(16) "893899e4415a920f"
string(5) "joaat"
string(8) "aaebf370"
string(8) "836fb0e5"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "18578d03"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "28249178bb182686ef793aa56abb6aea"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
diff --git a/ext/hash/tests/hash_algos.phpt b/ext/hash/tests/hash_algos.phpt
index cff71a7771..5327ed31e2 100644
--- a/ext/hash/tests/hash_algos.phpt
+++ b/ext/hash/tests/hash_algos.phpt
@@ -9,7 +9,7 @@ var_dump(hash_algos());
?>
--EXPECTF--
*** Testing hash_algos() : basic functionality ***
-array(53) {
+array(56) {
[%d]=>
string(3) "md2"
[%d]=>
@@ -87,6 +87,12 @@ array(53) {
[%d]=>
string(5) "joaat"
[%d]=>
+ string(8) "murmur3a"
+ [%d]=>
+ string(8) "murmur3c"
+ [%d]=>
+ string(8) "murmur3f"
+ [%d]=>
string(10) "haval128,3"
[%d]=>
string(10) "haval160,3"
diff --git a/ext/hash/tests/hash_copy_001.phpt b/ext/hash/tests/hash_copy_001.phpt
index 271326178d..ce76d18110 100644
--- a/ext/hash/tests/hash_copy_001.phpt
+++ b/ext/hash/tests/hash_copy_001.phpt
@@ -143,6 +143,15 @@ string(16) "bebc746a33b6ab62"
string(5) "joaat"
string(8) "aaebf370"
string(8) "aaebf370"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "1b328135"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -302,6 +311,15 @@ string(16) "893899e4415a920f"
string(5) "joaat"
string(8) "aaebf370"
string(8) "836fb0e5"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "18578d03"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "28249178bb182686ef793aa56abb6aea"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
diff --git a/ext/hash/tests/hash_serialize_001.phpt b/ext/hash/tests/hash_serialize_001.phpt
index d515d2c5c5..409460d05b 100644
--- a/ext/hash/tests/hash_serialize_001.phpt
+++ b/ext/hash/tests/hash_serialize_001.phpt
@@ -154,6 +154,15 @@ string(16) "bebc746a33b6ab62"
string(5) "joaat"
string(8) "aaebf370"
string(8) "aaebf370"
+string(8) "murmur3a"
+string(8) "1b328135"
+string(8) "1b328135"
+string(8) "murmur3c"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(32) "2f041a2a310ba026921bc6ba34f17a2f"
+string(8) "murmur3f"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
+string(32) "aa86566cc6bf3a0987b83aabee30411e"
string(10) "haval128,3"
string(32) "86362472c8895e68e223ef8b3711d8d9"
string(32) "86362472c8895e68e223ef8b3711d8d9"
@@ -313,6 +322,15 @@ string(16) "893899e4415a920f"
string(5) "joaat"
string(8) "836fb0e5"
string(8) "836fb0e5"
+string(8) "murmur3a"
+string(8) "18578d03"
+string(8) "18578d03"
+string(8) "murmur3c"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(32) "2af4fdc002fda7b7491459e70377823f"
+string(8) "murmur3f"
+string(32) "28249178bb182686ef793aa56abb6aea"
+string(32) "28249178bb182686ef793aa56abb6aea"
string(10) "haval128,3"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
diff --git a/ext/hash/tests/hash_serialize_002.phpt b/ext/hash/tests/hash_serialize_002.phpt
index b6b4ccfb5e..c86a47cd7e 100644
--- a/ext/hash/tests/hash_serialize_002.phpt
+++ b/ext/hash/tests/hash_serialize_002.phpt
@@ -4,7 +4,7 @@ Hash: serialize()/unserialize() with HASH_HMAC
<?php
$algos = hash_algos();
-$non_crypto = ["adler32", "crc32", "crc32b", "crc32c", "fnv132", "fnv1a32", "fnv164", "fnv1a64", "joaat"];
+$non_crypto = ["adler32", "crc32", "crc32b", "crc32c", "fnv132", "fnv1a32", "fnv164", "fnv1a64", "joaat", "murmur3a", "murmur3c", "murmur3f"];
$key = "This is the key that I have";
foreach ($algos as $algo) {
diff --git a/ext/hash/tests/murmurhash3.phpt b/ext/hash/tests/murmurhash3.phpt
new file mode 100644
index 0000000000..6331b312d9
--- /dev/null
+++ b/ext/hash/tests/murmurhash3.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Hash: MurmurHash3 test
+--FILE--
+<?php
+
+$h = hash("murmur3a", "foo");
+echo $h, "\n";
+
+$h = hash("murmur3c", "Two hashes meet in a bar", false);
+echo $h, "\n";
+$h = hash("murmur3c", "hash me!");
+echo $h, "\n";
+
+$h = hash("murmur3f", "Two hashes meet in a bar", false);
+echo $h, "\n";
+$h = hash("murmur3f", "hash me!");
+echo $h, "\n";
+
+$ctx = hash_init("murmur3a");
+hash_update($ctx, "hello");
+hash_update($ctx, " there");
+$h0 = hash_final($ctx);
+$h1 = hash("murmur3a", "hello there");
+echo $h0, " ", $h1, "\n";
+
+$ctx = hash_init("murmur3c");
+hash_update($ctx, "hello");
+hash_update($ctx, " there");
+$h0 = hash_final($ctx);
+$h1 = hash("murmur3c", "hello there");
+echo $h0, " ", $h1, "\n";
+
+$ctx = hash_init("murmur3f");
+hash_update($ctx, "hello");
+hash_update($ctx, " there");
+$h0 = hash_final($ctx);
+$h1 = hash("murmur3f", "hello there");
+echo $h0, " ", $h1, "\n";
+
+?>
+--EXPECT--
+f6a5c420
+8036c2707453c6f37348142be7eaf75c
+c7009299985a5627a9280372a9280372
+40256ed26fa6ece7785092ed33c8b659
+c43668294e89db0ba5772846e5804467
+6440964d 6440964d
+2bcadca212d62deb69712a721e593089 2bcadca212d62deb69712a721e593089
+81514cc240f57a165c95eb63f9c0eedf 81514cc240f57a165c95eb63f9c0eedf
diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c
index c561a5e72c..4c72c90ff6 100644
--- a/ext/imap/php_imap.c
+++ b/ext/imap/php_imap.c
@@ -2758,7 +2758,7 @@ PHP_FUNCTION(imap_sort)
}
array_init(return_value);
- if (slst != NIL && slst != 0) {
+ if (slst != NULL) {
for (sl = slst; *sl; sl++) {
add_next_index_long(return_value, *sl);
}
diff --git a/ext/imap/tests/CONFLICTS b/ext/imap/tests/CONFLICTS
deleted file mode 100644
index c301c0ffac..0000000000
--- a/ext/imap/tests/CONFLICTS
+++ /dev/null
@@ -1 +0,0 @@
-imap
diff --git a/ext/imap/tests/README.md b/ext/imap/tests/README.md
index 6324ab7f9e..1dee1d2663 100644
--- a/ext/imap/tests/README.md
+++ b/ext/imap/tests/README.md
@@ -11,14 +11,14 @@ hMailServer on Windows. The tests are intended to be mailserver agnostic.
## Set-up tests on Ubuntu (checked on Ubuntu 18.04 (Bionic))
The necessary packages can be installed using the following command;
-`apt-get install libc-client-dev libkrb5-dev dovecot-core dovecot-pop3d dovecot-imapd`
+`apt-get install libc-client-dev libkrb5-dev dovecot-core dovecot-pop3d dovecot-imapd sendmail`
The build of PHP will need to be compiled with the following flags:
```
--with-imap --with-kerberos --with-imap-ssl
```
-Then run the set-up script `ext/imap/tests/setup.sh` which will add the `vmail`
+Then run the set-up script `ext/imap/tests/setup/setup.sh` which will add the `vmail`
group and user which is used by Dovecot for the mailbox. It will also copy the
-`ext/imap/tests/dovecot.conf` and `ext/imap/tests/dovecotpass` to the correct
+`ext/imap/tests/setup/dovecot.conf` and `ext/imap/tests/setup/dovecotpass` to the correct
location for Dovecot and restarts it for the new configuration to be enabled.
diff --git a/ext/imap/tests/bug31142_2.phpt b/ext/imap/tests/bug31142_2.phpt
index 004c054963..dbb4c9a6ad 100644
--- a/ext/imap/tests/bug31142_2.phpt
+++ b/ext/imap/tests/bug31142_2.phpt
@@ -2,9 +2,7 @@
Bug #31142 test #2 (imap_mail_compose() generates incorrect output)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
--FILE--
<?php
diff --git a/ext/imap/tests/bug32589.phpt b/ext/imap/tests/bug32589.phpt
index 52a73c6f23..ad49915018 100644
--- a/ext/imap/tests/bug32589.phpt
+++ b/ext/imap/tests/bug32589.phpt
@@ -2,9 +2,7 @@
Bug #32589 (crash inside imap_mail_compose() function)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
--FILE--
<?php
diff --git a/ext/imap/tests/bug35669.phpt b/ext/imap/tests/bug35669.phpt
index fc7a135bce..7a9372d0a0 100644
--- a/ext/imap/tests/bug35669.phpt
+++ b/ext/imap/tests/bug35669.phpt
@@ -2,45 +2,43 @@
Bug #35669 (imap_mail_compose() crashes with multipart-multiboundary-email)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
--FILE--
<?php
- $envelope["from"] = 'Santa <somewhere@northpole.gov>';
- $envelope["to"] = 'The bad smurf <bad@smurf.com>';
- $envelope['date'] = 'Wed, 04 Jan 2006 19:24:43 -0500';
+$envelope["from"] = 'Santa <somewhere@northpole.gov>';
+$envelope["to"] = 'The bad smurf <bad@smurf.com>';
+$envelope['date'] = 'Wed, 04 Jan 2006 19:24:43 -0500';
- $multipart["type"] = TYPEMULTIPART;
- $multipart["subtype"] = "MIXED";
- $body[] = $multipart; //add multipart stuff
+$multipart["type"] = TYPEMULTIPART;
+$multipart["subtype"] = "MIXED";
+$body[] = $multipart; //add multipart stuff
- $textpart["type"] = TYPEMULTIPART;
- $textpart["subtype"] = "ALTERNATIVE";
- $body[] = $textpart; //add body part
+$textpart["type"] = TYPEMULTIPART;
+$textpart["subtype"] = "ALTERNATIVE";
+$body[] = $textpart; //add body part
- $plain["type"] = TYPETEXT;
- $plain["subtype"] = "PLAIN";
- $plain["charset"] = "iso-8859-1";
- $plain["encoding"] = ENCQUOTEDPRINTABLE;
- $plain["description"] = "Plaintype part of message";
- $plain['disposition'] = "inline";
- $plain["contents.data"] = 'See mom, it will crash';
+$plain["type"] = TYPETEXT;
+$plain["subtype"] = "PLAIN";
+$plain["charset"] = "iso-8859-1";
+$plain["encoding"] = ENCQUOTEDPRINTABLE;
+$plain["description"] = "Plaintype part of message";
+$plain['disposition'] = "inline";
+$plain["contents.data"] = 'See mom, it will crash';
- $body[] = $plain; //next add plain text part
+$body[] = $plain; //next add plain text part
- $html["type"] = TYPETEXT;
- $html["subtype"] = "HTML";
- $html["charset"] = "iso-8859-1";
- $html["encoding"] = ENCQUOTEDPRINTABLE;
- $html["description"] = "HTML part of message";
- $html['disposition'] = "inline";
- $html["contents.data"] = 'See mom, it will <b>crash</b>';
+$html["type"] = TYPETEXT;
+$html["subtype"] = "HTML";
+$html["charset"] = "iso-8859-1";
+$html["encoding"] = ENCQUOTEDPRINTABLE;
+$html["description"] = "HTML part of message";
+$html['disposition'] = "inline";
+$html["contents.data"] = 'See mom, it will <b>crash</b>';
- $body[] = $html;
+$body[] = $html;
- echo imap_mail_compose($envelope, $body);
+echo imap_mail_compose($envelope, $body);
?>
--EXPECTF--
Date: Wed, 04 Jan 2006 19:24:43 -0500
diff --git a/ext/imap/tests/bug44098.phpt b/ext/imap/tests/bug44098.phpt
index 2a0f5cef44..2e0f025d6a 100644
--- a/ext/imap/tests/bug44098.phpt
+++ b/ext/imap/tests/bug44098.phpt
@@ -2,19 +2,14 @@
Bug #44098 (imap_utf8() returns only capital letters)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
--FILE--
<?php
$exp = 'Luzon®14 dot CoM';
$res = imap_utf8('=?iso-8859-1?b?THV6b26uMTQ=?= dot CoM');
-if ($res != $exp) {
- echo "failed: got <$res>, expected <exp>\n";
-} else {
- echo "ok";
-}
+var_dump($res);
+
?>
--EXPECT--
-ok
+string(17) "Luzon®14 dot CoM"
diff --git a/ext/imap/tests/bug45705_1.phpt b/ext/imap/tests/bug45705_1.phpt
index 05d3a0a2f6..b8d33e6758 100644
--- a/ext/imap/tests/bug45705_1.phpt
+++ b/ext/imap/tests/bug45705_1.phpt
@@ -2,9 +2,7 @@
Bug #45705 test #1 (imap rfc822_parse_adrlist() modifies passed address parameter)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
--FILE--
<?php
diff --git a/ext/imap/tests/bug45705_2.phpt b/ext/imap/tests/bug45705_2.phpt
index 97c4118614..a4e7828d1f 100644
--- a/ext/imap/tests/bug45705_2.phpt
+++ b/ext/imap/tests/bug45705_2.phpt
@@ -2,9 +2,7 @@
Bug #45705 test #2 (imap rfc822_parse_adrlist() modifies passed address parameter)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
--FILE--
<?php
diff --git a/ext/imap/tests/bug53377.phpt b/ext/imap/tests/bug53377.phpt
index a507369046..083d951c20 100644
--- a/ext/imap/tests/bug53377.phpt
+++ b/ext/imap/tests/bug53377.phpt
@@ -2,9 +2,7 @@
Bug #53377 (imap_mime_header_decode() doesn't ignore \t during long MIME header unfolding)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
--FILE--
<?php
diff --git a/ext/imap/tests/bug63126.phpt b/ext/imap/tests/bug63126.phpt
index 8eea34cf1d..8297b509ae 100644
--- a/ext/imap/tests/bug63126.phpt
+++ b/ext/imap/tests/bug63126.phpt
@@ -4,11 +4,11 @@ imap_open() DISABLE_AUTHENTICATOR ignores array param
<?php
extension_loaded('imap') or die('skip imap extension not available in this build');
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__. '/setup/imap_include.inc');
-$in = @imap_open($default_mailbox, $username, $password, OP_HALFOPEN, 1);
+$in = @imap_open(IMAP_SERVER_DEBUG, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD, OP_HALFOPEN, 1);
if (!$in) {
- die("skip could not connect to mailbox $default_mailbox");
+ die("skip could not connect to mailbox " . IMAP_SERVER_DEBUG);
}
$kerberos = false;
if (is_array($errors = imap_errors())) {
@@ -22,16 +22,19 @@ if (!$kerberos) {
die("skip need a GSSAPI/Kerberos aware server");
}
?>
+--CONFLICTS--
+defaultmailbox
--FILE--
<?php
+// TODO Test Kerberos on CI
$tests = array(
'Array' => array('DISABLE_AUTHENTICATOR' => array('GSSAPI','NTLM')),
'String' => array('DISABLE_AUTHENTICATOR' => 'GSSAPI'),
);
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__. '/setup/imap_include.inc');
foreach ($tests as $name => $testparams) {
echo "Test for $name\n";
- $in = imap_open($default_mailbox, $username, $password, OP_HALFOPEN, 1, $testparams);
+ $in = imap_open(IMAP_SERVER_DEBUG, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD, OP_HALFOPEN, 1, $testparams);
if ($in) {
if (is_array($errors = imap_errors())) {
foreach ($errors as $err) {
diff --git a/ext/imap/tests/bug64076.phpt b/ext/imap/tests/bug64076.phpt
index ccafcfe251..7e9ee6fd04 100644
--- a/ext/imap/tests/bug64076.phpt
+++ b/ext/imap/tests/bug64076.phpt
@@ -2,22 +2,23 @@
Bug #64076 (imap_sort() does not return FALSE on failure)
--SKIPIF--
<?php
-require_once __DIR__ . '/skipif.inc';
+require_once __DIR__ . '/setup/skipif.inc';
?>
--FILE--
<?php
-require_once __DIR__ . '/imap_include.inc';
-$stream = setup_test_mailbox('', 2);
+require_once __DIR__ . '/setup/imap_include.inc';
+$stream = setup_test_mailbox('bug64076', 2);
imap_errors(); // clear error stack
var_dump(imap_sort($stream, SORTFROM, 0, 0, 'UNSUPPORTED SEARCH CRITERIUM'));
var_dump(imap_errors() !== false);
?>
--CLEAN--
<?php
-require_once __DIR__ . '/clean.inc';
+$mailbox_suffix = 'bug64076';
+require_once(__DIR__ . '/setup/clean.inc');
?>
--EXPECT--
Create a temporary mailbox and add 2 msgs
-.. mailbox '{127.0.0.1:143/norsh}INBOX.phpttest' created
+New mailbox created
bool(false)
bool(true)
diff --git a/ext/imap/tests/bug77020.phpt b/ext/imap/tests/bug77020.phpt
index 43c8133700..d828654983 100644
--- a/ext/imap/tests/bug77020.phpt
+++ b/ext/imap/tests/bug77020.phpt
@@ -6,8 +6,8 @@ if (!extension_loaded('imap')) die('skip imap extension not available');
?>
--FILE--
<?php
-imap_mail('1', 1, NULL);
+@imap_mail('1', 1, NULL);
+echo 'done'
?>
--EXPECTF--
-Warning: imap_mail(): No message string in mail command in %s on line %d
-%S
+%Adone
diff --git a/ext/imap/tests/bug77153.phpt b/ext/imap/tests/bug77153.phpt
index 7b759621fe..d767ce5472 100644
--- a/ext/imap/tests/bug77153.phpt
+++ b/ext/imap/tests/bug77153.phpt
@@ -1,11 +1,11 @@
---TEST--
+--TEST--
Bug #77153 (imap_open allows to run arbitrary shell commands via mailbox parameter)
--SKIPIF--
<?php
- if (!extension_loaded("imap")) {
- die("skip imap extension not available");
- }
+extension_loaded('imap') or die('skip imap extension not available in this build');
?>
+--CONFLICTS--
+defaultmailbox
--FILE--
<?php
$payload = "echo 'BUG'> " . __DIR__ . '/__bug';
@@ -21,4 +21,4 @@ bool(false)
--CLEAN--
<?php
if(file_exists(__DIR__ . '/__bug')) unlink(__DIR__ . '/__bug');
-?> \ No newline at end of file
+?>
diff --git a/ext/imap/tests/bug80213.phpt b/ext/imap/tests/bug80213.phpt
index 9a7961df77..5bad48f306 100644
--- a/ext/imap/tests/bug80213.phpt
+++ b/ext/imap/tests/bug80213.phpt
@@ -14,8 +14,13 @@ $body = [[
'type.parameters' => ['param'],
'disposition' => ['disp'],
]];
-imap_mail_compose($envelope, $body);
+var_dump(imap_mail_compose($envelope, $body));
echo "done\n";
?>
--EXPECT--
+string(67) "MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
+
+
+"
done
diff --git a/ext/imap/tests/bug80226.phpt b/ext/imap/tests/bug80226.phpt
index 95ec235178..6cf4cc8a58 100644
--- a/ext/imap/tests/bug80226.phpt
+++ b/ext/imap/tests/bug80226.phpt
@@ -2,12 +2,25 @@
Bug #80226 (imap_sort() leaks sortpgm memory)
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream = imap_open($default_mailbox, $username, $password);
-imap_sort($stream, SORTFROM, 0);
+require_once(__DIR__.'/setup/imap_include.inc');
+
+echo "Create a new mailbox for test\n";
+
+$stream = setup_test_mailbox("bug80226", 0);
+var_dump(imap_sort($stream, SORTFROM, 0));
+?>
+--CLEAN--
+<?php
+$mailbox_suffix = 'bug80226';
+require_once(__DIR__ . '/setup/clean.inc');
?>
--EXPECT--
+Create a new mailbox for test
+Create a temporary mailbox and add 0 msgs
+New mailbox created
+array(0) {
+}
diff --git a/ext/imap/tests/clean.inc b/ext/imap/tests/clean.inc
deleted file mode 100644
index 8bc566ba32..0000000000
--- a/ext/imap/tests/clean.inc
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-include_once(dirname(__FILE__) . '/imap_include.inc');
-
-$imap_stream = imap_open($default_mailbox, $username, $password);
-
-// delete all msgs in default mailbox, i.e INBOX
-$check = imap_check($imap_stream);
-for ($i = 1; $i <= $check->Nmsgs; $i++) {
- imap_delete($imap_stream, $i);
-}
-
-$mailboxes = imap_getmailboxes($imap_stream, $server, '*');
-
-foreach($mailboxes as $value) {
- // Only delete mailboxes with our prefix
- if (preg_match('/\{.*?\}INBOX\.(.+)/', $value->name, $match) == 1) {
- if (strlen($match[1]) >= strlen($mailbox_prefix)
- && substr_compare($match[1], $mailbox_prefix, 0, strlen($mailbox_prefix)) == 0) {
- imap_deletemailbox($imap_stream, $value->name);
- }
- }
-}
-
-imap_close($imap_stream, CL_EXPUNGE);
-?>
diff --git a/ext/imap/tests/imap_append_basic.phpt b/ext/imap/tests/imap_append_basic.phpt
index e75b452596..ab2e46886e 100644
--- a/ext/imap/tests/imap_append_basic.phpt
+++ b/ext/imap/tests/imap_append_basic.phpt
@@ -2,22 +2,19 @@
Test imap_append() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__. '/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_append() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__. '/setup/imap_include.inc');
echo "Create a new mailbox for test\n";
-$imap_stream = setup_test_mailbox("", 0);
-if (!is_resource($imap_stream)) {
- exit("TEST FAILED: Unable to create test mailbox\n");
-}
+$imap_stream = setup_test_mailbox("imapappendbaisc", 0);
$mb_details = imap_mailboxmsginfo($imap_stream);
-echo "Add a couple of msgs to new mailbox " . $mb_details->Mailbox . "\n";
+echo "Add a couple of msgs to the new mailbox\n";
var_dump(imap_append($imap_stream, $mb_details->Mailbox
, "From: webmaster@something.com\r\n"
. "To: info@something.com\r\n"
@@ -44,14 +41,15 @@ imap_close($imap_stream);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imapappendbaisc';
+require_once(__DIR__ . '/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_append() : basic functionality ***
Create a new mailbox for test
Create a temporary mailbox and add 0 msgs
-.. mailbox '%s' created
-Add a couple of msgs to new mailbox {%s}INBOX.%s
+New mailbox created
+Add a couple of msgs to the new mailbox
bool(true)
bool(true)
Msg Count after append : 2
diff --git a/ext/imap/tests/imap_body.phpt b/ext/imap/tests/imap_body.phpt
index 6c2f629398..59678ad539 100644
--- a/ext/imap/tests/imap_body.phpt
+++ b/ext/imap/tests/imap_body.phpt
@@ -5,33 +5,40 @@ Paul Sohier
#phptestfest utrecht
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = imap_open($default_mailbox, $username, $password) or
- die("Cannot connect to mailbox $default_mailbox: " . imap_last_error());
+require_once(__DIR__.'/setup/imap_include.inc');
+
+$imap_stream = setup_test_mailbox("imapbodyvalueerror", 0);
try {
- imap_body($stream_id,-1);
+ imap_body($imap_stream,-1);
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
try {
- imap_body($stream_id,1,-1);
+ imap_body($imap_stream,1,-1);
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
//Access not existing
-var_dump(imap_body($stream_id, 255, FT_UID));
+var_dump(imap_body($imap_stream, 255, FT_UID));
-imap_close($stream_id);
+imap_close($imap_stream);
?>
+--CLEAN--
+<?php
+$mailbox_suffix = 'imapbodyvalueerror';
+require_once(__DIR__ . '/setup/clean.inc');
+?>
--EXPECTF--
+Create a temporary mailbox and add 0 msgs
+New mailbox created
imap_body(): Argument #2 ($message_num) must be greater than 0
imap_body(): Argument #3 ($flags) must be a bitmask of FT_UID, FT_PEEK, and FT_INTERNAL
diff --git a/ext/imap/tests/imap_body_basic.phpt b/ext/imap/tests/imap_body_basic.phpt
index 3034785a90..b5cb0fcd33 100644
--- a/ext/imap/tests/imap_body_basic.phpt
+++ b/ext/imap/tests/imap_body_basic.phpt
@@ -2,19 +2,16 @@
Test imap_body() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_body() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
echo "Create a new mailbox for test\n";
-$imap_stream = setup_test_mailbox("", 1);
-if (!is_resource($imap_stream)) {
- exit("TEST FAILED: Unable to create test mailbox\n");
-}
+$imap_stream = setup_test_mailbox("imapbodybasic", 1);
$check = imap_check($imap_stream);
echo "Msg Count in new mailbox: ". $check->Nmsgs . "\n";
@@ -29,15 +26,16 @@ imap_close($imap_stream);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imapbodybasic';
+require_once __DIR__.'/setup/clean.inc';
?>
--EXPECTF--
*** Testing imap_body() : basic functionality ***
Create a new mailbox for test
Create a temporary mailbox and add 1 msgs
-.. mailbox '%s' created
+New mailbox created
Msg Count in new mailbox: 1
string(%d) "1: this is a test message, please ignore
-"
+newline%r\R?%r"
string(%d) "1: this is a test message, please ignore
-"
+newline%r\R?%r"
diff --git a/ext/imap/tests/imap_bodystruct_basic.phpt b/ext/imap/tests/imap_bodystruct_basic.phpt
index 56c88399c3..f969e86764 100644
--- a/ext/imap/tests/imap_bodystruct_basic.phpt
+++ b/ext/imap/tests/imap_bodystruct_basic.phpt
@@ -2,47 +2,43 @@
Test imap_bodystruct() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing string imap_bodystruct : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
echo "Create a new mailbox for test and add a multipart msgs\n";
-$imap_stream = setup_test_mailbox("", 1, $mailbox, "multipart");
-if (!is_resource($imap_stream)) {
- exit("TEST FAILED: Unable to create test mailbox\n");
-}
+$imap_stream = setup_test_mailbox("imapbodystructbasic", 1, $mailbox, "multipart");
echo "\nGet and validate structure of body part 1\n";
$m = imap_bodystruct($imap_stream, 1, "1");
-$mandatoryFields = array(
- 'ifsubtype',
- 'ifdescription',
- 'ifid',
- 'ifdisposition',
- 'ifdparameters',
- 'ifparameters',
- );
+$mandatoryFields = [
+ 'ifsubtype',
+ 'ifdescription',
+ 'ifid',
+ 'ifdisposition',
+ 'ifdparameters',
+ 'ifparameters',
+];
+
+function isValid($param) {
+ return ($param == 0) || ($param == 1);
+}
-foreach($mandatoryFields as $mf)
-{
- if(isValid($m->$mf))
- {
- echo "$mf is 0 or 1\n";
- }
- else
- {
- echo "$mf FAIL\n";
- }
+foreach($mandatoryFields as $mf) {
+ if (isValid($m->$mf)) {
+ echo "$mf is 0 or 1\n";
+ } else {
+ echo "$mf FAIL\n";
+ }
}
-if(is_array($m->parameters))
-{
- echo "parameters is an array\n";
+if(is_array($m->parameters)) {
+ echo "parameters is an array\n";
}
echo "\nTry to get part 4!\n";
@@ -50,28 +46,17 @@ var_dump(imap_bodystruct($imap_stream, 1, "4"));
imap_close($imap_stream);
-function isValid($param)
-{
- if(($param == 0) || ($param == 1))
- {
- $result=true;
- }
- else
- {
- $result=false;
- }
-return $result;
-}
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imapbodystructbasic';
+require_once(__DIR__ . '/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing string imap_bodystruct : basic functionality ***
Create a new mailbox for test and add a multipart msgs
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
Get and validate structure of body part 1
ifsubtype is 0 or 1
diff --git a/ext/imap/tests/imap_clearflag_full_basic.phpt b/ext/imap/tests/imap_clearflag_full_basic.phpt
index cc949385fc..ee65d202ce 100644
--- a/ext/imap/tests/imap_clearflag_full_basic.phpt
+++ b/ext/imap/tests/imap_clearflag_full_basic.phpt
@@ -2,19 +2,16 @@
Test imap_clearflag_full() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_clearflag_full() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
echo "Create a new mailbox for test\n";
-$imap_stream = setup_test_mailbox("", 10);
-if (!is_resource($imap_stream)) {
- exit("TEST FAILED: Unable to create test mailbox\n");
-}
+$imap_stream = setup_test_mailbox("imapclearflagfullbasic", 10);
$check = imap_check($imap_stream);
echo "Initial msg count in new_mailbox : ". $check->Nmsgs . "\n";
@@ -44,13 +41,14 @@ imap_close($imap_stream);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imapclearflagfullbasic';
+require_once(__DIR__ . '/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing imap_clearflag_full() : basic functionality ***
Create a new mailbox for test
Create a temporary mailbox and add 10 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
Initial msg count in new_mailbox : 10
Set some flags
bool(true)
diff --git a/ext/imap/tests/imap_close_basic.phpt b/ext/imap/tests/imap_close_basic.phpt
index 57b2e7eab1..c962b62f7f 100644
--- a/ext/imap/tests/imap_close_basic.phpt
+++ b/ext/imap/tests/imap_close_basic.phpt
@@ -2,17 +2,17 @@
Test imap_close() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_close() : basic functionality ***\n";
// include file for required variables in imap_open()
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
// Initialize required variables
-$stream_id = setup_test_mailbox('', 3, $mailbox); // set up temp mailbox with 3 messages
+$stream_id = setup_test_mailbox('imapclosebasic', 3, $mailbox); // set up temp mailbox with 3 messages
$options = CL_EXPUNGE;
// mark messages in inbox for deletion
@@ -25,7 +25,7 @@ echo "\n-- Call to imap_close() with all possible arguments --\n";
var_dump( imap_close($stream_id, $options) );
// check that CL_EXPUNGE worked
-$stream_id = imap_open($mailbox, $username, $password);
+$stream_id = imap_open($mailbox, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
echo "There are now " . imap_num_msg($stream_id) . " msgs in mailbox '$mailbox'\n";
// Calling imap_close() with mandatory arguments
@@ -34,16 +34,17 @@ var_dump( imap_close($stream_id) );
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapclosebasic';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_close() : basic functionality ***
Create a temporary mailbox and add 3 msgs
-.. mailbox '%sINBOX.phpttest' created
+New mailbox created
-- Call to imap_close() with all possible arguments --
bool(true)
-There are now 0 msgs in mailbox '%sINBOX.phpttest'
+There are now 0 msgs in mailbox '%sINBOX.phpttestimapclosebasic'
-- Call to imap_close() with mandatory arguments --
bool(true)
diff --git a/ext/imap/tests/imap_close_variation4.phpt b/ext/imap/tests/imap_close_variation4.phpt
index b57f607f88..ff78ac985c 100644
--- a/ext/imap/tests/imap_close_variation4.phpt
+++ b/ext/imap/tests/imap_close_variation4.phpt
@@ -2,7 +2,7 @@
Test imap_close() function : usage variations - different ints as $flags arg
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -13,11 +13,11 @@ require_once(__DIR__.'/skipif.inc');
echo "*** Testing imap_close() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
$inputs = array (0, 3.2768e4, -32768, PHP_INT_MAX, -PHP_INT_MAX);
-$stream_id = setup_test_mailbox('', 3, $mailbox); // set up temp mailbox with 3 messages
+$stream_id = setup_test_mailbox('imapclosevar4', 3, $mailbox); // set up temp mailbox with 3 messages
// loop through each element of $inputs to check the behavior of imap_close()
$iterator = 1;
@@ -40,7 +40,7 @@ foreach($inputs as $input) {
imap_close($stream_id, CL_EXPUNGE);
} else {
// if imap_close was successful test whether CL_EXPUNGE was set by doing a message count
- $imap_stream = imap_open($mailbox, $username, $password);
+ $imap_stream = imap_open($mailbox, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
$num_msg = imap_num_msg($imap_stream);
if ($num_msg != 0) {
echo "CL_EXPUNGE was not set, $num_msg msgs in mailbox\n";
@@ -53,19 +53,20 @@ foreach($inputs as $input) {
$iterator++;
// get $stream_id for next iteration
- $stream_id = imap_open($mailbox, $username, $password);
+ $stream_id = imap_open($mailbox, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
populate_mailbox($stream_id, $mailbox, 3);
};
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapclosevar4';
+require_once(__DIR__.'/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing imap_close() : usage variations ***
Create a temporary mailbox and add 3 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- Iteration 1 --
bool(true)
diff --git a/ext/imap/tests/imap_createmailbox_basic.phpt b/ext/imap/tests/imap_createmailbox_basic.phpt
index 84db5cbd31..83dc3d0f6e 100644
--- a/ext/imap/tests/imap_createmailbox_basic.phpt
+++ b/ext/imap/tests/imap_createmailbox_basic.phpt
@@ -2,22 +2,21 @@
Test imap_createmailbox() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once __DIR__.'/setup/skipif.inc';
?>
--FILE--
<?php
echo "*** Testing imap_createmailbox() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once __DIR__.'/setup/imap_include.inc';
-$imap_stream = imap_open($default_mailbox, $username, $password) or
- die("Cannot connect to mailbox $default_mailbox: " . imap_last_error());
+$imap_stream = setup_test_mailbox("imapcreatemailboxbasic", 0);
$newname = "phpnewbox";
echo "Newname will be '$newname'\n";
-$newbox = imap_utf7_encode($server.$newname);
+$newbox = imap_utf7_encode(IMAP_SERVER.$newname);
if (imap_createmailbox($imap_stream, $newbox)) {
echo "Add a couple of msgs to '$newname' mailbox\n";
@@ -49,8 +48,15 @@ if (imap_createmailbox($imap_stream, $newbox)) {
imap_close($imap_stream);
?>
+--CLEAN--
+<?php
+$mailbox_suffix = 'imapcreatemailboxbasic';
+require_once __DIR__ . '/setup/clean.inc';
+?>
--EXPECTF--
*** Testing imap_createmailbox() : basic functionality ***
+Create a temporary mailbox and add 0 msgs
+New mailbox created
Newname will be 'phpnewbox'
Add a couple of msgs to 'phpnewbox' mailbox
Your new mailbox 'phpnewbox' has the following status:
diff --git a/ext/imap/tests/imap_errors_basic.phpt b/ext/imap/tests/imap_errors_basic.phpt
index c897193766..f691a5c705 100644
--- a/ext/imap/tests/imap_errors_basic.phpt
+++ b/ext/imap/tests/imap_errors_basic.phpt
@@ -2,16 +2,16 @@
Test imap_errors() function : invalid password
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once __DIR__.'/setup/skipif.inc';
?>
--FILE--
<?php
echo "*** Testing imap_errors() : invalid password ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once __DIR__.'/setup/imap_include.inc';
$password = "bogus"; // invalid password to use in this test
echo "Issue opening with invalid password, 1 retry\n";
-$mbox = imap_open($default_mailbox, $username, $password, OP_READONLY, 1);
+$mbox = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, $password, OP_READONLY, 1);
echo "List any errors\n";
var_dump(imap_errors());
diff --git a/ext/imap/tests/imap_fetch_overview_basic.phpt b/ext/imap/tests/imap_fetch_overview_basic.phpt
index a9fe85c45e..ea379b1e59 100644
--- a/ext/imap/tests/imap_fetch_overview_basic.phpt
+++ b/ext/imap/tests/imap_fetch_overview_basic.phpt
@@ -2,16 +2,16 @@
Test imap_fetch_overview() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_fetch_overview() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once __DIR__.'/setup/imap_include.inc';
// create a new mailbox and add two new messages to it
-$stream_id = setup_test_mailbox('', 2, $mailbox, 'notSimple');
+$stream_id = setup_test_mailbox('imapfetchoverviewbasic', 2, $mailbox, false);
// get UID for new message
$msg_no = imap_uid($stream_id, 1);
@@ -40,12 +40,13 @@ imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchoverviewbasic';
+require_once __DIR__.'/setup/clean.inc';
?>
--EXPECTF--
*** Testing imap_fetch_overview() : basic functionality ***
Create a temporary mailbox and add 2 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- All possible arguments --
diff --git a/ext/imap/tests/imap_fetch_overview_variation3.phpt b/ext/imap/tests/imap_fetch_overview_variation3.phpt
index f416887388..1ed528a173 100644
--- a/ext/imap/tests/imap_fetch_overview_variation3.phpt
+++ b/ext/imap/tests/imap_fetch_overview_variation3.phpt
@@ -2,7 +2,7 @@
Test imap_fetch_overview() function : usage variations - FT_UID option
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -14,19 +14,20 @@ require_once(__DIR__.'/skipif.inc');
echo "*** Testing imap_fetch_overview() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once __DIR__.'/setup/imap_include.inc';
// Initialise required variables
-$stream_id = setup_test_mailbox('', 1); // set up temporary mailbox with one simple message
+$stream_id = setup_test_mailbox('imapfetchoverviewvar3', 1); // set up temporary mailbox with one simple message
$msg_no = 1;
$msg_uid = imap_uid($stream_id, $msg_no);
-$flags = array ('1',
- true,
- 1.000000000000001,
- 0.00001e5,
- 245
- );
+$flags = [
+ '1',
+ true,
+ 1.000000000000001,
+ 0.00001e5,
+ 245,
+];
imap_check($stream_id);
foreach($flags as $option) {
@@ -45,12 +46,13 @@ foreach($flags as $option) {
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchoverviewvar3';
+require_once(__DIR__.'/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing imap_fetch_overview() : usage variations ***
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
Testing with option value:string(1) "1"
imap_fetch_overview() returns an object
diff --git a/ext/imap/tests/imap_fetch_overview_variation5.phpt b/ext/imap/tests/imap_fetch_overview_variation5.phpt
index 9774e682c1..6a8b6abd51 100644
--- a/ext/imap/tests/imap_fetch_overview_variation5.phpt
+++ b/ext/imap/tests/imap_fetch_overview_variation5.phpt
@@ -2,7 +2,7 @@
Test imap_fetch_overview() function : usage variations - $msg_no argument
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -12,25 +12,31 @@ require_once(__DIR__.'/skipif.inc');
*/
echo "*** Testing imap_fetch_overview() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once __DIR__.'/setup/imap_include.inc';
-$stream_id = setup_test_mailbox('', 3, $mailbox, 'notSimple'); // set up temp mailbox with 3 msgs
+$stream_id = setup_test_mailbox('imapfetchoverviewvar5', 3, $mailbox, false); // set up temp mailbox with 3 msgs
-$sequences = array (0, 4, '4', // out of range
- '2', '1,3', '1, 2',
- '1:3'); // pass uid without setting FT_UID option
+$sequences = [
+ 0,
+ 4, // out of range
+ '4', // out of range
+ '2',
+ '1,3',
+ '1, 2',
+ '1:3', // pass uid without setting FT_UID option
+];
-foreach($sequences as $msg_no) {
+foreach ($sequences as $msg_no) {
echo "\n-- \$msg_no is $msg_no --\n";
- $overview = imap_fetch_overview($stream_id, $msg_no);
+ $overview = imap_fetch_overview($stream_id, $msg_no);
if (!$overview) {
echo imap_last_error() . "\n";
- } else {
+ } else {
foreach($overview as $ov) {
echo "\n";
displayOverviewFields($ov);
- }
}
+ }
}
// clear error stack
@@ -38,12 +44,13 @@ imap_errors();
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchoverviewvar5';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_fetch_overview() : usage variations ***
Create a temporary mailbox and add 3 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- $msg_no is 0 --
Sequence out of range
diff --git a/ext/imap/tests/imap_fetch_overview_variation6.phpt b/ext/imap/tests/imap_fetch_overview_variation6.phpt
index 256f631082..0535b3d5ac 100644
--- a/ext/imap/tests/imap_fetch_overview_variation6.phpt
+++ b/ext/imap/tests/imap_fetch_overview_variation6.phpt
@@ -2,7 +2,7 @@
Test imap_fetch_overview() function : usage variations - multipart message
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -12,9 +12,9 @@ require_once(__DIR__.'/skipif.inc');
echo "*** Testing imap_fetch_overview() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once __DIR__.'/setup/imap_include.inc';
-$stream_id = setup_test_mailbox('', 0, $mailbox); // setup temp mailbox
+$stream_id = setup_test_mailbox('imapfetchoverviewvar6', 0, $mailbox); // setup temp mailbox
create_multipart_message($stream_id, $mailbox);
// refresh msg numbers
@@ -37,7 +37,7 @@ displayOverviewFields($a[0]);
function create_multipart_message($imap_stream, $mailbox) {
global $users, $domain;
$envelope["from"]= "foo@anywhere.com";
- $envelope["to"] = "$users[0]@$domain";
+ $envelope["to"] = IMAP_USERS[0] . '@' . IMAP_MAIL_DOMAIN;
$envelope["subject"] = "Test msg 1";
$part1["type"] = TYPEMULTIPART;
@@ -82,12 +82,13 @@ function create_multipart_message($imap_stream, $mailbox) {
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchoverviewvar6';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_fetch_overview() : usage variations ***
Create a temporary mailbox and add 0 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
--> Object #1
size is %d
diff --git a/ext/imap/tests/imap_fetchbody_basic.phpt b/ext/imap/tests/imap_fetchbody_basic.phpt
index 3c16f939c8..d0324383ea 100644
--- a/ext/imap/tests/imap_fetchbody_basic.phpt
+++ b/ext/imap/tests/imap_fetchbody_basic.phpt
@@ -2,7 +2,7 @@
Test imap_fetchbody() function : basic functionality
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -12,12 +12,12 @@ require_once(__DIR__.'/skipif.inc');
*/
echo "*** Testing imap_fetchbody() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
// Initialise all required variables
// set up mailbox with one message
-$stream_id = setup_test_mailbox('', 1, $mailbox, 'notSimple');
+$stream_id = setup_test_mailbox('imapfetchbodybasic', 1, $mailbox, false);
$msg_no = 1;
$section = '2';
@@ -57,12 +57,13 @@ var_dump( $overview[0]->seen );
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchbodybasic';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_fetchbody() : basic functionality ***
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- All possible arguments --
-- Option is FT_UID --
diff --git a/ext/imap/tests/imap_fetchbody_variation4.phpt b/ext/imap/tests/imap_fetchbody_variation4.phpt
index df5d895670..5e25dd1126 100644
--- a/ext/imap/tests/imap_fetchbody_variation4.phpt
+++ b/ext/imap/tests/imap_fetchbody_variation4.phpt
@@ -2,7 +2,7 @@
Test imap_fetchbody() function : usage variations - FT_UID option
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -13,10 +13,10 @@ require_once(__DIR__.'/skipif.inc');
*/
echo "*** Testing imap_fetchbody() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
// Initialise required variables
-$stream_id = setup_test_mailbox('', 1); // set up temporary mailbox with one simple message
+$stream_id = setup_test_mailbox('imapfetchbodyvar4', 1); // set up temporary mailbox with one simple message
$msg_no = 1;
$msg_uid = imap_uid($stream_id, $msg_no);
$section = 1;
@@ -47,12 +47,13 @@ foreach($flags as $option) {
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchbodyvar4';
+require_once(__DIR__.'/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing imap_fetchbody() : usage variations ***
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- Iteration 1 --
FT_UID valid
diff --git a/ext/imap/tests/imap_fetchbody_variation6.phpt b/ext/imap/tests/imap_fetchbody_variation6.phpt
index 8b3d73540a..7889c40193 100644
--- a/ext/imap/tests/imap_fetchbody_variation6.phpt
+++ b/ext/imap/tests/imap_fetchbody_variation6.phpt
@@ -2,7 +2,7 @@
Test imap_fetchbody() function : usage variations - $message_num arg
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -13,10 +13,10 @@ require_once(__DIR__.'/skipif.inc');
echo "*** Testing imap_fetchbody() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
//Initialise required variables
-$stream_id = setup_test_mailbox('', 3); // set up temp mailbox with simple msgs
+$stream_id = setup_test_mailbox('imapfetchbodyvar6', 3); // set up temp mailbox with simple msgs
$section = 1;
$sequences = [0, /* out of range */ 4, 1];
@@ -32,12 +32,13 @@ foreach($sequences as $message_num) {
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchbodyvar6';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_fetchbody() : usage variations ***
Create a temporary mailbox and add 3 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- $message_num is 0 --
imap_fetchbody(): Argument #2 ($message_num) must be greater than 0
@@ -48,5 +49,5 @@ Warning: imap_fetchbody(): Bad message number in %s on line %d
bool(false)
-- $message_num is 1 --
-string(%s) "1: this is a test message, please ignore
-%A"
+string(%d) "1: this is a test message, please ignore
+newline%r\R?%r"
diff --git a/ext/imap/tests/imap_fetchheader_basic.phpt b/ext/imap/tests/imap_fetchheader_basic.phpt
index 44f7de5a39..dc934e00cf 100644
--- a/ext/imap/tests/imap_fetchheader_basic.phpt
+++ b/ext/imap/tests/imap_fetchheader_basic.phpt
@@ -2,15 +2,15 @@
Test imap_fetchheader() function : basic function
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_fetchheader() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
// Initialise all required variables
-$stream_id = setup_test_mailbox('', 1, $mailbox, 'multiPart'); // setup temp mailbox with 1 msg
+$stream_id = setup_test_mailbox('imapfetchheaderbasic', 1, $mailbox, false); // setup temp mailbox with 1 msg
$msg_no = 1;
$options = array('FT_UID' => FT_UID, 'FT_INTERNAL' => FT_INTERNAL,
'FT_PREFETCHTEXT' => FT_PREFETCHTEXT);
@@ -33,12 +33,13 @@ var_dump( imap_fetchheader($stream_id, $msg_no) );
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchheaderbasic';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_fetchheader() : basic functionality ***
Create a temporary mailbox and add 1 msgs
-.. mailbox '%s.phpttest' created
+New mailbox created
-- All possible arguments --
-- Option is FT_UID --
diff --git a/ext/imap/tests/imap_fetchheader_variation3.phpt b/ext/imap/tests/imap_fetchheader_variation3.phpt
index a457db0491..1289087b7d 100644
--- a/ext/imap/tests/imap_fetchheader_variation3.phpt
+++ b/ext/imap/tests/imap_fetchheader_variation3.phpt
@@ -2,7 +2,7 @@
Test imap_fetchheader() function : usage variations - FT_UID option
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -14,10 +14,10 @@ require_once(__DIR__.'/skipif.inc');
echo "*** Testing imap_fetchheader() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
// Initialise required variables
-$stream_id = setup_test_mailbox('', 1); // set up temporary mailbox with one simple message
+$stream_id = setup_test_mailbox('imapfetchheadervar3', 1); // set up temporary mailbox with one simple message
$msg_no = 1;
$msg_uid = imap_uid($stream_id, $msg_no);
@@ -44,12 +44,13 @@ foreach($flags as $option) {
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchheadervar3';
+require_once(__DIR__ . '/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing imap_fetchheader() : usage variations ***
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- Iteration 1 --
FT_UID valid
diff --git a/ext/imap/tests/imap_fetchheader_variation5.phpt b/ext/imap/tests/imap_fetchheader_variation5.phpt
index cb00986a06..eb6493017b 100644
--- a/ext/imap/tests/imap_fetchheader_variation5.phpt
+++ b/ext/imap/tests/imap_fetchheader_variation5.phpt
@@ -2,7 +2,7 @@
Test imap_fetchheader() function : usage variations - $message_num argument
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
@@ -13,9 +13,9 @@ require_once(__DIR__.'/skipif.inc');
echo "*** Testing imap_fetchheader() : usage variations ***\n";
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
-$stream_id = setup_test_mailbox('', 3, $mailbox, 'notSimple'); // set up temp mailbox with 3 msgs
+$stream_id = setup_test_mailbox('imapfetchheadervar5', 3, $mailbox, false); // set up temp mailbox with 3 msgs
$sequences = [0, /* out of range */ 4, 1];
@@ -33,12 +33,13 @@ imap_errors();
?>
--CLEAN--
<?php
-require_once(__DIR__.'/clean.inc');
+$mailbox_suffix = 'imapfetchheadervar5';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
*** Testing imap_fetchheader() : usage variations ***
Create a temporary mailbox and add 3 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
-- $message_num is 0 --
imap_fetchheader(): Argument #2 ($message_num) must be greater than 0
diff --git a/ext/imap/tests/imap_fetchstructure_basic.phpt b/ext/imap/tests/imap_fetchstructure_basic.phpt
index 24cd2307dd..2eb730c890 100644
--- a/ext/imap/tests/imap_fetchstructure_basic.phpt
+++ b/ext/imap/tests/imap_fetchstructure_basic.phpt
@@ -4,13 +4,13 @@ imap_fetchstructure() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = setup_test_mailbox('', 1);
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = setup_test_mailbox('imapfetchstructurebasic', 1);
try {
imap_fetchstructure($stream_id,0);
@@ -38,11 +38,12 @@ imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imapfetchstructurebasic';
+require_once('setup/clean.inc');
?>
--EXPECTF--
Create a temporary mailbox and add 1 msgs
-.. mailbox '{127.0.0.1:143/norsh}INBOX.phpttest' created
+New mailbox created
imap_fetchstructure(): Argument #2 ($message_num) must be greater than 0
bool(true)
bool(true)
diff --git a/ext/imap/tests/imap_gc_error.phpt b/ext/imap/tests/imap_gc_error.phpt
index 5b5b65d271..7c6fa3da84 100644
--- a/ext/imap/tests/imap_gc_error.phpt
+++ b/ext/imap/tests/imap_gc_error.phpt
@@ -1,18 +1,17 @@
--TEST--
-imap_gc() incorrect parameter count
+imap_gc() ValueError
--CREDITS--
Paul Sohier
#phptestfest utrecht
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = imap_open($default_mailbox, $username, $password) or
- die("Cannot connect to mailbox $default_mailbox: " . imap_last_error());
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = setup_test_mailbox('imapgcerror', 1);
try {
imap_gc($stream_id, -1);
@@ -21,5 +20,12 @@ try {
}
?>
+--CLEAN--
+<?php
+$mailbox_suffix = 'imapgcerror';
+require_once(__DIR__.'/setup/clean.inc');
+?>
--EXPECT--
+Create a temporary mailbox and add 1 msgs
+New mailbox created
imap_gc(): Argument #2 ($flags) must be a bitmask of IMAP_GC_TEXTS, IMAP_GC_ELT, and IMAP_GC_ENV
diff --git a/ext/imap/tests/imap_getsubscribed_basic.phpt b/ext/imap/tests/imap_getsubscribed_basic.phpt
index 8e5d85383d..a1519042f1 100644
--- a/ext/imap/tests/imap_getsubscribed_basic.phpt
+++ b/ext/imap/tests/imap_getsubscribed_basic.phpt
@@ -4,27 +4,29 @@ imap_getsubscribed() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
if (getenv("SKIP_ASAN")) die("skip asan chokes on this: 'LeakSanitizer does not work under ptrace (strace, gdb, etc)'");
?>
+--CONFLICTS--
+defaultmailbox
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = imap_open($default_mailbox, $username, $password) or
- die("Cannot connect to mailbox $default_mailbox: " . imap_last_error());
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD) or
+ die("Cannot connect to mailbox ". IMAP_DEFAULT_MAILBOX. ": " . imap_last_error());
-var_dump(imap_getsubscribed($stream_id,$default_mailbox,'ezDvfXvbvcxSerz'));
+var_dump(imap_getsubscribed($stream_id, IMAP_DEFAULT_MAILBOX, 'ezDvfXvbvcxSerz'));
echo "Checking OK\n";
-$newbox = $default_mailbox . "." . $mailbox_prefix;
+$newbox = IMAP_DEFAULT_MAILBOX . "." . IMAP_MAILBOX_PHPT_PREFIX;
imap_createmailbox($stream_id, $newbox);
imap_subscribe($stream_id, $newbox);
-$z = imap_getsubscribed($stream_id,$default_mailbox,'*');
+$z = imap_getsubscribed($stream_id, IMAP_DEFAULT_MAILBOX, '*');
var_dump(is_array($z));
var_dump($z[0]);
@@ -33,7 +35,8 @@ imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = '';
+require_once(__DIR__ . '/setup/clean.inc');
?>
--EXPECTF--
bool(false)
diff --git a/ext/imap/tests/imap_headerinfo_basic.phpt b/ext/imap/tests/imap_headerinfo_basic.phpt
index 056a46523c..0d84aee44b 100644
--- a/ext/imap/tests/imap_headerinfo_basic.phpt
+++ b/ext/imap/tests/imap_headerinfo_basic.phpt
@@ -4,13 +4,13 @@ imap_headerinfo() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = setup_test_mailbox('', 1);
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = setup_test_mailbox('imapheaderinfobasic', 1);
$z = imap_headerinfo($stream_id, 1);
@@ -85,11 +85,12 @@ imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imapheaderinfobasic';
+require_once('setup/clean.inc');
?>
--EXPECTF--
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
Check general fields
bool(true)
bool(true)
diff --git a/ext/imap/tests/imap_list_basic.phpt b/ext/imap/tests/imap_list_basic.phpt
index addcf70e77..e11c6c1bd0 100644
--- a/ext/imap/tests/imap_list_basic.phpt
+++ b/ext/imap/tests/imap_list_basic.phpt
@@ -4,20 +4,22 @@ imap_list() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = imap_open($default_mailbox, $username, $password) or
- die("Cannot connect to mailbox $default_mailbox: " . imap_last_error());
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD) or
+ die("Cannot connect to mailbox " .IMAP_DEFAULT_MAILBOX.": " . imap_last_error());
-imap_list($stream_id,$default_mailbox,'ezerz');
+imap_list($stream_id, IMAP_DEFAULT_MAILBOX,'ezerz');
-$z = imap_list($stream_id,$default_mailbox,'*');
+$z = imap_list($stream_id, IMAP_DEFAULT_MAILBOX,'*');
var_dump(is_array($z));
+
+// e.g. "{127.0.0.1:143/norsh}INBOX"
var_dump($z[0]);
imap_close($stream_id);
diff --git a/ext/imap/tests/imap_lsub_basic.phpt b/ext/imap/tests/imap_lsub_basic.phpt
index 3cd4722e1f..2fff7eeac8 100644
--- a/ext/imap/tests/imap_lsub_basic.phpt
+++ b/ext/imap/tests/imap_lsub_basic.phpt
@@ -4,36 +4,41 @@ imap_lsub() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
if (getenv("SKIP_ASAN")) die("skip leak sanitizer crashes");
?>
+--CONFLICTS--
+defaultmailbox
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = imap_open($default_mailbox, $username, $password) or
- die("Cannot connect to mailbox $default_mailbox: " . imap_last_error());
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD) or
+ die("Cannot connect to mailbox " .IMAP_DEFAULT_MAILBOX. ": " . imap_last_error());
-var_dump(imap_lsub($stream_id,$default_mailbox,'ezDvfXvbvcxSerz'));
+var_dump(imap_lsub($stream_id, IMAP_DEFAULT_MAILBOX, 'ezDvfXvbvcxSerz'));
echo "Checking OK\n";
-$newbox = $default_mailbox . "." . $mailbox_prefix;
+$newbox = IMAP_DEFAULT_MAILBOX . "." . IMAP_MAILBOX_PHPT_PREFIX;
imap_createmailbox($stream_id, $newbox);
imap_subscribe($stream_id, $newbox);
-$z = imap_lsub($stream_id,$default_mailbox,'*');
+$z = imap_lsub($stream_id, IMAP_DEFAULT_MAILBOX, '*');
var_dump(is_array($z));
+
+// e.g. "{127.0.0.1:143/norsh}INBOX.phpttest"
var_dump($z[0]);
imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = '';
+require_once(__DIR__.'/setup/clean.inc');
?>
--EXPECTF--
bool(false)
diff --git a/ext/imap/tests/imap_mail_copy_basic.phpt b/ext/imap/tests/imap_mail_copy_basic.phpt
index 25725478a6..312c8198a6 100644
--- a/ext/imap/tests/imap_mail_copy_basic.phpt
+++ b/ext/imap/tests/imap_mail_copy_basic.phpt
@@ -4,36 +4,33 @@ Test imap_mail_copy() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_mail_copy() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
-
+require_once(__DIR__.'/setup/imap_include.inc');
echo "Create a new mailbox for test\n";
-$imap_stream = setup_test_mailbox("", 1);
-if (!is_resource($imap_stream)) {
- exit("TEST FAILED: Unable to create test mailbox\n");
-}
+$imap_stream = setup_test_mailbox('copybasic', 1);
$check = imap_check($imap_stream);
echo "Msg Count in new mailbox: ". $check->Nmsgs . "\n";
-var_dump(imap_mail_copy($imap_stream, '1', 'INBOX.'.$mailbox_prefix));
+var_dump(imap_mail_copy($imap_stream, '1', 'INBOX.' . IMAP_MAILBOX_PHPT_PREFIX . 'copybasic'));
imap_close($imap_stream);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'copybasic';
+require_once('setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing imap_mail_copy() : basic functionality ***
Create a new mailbox for test
Create a temporary mailbox and add 1 msgs
-.. mailbox '%s' created
+New mailbox created
Msg Count in new mailbox: 1
bool(true)
diff --git a/ext/imap/tests/imap_mail_move_basic.phpt b/ext/imap/tests/imap_mail_move_basic.phpt
index 3988951f12..3cd347b627 100644
--- a/ext/imap/tests/imap_mail_move_basic.phpt
+++ b/ext/imap/tests/imap_mail_move_basic.phpt
@@ -4,36 +4,33 @@ Test imap_mail_move() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
echo "*** Testing imap_mail_move() : basic functionality ***\n";
-require_once(__DIR__.'/imap_include.inc');
-
+require_once(__DIR__.'/setup/imap_include.inc');
echo "Create a new mailbox for test\n";
-$imap_stream = setup_test_mailbox("", 1);
-if (!is_resource($imap_stream)) {
- exit("TEST FAILED: Unable to create test mailbox\n");
-}
+$imap_stream = setup_test_mailbox("movebasic", 1);
$check = imap_check($imap_stream);
echo "Msg Count in new mailbox: ". $check->Nmsgs . "\n";
-var_dump(imap_mail_move($imap_stream, '1', 'INBOX.'.$mailbox_prefix));
+var_dump(imap_mail_move($imap_stream, '1', 'INBOX.' . IMAP_MAILBOX_PHPT_PREFIX . 'movebasic'));
imap_close($imap_stream);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'movebasic';
+require_once(__DIR__.'/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
*** Testing imap_mail_move() : basic functionality ***
Create a new mailbox for test
Create a temporary mailbox and add 1 msgs
-.. mailbox '%s' created
+New mailbox created
Msg Count in new mailbox: 1
bool(true)
diff --git a/ext/imap/tests/imap_mutf7_to_utf8.phpt b/ext/imap/tests/imap_mutf7_to_utf8.phpt
index f45361f4a9..835a25428f 100644
--- a/ext/imap/tests/imap_mutf7_to_utf8.phpt
+++ b/ext/imap/tests/imap_mutf7_to_utf8.phpt
@@ -2,7 +2,6 @@
imap_mutf7_to_utf8
--SKIPIF--
<?php if (!extension_loaded("imap")) print "skip"; ?>
-<?php if (!function_exists("imap_mutf7_to_utf8")) print "skip"; ?>
--FILE--
<?php
diff --git a/ext/imap/tests/imap_open_error.phpt b/ext/imap/tests/imap_open_error.phpt
index be1063fadc..5ef4a2918d 100644
--- a/ext/imap/tests/imap_open_error.phpt
+++ b/ext/imap/tests/imap_open_error.phpt
@@ -5,7 +5,7 @@ Paul Sohier
#phptestfest utrecht
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
if (getenv("SKIP_ASAN")) die("skip leak sanitizer crashes");
?>
--FILE--
@@ -20,10 +20,8 @@ try {
echo $e->getMessage() . \PHP_EOL;
}
-require_once(__DIR__.'/imap_include.inc');
-
try {
- imap_open($default_mailbox, $username, $password, NIL, -1);
+ imap_open('', '', '', NIL, -1);
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
diff --git a/ext/imap/tests/imap_renamemailbox_basic.phpt b/ext/imap/tests/imap_renamemailbox_basic.phpt
index c6b1812d16..05f1e4a309 100644
--- a/ext/imap/tests/imap_renamemailbox_basic.phpt
+++ b/ext/imap/tests/imap_renamemailbox_basic.phpt
@@ -4,20 +4,16 @@ imap_renamemailbox() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
+require_once(__DIR__.'/setup/imap_include.inc');
-$stream_id = setup_test_mailbox('', 1);
+$stream_id = setup_test_mailbox('imaprenamemailbox1', 1);
-if (!is_resource($stream_id)) {
- exit("TEST FAILED: Unable to create test mailbox\n");
-}
-
-$newbox = $default_mailbox . "." . $mailbox_prefix;
+$mailboxBaseName = IMAP_DEFAULT_MAILBOX . '.' . IMAP_MAILBOX_PHPT_PREFIX;
//commented because of bug #49901
//$ancError = error_reporting(0);
@@ -26,19 +22,17 @@ $newbox = $default_mailbox . "." . $mailbox_prefix;
//error_reporting($ancError);
echo "Checking OK\n";
-
-var_dump(imap_createmailbox($stream_id, $newbox.'.test'));
-var_dump(imap_renamemailbox($stream_id, $newbox.'.test', $newbox.'.testd'));
+var_dump(imap_renamemailbox($stream_id, $mailboxBaseName . 'imaprenamemailbox1', $mailboxBaseName . 'imaprenamemailbox2'));
imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = ['imaprenamemailbox1', 'imaprenamemailbox2'];
+require_once('setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
Checking OK
bool(true)
-bool(true)
diff --git a/ext/imap/tests/imap_rfc822_parse_headers_basic.phpt b/ext/imap/tests/imap_rfc822_parse_headers_basic.phpt
index 87dc4aaf05..fd2dfb939d 100644
--- a/ext/imap/tests/imap_rfc822_parse_headers_basic.phpt
+++ b/ext/imap/tests/imap_rfc822_parse_headers_basic.phpt
@@ -4,13 +4,13 @@ imap_rfc822_parse_headers() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = setup_test_mailbox('', 1);
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = setup_test_mailbox('imaprfc822parseheadersbasic', 1);
$z = imap_headerinfo($stream_id, 1);
@@ -85,11 +85,12 @@ imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imaprfc822parseheadersbasic';
+require_once(__DIR__ . '/setup/clean.inc');
?>
--EXPECTF--
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
Check general fields
bool(true)
bool(true)
diff --git a/ext/imap/tests/imap_savebody_basic.phpt b/ext/imap/tests/imap_savebody_basic.phpt
index ccbaa1ba66..38be6ab4a0 100644
--- a/ext/imap/tests/imap_savebody_basic.phpt
+++ b/ext/imap/tests/imap_savebody_basic.phpt
@@ -4,13 +4,13 @@ imap_savebody() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = setup_test_mailbox('', 1);
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = setup_test_mailbox('imapsavebodybasic', 1);
$file = __DIR__.'/tmpsavebody.txt';
@@ -31,11 +31,12 @@ imap_close($stream_id);
--CLEAN--
<?php
@unlink(__DIR__.'/tmpsavebody.txt');
-require_once('clean.inc');
+$mailbox_suffix = 'imapsavebodybasic';
+require_once(__DIR__ . '/setup/clean.inc');
?>
--EXPECTF--
Create a temporary mailbox and add 1 msgs
-.. mailbox '{127.0.0.1:143/norsh}INBOX.phpttest' created
+New mailbox created
bool(true)
Size: %d
bool(true)
diff --git a/ext/imap/tests/imap_timeout_basic.phpt b/ext/imap/tests/imap_timeout_basic.phpt
index f9618c3e3a..e449c3fdec 100644
--- a/ext/imap/tests/imap_timeout_basic.phpt
+++ b/ext/imap/tests/imap_timeout_basic.phpt
@@ -4,7 +4,7 @@ imap_timeout() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
diff --git a/ext/imap/tests/imap_undelete_basic.phpt b/ext/imap/tests/imap_undelete_basic.phpt
index 7cc9ff3847..b792fd093e 100644
--- a/ext/imap/tests/imap_undelete_basic.phpt
+++ b/ext/imap/tests/imap_undelete_basic.phpt
@@ -4,13 +4,13 @@ imap_undelete() function : basic functionality
Olivier Doucet
--SKIPIF--
<?php
-require_once(__DIR__.'/skipif.inc');
+require_once(__DIR__.'/setup/skipif.inc');
?>
--FILE--
<?php
-require_once(__DIR__.'/imap_include.inc');
-$stream_id = setup_test_mailbox('', 1);
+require_once(__DIR__.'/setup/imap_include.inc');
+$stream_id = setup_test_mailbox('imapundeletebasic', 1);
imap_delete($stream_id, 1);
@@ -21,9 +21,10 @@ imap_close($stream_id);
?>
--CLEAN--
<?php
-require_once('clean.inc');
+$mailbox_suffix = 'imapundeletebasic';
+require_once(__DIR__ . '/setup/clean.inc');
?>
---EXPECTF--
+--EXPECT--
Create a temporary mailbox and add 1 msgs
-.. mailbox '{%s}%s' created
+New mailbox created
bool(true)
diff --git a/ext/imap/tests/imap_utf8.phpt b/ext/imap/tests/imap_utf8.phpt
index a82c3721c3..522d4d6f56 100644
--- a/ext/imap/tests/imap_utf8.phpt
+++ b/ext/imap/tests/imap_utf8.phpt
@@ -11,8 +11,8 @@ var_dump(imap_utf8("test"));
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
string(0) ""
string(1) "1"
-string(4) "%s"
+string(4) "test"
Done
diff --git a/ext/imap/tests/imap_utf8_to_mutf7_basic.phpt b/ext/imap/tests/imap_utf8_to_mutf7_basic.phpt
index 8037ae9491..c0f3b06dc9 100644
--- a/ext/imap/tests/imap_utf8_to_mutf7_basic.phpt
+++ b/ext/imap/tests/imap_utf8_to_mutf7_basic.phpt
@@ -2,7 +2,6 @@
imap_utf8_to_mutf7
--SKIPIF--
<?php if (!extension_loaded("imap")) print "skip imap extension not loaded"; ?>
-<?php if (!function_exists("imap_utf8_to_mutf7")) print "skip imap_utf8_to_mutf7() not available"; ?>
--FILE--
<?php
diff --git a/ext/imap/tests/setup/clean.inc b/ext/imap/tests/setup/clean.inc
new file mode 100644
index 0000000000..608d553b4f
--- /dev/null
+++ b/ext/imap/tests/setup/clean.inc
@@ -0,0 +1,32 @@
+<?php
+require_once 'imap_include.inc';
+
+if (!isset($mailbox_suffix)) { throw new Exception("No suffix provided"); }
+
+$imap_stream = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
+
+// delete all msgs in default mailbox, i.e INBOX
+$check = imap_check($imap_stream);
+for ($i = 1; $i <= $check->Nmsgs; $i++) {
+ imap_delete($imap_stream, $i);
+}
+
+
+$mailboxes = imap_getmailboxes($imap_stream, IMAP_SERVER, '*');
+
+if (!is_array($mailbox_suffix)) {
+ $mailbox_suffixes = [$mailbox_suffix];
+} else {
+ $mailbox_suffixes = $mailbox_suffix;
+}
+
+foreach ($mailbox_suffixes as $mailbox_suffix) {
+ foreach($mailboxes as $value) {
+ // Only delete mailbox with our prefix (+ optional test suffix)
+ if (preg_match('/\{.*?\}INBOX\.' . IMAP_MAILBOX_PHPT_PREFIX . $mailbox_suffix .'$/', $value->name, $match) == 1) {
+ imap_deletemailbox($imap_stream, $value->name);
+ }
+ }
+}
+
+imap_close($imap_stream, CL_EXPUNGE);
diff --git a/ext/imap/tests/dovecot.conf b/ext/imap/tests/setup/dovecot.conf
index c465ba3ce9..c465ba3ce9 100644
--- a/ext/imap/tests/dovecot.conf
+++ b/ext/imap/tests/setup/dovecot.conf
diff --git a/ext/imap/tests/dovecotpass b/ext/imap/tests/setup/dovecotpass
index 86a069fc4f..86a069fc4f 100644
--- a/ext/imap/tests/dovecotpass
+++ b/ext/imap/tests/setup/dovecotpass
diff --git a/ext/imap/tests/imap_include.inc b/ext/imap/tests/setup/imap_include.inc
index e57d651697..33e4e5ca16 100644
--- a/ext/imap/tests/imap_include.inc
+++ b/ext/imap/tests/setup/imap_include.inc
@@ -1,31 +1,34 @@
<?php
-// Change these to make tests run successfully
-$server = '{127.0.0.1:143/norsh}';
-$default_mailbox = $server . "INBOX";
-$domain = "something.com";
-$admin_user = "webmaster"; // a user with admin access
-$username = "$admin_user@$domain";
-$password = 'p4ssw0rd';
-$users = array("webmaster", "info", "admin", "foo"); // tests require 4 valid userids
-$mailbox_prefix = "phpttest"; // name used for test mailbox
+/** If required change these values to make the test runs */
+const IMAP_SERVER_NO_DEBUG = '{127.0.0.1:143/norsh}';
+const IMAP_SERVER_DEBUG = '{127.0.0.1:143/debug/norsh}';
+const IMAP_SERVER = IMAP_SERVER_DEBUG;
+const IMAP_DEFAULT_MAILBOX = IMAP_SERVER . 'INBOX';
+const IMAP_MAIL_DOMAIN = 'something.com';
+const IMAP_ADMIN_USER = 'webmaster'; // a user with admin access
+const IMAP_MAILBOX_USERNAME = IMAP_ADMIN_USER . '@' . IMAP_MAIL_DOMAIN;
+const IMAP_MAILBOX_PASSWORD = 'p4ssw0rd';
+const IMAP_MAILBOX_PHPT_PREFIX = 'phpttest';
+/** Tests require 4 valid userids */
+const IMAP_USERS = ["webmaster", "info", "admin", "foo"];
+
+/** list of fields to expect */
+const MANDATORY_OVERVIEW_FIELDS = [
+ 'size',
+ 'uid',
+ 'msgno',
+ 'recent',
+ 'flagged',
+ 'answered',
+ 'deleted',
+ 'seen',
+ 'draft',
+ 'udate',
+];
// record test start time (used by displayOverviewFields())
$start_time = time();
-// list of fields to expect
-$mandatory_overview_fields = array(
- 'size',
- 'uid',
- 'msgno',
- 'recent',
- 'flagged',
- 'answered',
- 'deleted',
- 'seen',
- 'draft',
- 'udate',
- );
-
/**
* Display all fields in an element from an imap_fetch_overview() response
*
@@ -33,25 +36,23 @@ $mandatory_overview_fields = array(
* server with its clock synced to the current system, which is consistent with
* setup instructions in ext/imap/tests/README.md
*
- * @param array resp element from the return value of imap_fetch_overview()
+ * @param $resp
+ * @param string[] $fields
*/
-function displayOverviewFields($resp, $fields=null) {
- global $mandatory_overview_fields;
- global $start_time;
-
- foreach ($fields ? $fields : $mandatory_overview_fields as $mf)
- {
- $z = $resp->$mf;
- if ($mf == 'udate') {
- if (($z >= $start_time) && ($z <= time())) {
- echo "$mf is OK\n";
- } else {
- echo "$mf is BAD ($z)\n";
- }
- } else {
- echo "$mf is $z\n";
+function displayOverviewFields($resp, array $fields = MANDATORY_OVERVIEW_FIELDS) {
+ global $start_time;
+ foreach ($fields as $mf) {
+ $z = $resp->$mf;
+ if ($mf == 'udate') {
+ if (($z >= $start_time) && ($z <= time())) {
+ echo "$mf is OK\n";
+ } else {
+ echo "$mf is BAD ($z)\n";
+ }
+ } else {
+ echo "$mf is $z\n";
+ }
}
- }
}
@@ -60,33 +61,27 @@ function displayOverviewFields($resp, $fields=null) {
*
* @param string mailbox_suffix Suffix used to uniquely identify mailboxes
* @param int message_count number of test msgs to be written to new mailbox
- *
- * @return IMAP stream to new mailbox on success; FALSE on failure
+ * @param null $new_mailbox
+ * @param bool $simpleMessages
+ * @return resource IMAP stream to new mailbox
+ * @throws Exception
*/
-function setup_test_mailbox($mailbox_suffix, $message_count, &$new_mailbox = null, $msg_type = "simple"){
- global $server, $default_mailbox, $username, $password;
-
+function setup_test_mailbox(string $mailbox_suffix, int $message_count, &$new_mailbox = null, bool $simpleMessages = true){
// open a stream to default mailbox
- $imap_stream = imap_open($default_mailbox, $username, $password);
+ $imap_stream = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
if ($imap_stream === false) {
- echo "Cannot connect to IMAP server $server: " . imap_last_error() . "\n";
- return false;
+ throw new Exception("Cannot connect to IMAP server " . IMAP_SERVER . ": " . imap_last_error());
}
echo "Create a temporary mailbox and add " . $message_count . " msgs\n";
- $new_mailbox = create_mailbox($imap_stream, $mailbox_suffix, $message_count, $msg_type);
- if ($new_mailbox === false) {
- echo "Can't create a temporary mailbox: " . imap_last_error(). "\n";
- return false;
- }
+ $new_mailbox = create_mailbox($imap_stream, $mailbox_suffix, $message_count, $simpleMessages);
- echo ".. mailbox '$new_mailbox' created\n";
+ echo "New mailbox created\n";
// reopen stream to new mailbox
if (imap_reopen($imap_stream, $new_mailbox) === false) {
- echo "can't re-open '$new_mailbox' mailbox: " . imap_last_error() . "\n";
- return false;
+ throw new Exception("Can't re-open '$new_mailbox' mailbox: " . imap_last_error());
}
return $imap_stream;
@@ -96,11 +91,14 @@ function setup_test_mailbox($mailbox_suffix, $message_count, &$new_mailbox = nul
* Create mailbox and fill with generic emails
*
* @param resource $imap_stream
- * @param string $mailbox
+ * @param string $mailbox_suffix
+ * @param int $message_count
+ * @param bool $simpleMessages
+ * @return string
+ * @throws Exception
*/
-function create_mailbox($imap_stream, $mailbox_suffix, $message_count, $msg_type= "simple"){
- global $default_mailbox, $mailbox_prefix;
- $mailbox = $default_mailbox . "." . $mailbox_prefix . $mailbox_suffix;
+function create_mailbox($imap_stream, string $mailbox_suffix, int $message_count, bool $simpleMessages = true): string {
+ $mailbox = IMAP_DEFAULT_MAILBOX . '.' . IMAP_MAILBOX_PHPT_PREFIX . $mailbox_suffix;
$mailboxes = imap_getmailboxes($imap_stream, $mailbox, '*');
@@ -108,18 +106,18 @@ function create_mailbox($imap_stream, $mailbox_suffix, $message_count, $msg_type
if ($mailboxes) {
foreach($mailboxes as $value) {
if ($value->name == $mailbox) {
- exit ("TEST FAILED : Mailbox '$mailbox' already exists\n");
+ throw new Exception("Mailbox '$mailbox' already exists");
}
}
}
if (imap_createmailbox($imap_stream, $mailbox) === false) {
- return false;
+ throw new Exception("Can't create a temporary mailbox: " . imap_last_error());
}
// Add number of test msgs requested
if ($message_count > 0) {
- populate_mailbox($imap_stream, $mailbox, $message_count, $msg_type);
+ populate_mailbox($imap_stream, $mailbox, $message_count, $simpleMessages);
}
return $mailbox;
@@ -130,21 +128,20 @@ function create_mailbox($imap_stream, $mailbox_suffix, $message_count, $msg_type
*
* @param resource $imap_stream
* @param string $mailbox
+ * @param int $message_count
+ * @param bool $simpleMessages
*/
-function populate_mailbox($imap_stream, $mailbox, $message_count, $msg_type = "simple"){
-
- global $users, $domain;
-
- for($i = 1; $i <= $message_count; $i++) {
- if ($msg_type == "simple") {
+function populate_mailbox($imap_stream, string $mailbox, int $message_count, bool $simpleMessages = true): void {
+ for ($i = 1; $i <= $message_count; $i++) {
+ if ($simpleMessages) {
$msg = "From: foo@anywhere.com\r\n"
- . "To: $users[0]@$domain\r\n"
+ . "To: ". IMAP_USERS[0] . "@" . IMAP_MAIL_DOMAIN . "\r\n"
. "Subject: test$i\r\n"
. "\r\n"
- . "$i: this is a test message, please ignore\r\n";
+ . "$i: this is a test message, please ignore\r\nnewline";
} else {
$envelope["from"]= "foo@anywhere.com";
- $envelope["to"] = "$users[0]@$domain";
+ $envelope["to"] = IMAP_USERS[0] . "@" . IMAP_MAIL_DOMAIN;
$envelope["subject"] = "Test msg $i";
$part1["type"] = TYPEMULTIPART;
@@ -181,16 +178,13 @@ function populate_mailbox($imap_stream, $mailbox, $message_count, $msg_type = "s
* Get the mailbox name from a mailbox description, i.e strip off server details.
*
* @param string mailbox complete mailbox name
- * @return mailbox name
+ * @return string mailbox name
*/
-function get_mailbox_name($mailbox){
+function get_mailbox_name(string $mailboxName): string {
- if (preg_match('/\{.*?\}(.*)/', $mailbox, $match) != 1) {
- echo "Unrecpognized mailbox name\n";
- return false;
+ if (preg_match('/\{.*?\}(.*)/', $mailboxName, $match) != 1) {
+ throw new Exception("Unrecognized mailbox name '$mailboxName'");
}
return $match[1];
}
-
-?>
diff --git a/ext/imap/tests/setup.sh b/ext/imap/tests/setup/setup.sh
index 5cb18334a3..efa7c30310 100644
--- a/ext/imap/tests/setup.sh
+++ b/ext/imap/tests/setup/setup.sh
@@ -1,6 +1,6 @@
sudo service dovecot stop
sudo groupadd -g 5000 vmail
sudo useradd -m -d /var/vmail -s /bin/false -u 5000 -g vmail vmail
-sudo cp ext/imap/tests/dovecot.conf /etc/dovecot/dovecot.conf
-sudo cp ext/imap/tests/dovecotpass /etc/dovecot/dovecotpass
+sudo cp ext/imap/tests/setup/dovecot.conf /etc/dovecot/dovecot.conf
+sudo cp ext/imap/tests/setup/dovecotpass /etc/dovecot/dovecotpass
sudo service dovecot start
diff --git a/ext/imap/tests/setup/skipif.inc b/ext/imap/tests/setup/skipif.inc
new file mode 100644
index 0000000000..c7dc24efd7
--- /dev/null
+++ b/ext/imap/tests/setup/skipif.inc
@@ -0,0 +1,13 @@
+<?php
+extension_loaded('imap') or die('skip imap extension not available in this build');
+
+include __DIR__ . '/imap_include.inc';
+
+$options = OP_HALFOPEN; // this should be enough to verify server present
+$retries = 0; // don't retry connect on failure
+
+$mbox = @imap_open(IMAP_SERVER, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD, $options, $retries);
+if (!$mbox) {
+ die("skip could not connect to mailbox " . IMAP_SERVER);
+}
+imap_close($mbox);
diff --git a/ext/imap/tests/skipif.inc b/ext/imap/tests/skipif.inc
deleted file mode 100644
index 2167ad1d0c..0000000000
--- a/ext/imap/tests/skipif.inc
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-extension_loaded('imap') or die('skip imap extension not available in this build');
-
-// Change these to make tests run successfully
-$mailbox = '{127.0.0.1:143/debug/norsh}';
-$username = 'webmaster@something.com';
-$password = 'p4ssw0rd';
-$options = OP_HALFOPEN; // this should be enough to verify server present
-$retries = 0; // don't retry connect on failure
-
-$mbox = @imap_open($mailbox, $username, $password, $options, $retries);
-if (!$mbox) {
- die("skip could not connect to mailbox $mailbox");
-}
-imap_close($mbox);
-?>
diff --git a/ext/mbstring/config.m4 b/ext/mbstring/config.m4
index 74266e4166..9547130fba 100644
--- a/ext/mbstring/config.m4
+++ b/ext/mbstring/config.m4
@@ -94,18 +94,10 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
PHP_MBSTRING_ADD_SOURCES([
libmbfl/filters/html_entities.c
libmbfl/filters/mbfilter_7bit.c
- libmbfl/filters/mbfilter_ascii.c
libmbfl/filters/mbfilter_base64.c
libmbfl/filters/mbfilter_big5.c
- libmbfl/filters/mbfilter_byte2.c
- libmbfl/filters/mbfilter_byte4.c
- libmbfl/filters/mbfilter_cp1251.c
- libmbfl/filters/mbfilter_cp1252.c
- libmbfl/filters/mbfilter_cp1254.c
libmbfl/filters/mbfilter_cp5022x.c
libmbfl/filters/mbfilter_cp51932.c
- libmbfl/filters/mbfilter_cp850.c
- libmbfl/filters/mbfilter_cp866.c
libmbfl/filters/mbfilter_cp932.c
libmbfl/filters/mbfilter_cp936.c
libmbfl/filters/mbfilter_gb18030.c
@@ -121,24 +113,9 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/filters/mbfilter_iso2022jp_2004.c
libmbfl/filters/mbfilter_iso2022jp_mobile.c
libmbfl/filters/mbfilter_iso2022_kr.c
- libmbfl/filters/mbfilter_iso8859_1.c
- libmbfl/filters/mbfilter_iso8859_10.c
- libmbfl/filters/mbfilter_iso8859_13.c
- libmbfl/filters/mbfilter_iso8859_14.c
- libmbfl/filters/mbfilter_iso8859_15.c
- libmbfl/filters/mbfilter_iso8859_16.c
- libmbfl/filters/mbfilter_iso8859_2.c
- libmbfl/filters/mbfilter_iso8859_3.c
- libmbfl/filters/mbfilter_iso8859_4.c
- libmbfl/filters/mbfilter_iso8859_5.c
- libmbfl/filters/mbfilter_iso8859_6.c
- libmbfl/filters/mbfilter_iso8859_7.c
- libmbfl/filters/mbfilter_iso8859_8.c
- libmbfl/filters/mbfilter_iso8859_9.c
libmbfl/filters/mbfilter_jis.c
- libmbfl/filters/mbfilter_koi8r.c
- libmbfl/filters/mbfilter_armscii8.c
libmbfl/filters/mbfilter_qprint.c
+ libmbfl/filters/mbfilter_singlebyte.c
libmbfl/filters/mbfilter_sjis.c
libmbfl/filters/mbfilter_sjis_open.c
libmbfl/filters/mbfilter_sjis_mobile.c
@@ -155,7 +132,6 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/filters/mbfilter_utf8.c
libmbfl/filters/mbfilter_utf8_mobile.c
libmbfl/filters/mbfilter_uuencode.c
- libmbfl/filters/mbfilter_koi8u.c
libmbfl/mbfl/mbfilter.c
libmbfl/mbfl/mbfilter_8bit.c
libmbfl/mbfl/mbfilter_pass.c
@@ -163,7 +139,6 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/mbfl/mbfl_convert.c
libmbfl/mbfl/mbfl_encoding.c
libmbfl/mbfl/mbfl_filter_output.c
- libmbfl/mbfl/mbfl_ident.c
libmbfl/mbfl/mbfl_language.c
libmbfl/mbfl/mbfl_memory_device.c
libmbfl/mbfl/mbfl_string.c
@@ -179,7 +154,7 @@ AC_DEFUN([PHP_MBSTRING_SETUP_LIBMBFL], [
libmbfl/nls/nls_tr.c
libmbfl/nls/nls_ua.c
])
- PHP_MBSTRING_ADD_INSTALL_HEADERS([libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_ident.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h])
+ PHP_MBSTRING_ADD_INSTALL_HEADERS([libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h])
])
dnl
diff --git a/ext/mbstring/config.w32 b/ext/mbstring/config.w32
index 667fdb9222..8a9eadf41b 100644
--- a/ext/mbstring/config.w32
+++ b/ext/mbstring/config.w32
@@ -17,37 +17,30 @@ if (PHP_MBSTRING != "no") {
"ext\\mbstring\\libmbfl\\config.h", true);
ADD_SOURCES("ext/mbstring/libmbfl/filters", "html_entities.c \
- mbfilter_7bit.c mbfilter_ascii.c mbfilter_base64.c mbfilter_big5.c \
- mbfilter_byte2.c mbfilter_byte4.c mbfilter_cp1251.c mbfilter_cp1252.c \
- mbfilter_cp866.c mbfilter_cp932.c mbfilter_cp936.c mbfilter_cp51932.c \
- mbfilter_euc_cn.c mbfilter_euc_jp.c mbfilter_euc_jp_win.c mbfilter_euc_kr.c \
+ mbfilter_7bit.c mbfilter_base64.c mbfilter_big5.c mbfilter_cp932.c \
+ mbfilter_cp936.c mbfilter_cp51932.c mbfilter_euc_cn.c \
+ mbfilter_euc_jp.c mbfilter_euc_jp_win.c mbfilter_euc_kr.c \
mbfilter_euc_tw.c mbfilter_htmlent.c mbfilter_hz.c mbfilter_iso2022_kr.c \
- mbfilter_iso8859_1.c mbfilter_iso8859_10.c mbfilter_iso8859_13.c \
- mbfilter_iso8859_14.c mbfilter_iso8859_15.c mbfilter_iso8859_16.c \
- mbfilter_iso8859_2.c mbfilter_iso8859_3.c mbfilter_iso8859_4.c \
- mbfilter_iso8859_5.c mbfilter_iso8859_6.c mbfilter_iso8859_7.c \
- mbfilter_iso8859_8.c mbfilter_iso8859_9.c mbfilter_jis.c \
- mbfilter_iso2022_jp_ms.c mbfilter_gb18030.c mbfilter_sjis_2004.c \
- mbfilter_koi8r.c mbfilter_qprint.c mbfilter_sjis.c mbfilter_ucs2.c \
+ mbfilter_jis.c mbfilter_iso2022_jp_ms.c mbfilter_gb18030.c \
+ mbfilter_sjis_2004.c mbfilter_qprint.c mbfilter_sjis.c mbfilter_ucs2.c \
mbfilter_ucs4.c mbfilter_uhc.c mbfilter_utf16.c mbfilter_utf32.c \
- mbfilter_utf7.c mbfilter_utf7imap.c mbfilter_utf8.c mbfilter_utf8_mobile.c \
- mbfilter_koi8u.c mbfilter_cp1254.c mbfilter_euc_jp_2004.c \
- mbfilter_uuencode.c mbfilter_armscii8.c mbfilter_cp850.c \
+ mbfilter_utf7.c mbfilter_utf7imap.c mbfilter_utf8.c \
+ mbfilter_utf8_mobile.c mbfilter_euc_jp_2004.c mbfilter_uuencode.c \
mbfilter_cp5022x.c mbfilter_sjis_open.c mbfilter_sjis_mobile.c \
- mbfilter_sjis_mac.c \
- mbfilter_iso2022jp_2004.c mbfilter_iso2022jp_mobile.c \
+ mbfilter_sjis_mac.c mbfilter_iso2022jp_2004.c \
+ mbfilter_iso2022jp_mobile.c mbfilter_singlebyte.c \
mbfilter_tl_jisx0201_jisx0208.c", "mbstring");
ADD_SOURCES("ext/mbstring/libmbfl/mbfl", "mbfilter.c mbfilter_8bit.c \
mbfilter_pass.c mbfilter_wchar.c mbfl_convert.c mbfl_encoding.c \
- mbfl_filter_output.c mbfl_ident.c mbfl_language.c mbfl_memory_device.c \
+ mbfl_filter_output.c mbfl_language.c mbfl_memory_device.c \
mbfl_string.c", "mbstring");
ADD_SOURCES("ext/mbstring/libmbfl/nls", "nls_de.c nls_en.c nls_ja.c \
nls_kr.c nls_neutral.c nls_ru.c nls_uni.c nls_zh.c nls_hy.c \
nls_ua.c nls_tr.c", "mbstring");
- PHP_INSTALL_HEADERS("ext/mbstring", "mbstring.h libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_ident.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h");
+ PHP_INSTALL_HEADERS("ext/mbstring", "mbstring.h libmbfl/config.h libmbfl/mbfl/eaw_table.h libmbfl/mbfl/mbfilter.h libmbfl/mbfl/mbfilter_8bit.h libmbfl/mbfl/mbfilter_pass.h libmbfl/mbfl/mbfilter_wchar.h libmbfl/mbfl/mbfl_consts.h libmbfl/mbfl/mbfl_convert.h libmbfl/mbfl/mbfl_defs.h libmbfl/mbfl/mbfl_encoding.h libmbfl/mbfl/mbfl_filter_output.h libmbfl/mbfl/mbfl_language.h libmbfl/mbfl/mbfl_memory_device.h libmbfl/mbfl/mbfl_string.h");
AC_DEFINE('HAVE_MBSTRING', 1, 'Have mbstring support');
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c
index 42ed23326d..bdf0cc78d9 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c
@@ -75,6 +75,8 @@ int mbfl_filt_conv_any_7bit(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < 0x80) {
CK((*filter->output_function)(c, filter->data));
+ } else {
+ mbfl_filt_conv_illegal_output(c, filter);
}
return c;
}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c b/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c
deleted file mode 100644
index 38c8f98bd1..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file: Hayk Chamyan <hamshen@gmail.com>
- *
- */
-
-/*
- * "armenian code filter and converter"
- */
-
-#include "mbfilter.h"
-#include "mbfilter_armscii8.h"
-#include "unicode_table_armscii8.h"
-
-static int mbfl_filt_ident_armscii8(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_armscii8_aliases[] = {"ArmSCII-8", "ArmSCII8", "ARMSCII-8", "ARMSCII8", NULL};
-
-const mbfl_encoding mbfl_encoding_armscii8 = {
- mbfl_no_encoding_armscii8,
- "ArmSCII-8",
- "ArmSCII-8",
- (const char *(*)[])&mbfl_encoding_armscii8_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_armscii8_wchar,
- &vtbl_wchar_armscii8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_armscii8 = {
- mbfl_no_encoding_armscii8,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_armscii8
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_armscii8 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_armscii8,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_armscii8,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_armscii8_wchar = {
- mbfl_no_encoding_armscii8,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_armscii8_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * armscii8 => wchar
- */
-int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < armscii8_ucs_table_min) {
- s = c;
- } else if (c >= armscii8_ucs_table_min && c < 0x100) {
- s = armscii8_ucs_table[c - armscii8_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_ARMSCII8;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => armscii8
- */
-int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter)
-{
-
- int s, n;
-
- if (c >= 0x28 && c < 0x30) {
- s = ucs_armscii8_table[c-0x28];
- } else if (c < armscii8_ucs_table_min) {
- s = c;
- } else {
- s = -1;
- n = armscii8_ucs_table_len-1;
- while (n >= 0) {
- if (c == armscii8_ucs_table[n]) {
- s = armscii8_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_ARMSCII8) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_armscii8(int c, mbfl_identify_filter *filter)
-{
- if (c >= armscii8_ucs_table_min && c <= 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.h b/ext/mbstring/libmbfl/filters/mbfilter_armscii8.h
deleted file mode 100644
index 0b14934995..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_armscii8.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file: Hayk Chamyan <hamshen@gmail.com>
- *
- */
-
-#ifndef MBFL_MBFILTER_ARMSCII8_H
-#define MBFL_MBFILTER_ARMSCII8_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_armscii8;
-extern const struct mbfl_identify_vtbl vtbl_identify_armscii8;
-extern const struct mbfl_convert_vtbl vtbl_wchar_armscii8;
-extern const struct mbfl_convert_vtbl vtbl_armscii8_wchar;
-
-int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ARMSCII8_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ascii.c b/ext/mbstring/libmbfl/filters/mbfilter_ascii.c
deleted file mode 100644
index 43d659a46c..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_ascii.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_ascii.h"
-
-static int mbfl_filt_ident_ascii(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_ascii_aliases[] = {"ANSI_X3.4-1968", "iso-ir-6", "ANSI_X3.4-1986", "ISO_646.irv:1991", "US-ASCII", "ISO646-US", "us", "IBM367", "IBM-367", "cp367", "csASCII", NULL};
-
-const mbfl_encoding mbfl_encoding_ascii = {
- mbfl_no_encoding_ascii,
- "ASCII",
- "US-ASCII", /* preferred MIME name */
- (const char *(*)[])&mbfl_encoding_ascii_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_ascii_wchar,
- &vtbl_wchar_ascii
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_ascii = {
- mbfl_no_encoding_ascii,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_ascii
-};
-
-const struct mbfl_convert_vtbl vtbl_ascii_wchar = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_ascii_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_ascii = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_ascii,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_ascii,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ASCII => wchar
- */
-int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter)
-{
- return (*filter->output_function)(c, filter->data);
-}
-
-
-/*
- * wchar => ASCII
- */
-int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter)
-{
- if (c >= 0 && c < 0x80) {
- CK((*filter->output_function)(c, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_ascii(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x20 && c < 0x80) {
- ;
- } else if (c == 0x0d || c == 0x0a || c == 0x09 || c == 0) { /* CR or LF or HTAB or null */
- ;
- } else {
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ascii.h b/ext/mbstring/libmbfl/filters/mbfilter_ascii.h
deleted file mode 100644
index 3c8aead9ef..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_ascii.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#ifndef MBFL_MBFILTER_ASCII_H
-#define MBFL_MBFILTER_ASCII_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_ascii;
-extern const struct mbfl_identify_vtbl vtbl_identify_ascii;
-extern const struct mbfl_convert_vtbl vtbl_ascii_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_ascii;
-
-int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ASCII_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c
index 1e59924092..110150134c 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c
@@ -32,8 +32,6 @@
#include "unicode_table_big5.h"
-static int mbfl_filt_ident_big5(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_big5[] = { /* 0x81-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,7 +57,7 @@ const mbfl_encoding mbfl_encoding_big5 = {
mbfl_no_encoding_big5,
"BIG-5",
"BIG5",
- (const char *(*)[])&mbfl_encoding_big5_aliases,
+ mbfl_encoding_big5_aliases,
mblen_table_big5,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_big5_wchar,
@@ -77,18 +75,6 @@ const mbfl_encoding mbfl_encoding_cp950 = {
&vtbl_wchar_cp950
};
-const struct mbfl_identify_vtbl vtbl_identify_big5 = {
- mbfl_no_encoding_big5,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_big5
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp950 = {
- mbfl_no_encoding_cp950,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_big5
-};
-
const struct mbfl_convert_vtbl vtbl_big5_wchar = {
mbfl_no_encoding_big5,
mbfl_no_encoding_wchar,
@@ -322,28 +308,3 @@ mbfl_filt_conv_wchar_big5(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_big5(int c, mbfl_identify_filter *filter)
-{
- int c1;
- if (filter->encoding->no_encoding == mbfl_no_encoding_cp950) {
- c1 = 0x80;
- } else {
- c1 = 0xa0;
- }
-
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || (c > 0x7e && c < 0xa1) ||c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > c1 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.h b/ext/mbstring/libmbfl/filters/mbfilter_big5.h
index c5a0955f8d..e475b6bd0c 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_big5.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.h
@@ -33,12 +33,10 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_big5;
-extern const struct mbfl_identify_vtbl vtbl_identify_big5;
extern const struct mbfl_convert_vtbl vtbl_big5_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_big5;
extern const mbfl_encoding mbfl_encoding_cp950;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp950;
extern const struct mbfl_convert_vtbl vtbl_cp950_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp950;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte2.c b/ext/mbstring/libmbfl/filters/mbfilter_byte2.c
deleted file mode 100644
index 72b5b2b7b2..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte2.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_byte2.h"
-
-const mbfl_encoding mbfl_encoding_byte2be = {
- mbfl_no_encoding_byte2be,
- "byte2be",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte2be_wchar,
- &vtbl_wchar_byte2be
-};
-
-const mbfl_encoding mbfl_encoding_byte2le = {
- mbfl_no_encoding_byte2le,
- "byte2le",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte2le_wchar,
- &vtbl_wchar_byte2le
-};
-
-const struct mbfl_convert_vtbl vtbl_byte2be_wchar = {
- mbfl_no_encoding_byte2be,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte2be_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte2be = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte2be,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte2be,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_byte2le_wchar = {
- mbfl_no_encoding_byte2le,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte2le_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte2le = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte2le,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte2le,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-int mbfl_filt_conv_byte2be_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff) << 8;
- filter->cache = n;
- } else {
- filter->status = 0;
- n = (c & 0xff) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte2be(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
- return c;
-}
-
-int mbfl_filt_conv_byte2le_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = c & 0xff;
- filter->cache = n;
- } else {
- filter->status = 0;
- n = ((c & 0xff) << 8) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte2le(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)(c & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte2.h b/ext/mbstring/libmbfl/filters/mbfilter_byte2.h
deleted file mode 100644
index 8b1d991810..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte2.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#ifndef MBFL_MBFILTER_BYTE2_H
-#define MBFL_MBFILTER_BYTE2_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_byte2be;
-extern const mbfl_encoding mbfl_encoding_byte2le;
-extern const struct mbfl_convert_vtbl vtbl_byte2be_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte2be;
-extern const struct mbfl_convert_vtbl vtbl_byte2le_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte2le;
-
-int mbfl_filt_conv_wchar_byte2be(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte2be_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_byte2le(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte2le_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_BYTE2_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte4.c b/ext/mbstring/libmbfl/filters/mbfilter_byte4.c
deleted file mode 100644
index b566e54772..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte4.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_byte4.h"
-
-const mbfl_encoding mbfl_encoding_byte4be = {
- mbfl_no_encoding_byte4be,
- "byte4be",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte4be_wchar,
- &vtbl_wchar_byte4be
-};
-
-const mbfl_encoding mbfl_encoding_byte4le = {
- mbfl_no_encoding_byte4le,
- "byte4le",
- NULL,
- NULL,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_byte4le_wchar,
- &vtbl_wchar_byte4le
-};
-
-const struct mbfl_convert_vtbl vtbl_byte4be_wchar = {
- mbfl_no_encoding_byte4be,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte4be_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte4be = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte4be,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte4be,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_byte4le_wchar = {
- mbfl_no_encoding_byte4le,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_byte4le_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_byte4le = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte4le,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_byte4le,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-int mbfl_filt_conv_byte4be_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff) << 24;
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 16;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 8;
- filter->cache |= n;
- } else {
- filter->status = 0;
- n = (c & 0xff) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte4be(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)((c >> 24) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 16) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
- return c;
-}
-
-int mbfl_filt_conv_byte4le_wchar(int c, mbfl_convert_filter *filter)
-{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff);
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 8;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 16;
- filter->cache |= n;
- } else {
- filter->status = 0;
- n = ((c & 0xff) << 24) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
- }
- return c;
-}
-
-int mbfl_filt_conv_wchar_byte4le(int c, mbfl_convert_filter *filter)
-{
- CK((*filter->output_function)(c & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 16) & 0xff, filter->data));
- CK((*filter->output_function)((c >> 24) & 0xff, filter->data));
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_byte4.h b/ext/mbstring/libmbfl/filters/mbfilter_byte4.h
deleted file mode 100644
index 572a2cf477..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_byte4.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#ifndef MBFL_MBFILTER_BYTE4_H
-#define MBFL_MBFILTER_BYTE4_H
-
-extern const mbfl_encoding mbfl_encoding_byte4be;
-extern const mbfl_encoding mbfl_encoding_byte4le;
-extern const struct mbfl_convert_vtbl vtbl_byte4be_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte4be;
-extern const struct mbfl_convert_vtbl vtbl_byte4le_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_byte4le;
-
-int mbfl_filt_conv_wchar_byte4be(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte4be_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_byte4le(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_byte4le_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_BYTE4_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c
deleted file mode 100644
index 470adf1a08..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp1251.h"
-#include "unicode_table_cp1251.h"
-
-static int mbfl_filt_ident_cp1251(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp1251_aliases[] = {"CP1251", "CP-1251", "WINDOWS-1251", NULL};
-
-const mbfl_encoding mbfl_encoding_cp1251 = {
- mbfl_no_encoding_cp1251,
- "Windows-1251",
- "Windows-1251",
- (const char *(*)[])&mbfl_encoding_cp1251_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp1251_wchar,
- &vtbl_wchar_cp1251
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp1251 = {
- mbfl_no_encoding_cp1251,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp1251
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp1251 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp1251,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp1251,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_cp1251_wchar = {
- mbfl_no_encoding_cp1251,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp1251_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * cp1251 => wchar
- */
-int
-mbfl_filt_conv_cp1251_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp1251_ucs_table_min) {
- s = c;
- } else if (c >= cp1251_ucs_table_min && c < 0x100) {
- s = cp1251_ucs_table[c - cp1251_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP1251;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => cp1251
- */
-int
-mbfl_filt_conv_wchar_cp1251(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp1251_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp1251_ucs_table[n]) {
- s = cp1251_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP1251) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-/* all of this is so ugly now! */
-static int mbfl_filt_ident_cp1251(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c <= 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.h b/ext/mbstring/libmbfl/filters/mbfilter_cp1251.h
deleted file mode 100644
index b76cc9f680..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1251.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter_ru.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP1251_H
-#define MBFL_MBFILTER_CP1251_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_cp1251;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp1251;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp1251;
-extern const struct mbfl_convert_vtbl vtbl_cp1251_wchar;
-
-int mbfl_filt_conv_wchar_cp1251(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_cp1251_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP1251_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c
deleted file mode 100644
index a274e4b796..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Wez Furlong <wez@thebrainroom.com>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp1252.h"
-#include "unicode_table_cp1252.h"
-
-static int mbfl_filt_ident_cp1252(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp1252_aliases[] = {"cp1252", NULL};
-
-const mbfl_encoding mbfl_encoding_cp1252 = {
- mbfl_no_encoding_cp1252,
- "Windows-1252",
- "Windows-1252",
- (const char *(*)[])&mbfl_encoding_cp1252_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp1252_wchar,
- &vtbl_wchar_cp1252
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp1252 = {
- mbfl_no_encoding_cp1252,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp1252
-};
-
-const struct mbfl_convert_vtbl vtbl_cp1252_wchar = {
- mbfl_no_encoding_cp1252,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp1252_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp1252 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp1252,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp1252,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * wchar => cp1252
- */
-int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter)
-{
- int s=-1, n;
-
- if (c >= 0x100) {
- /* look it up from the cp1252 table */
- s = -1;
- n = 31;
- while (n >= 0) {
- if (c == cp1252_ucs_table[n] && c != 0xfffe) {
- s = 0x80 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_1)
- {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
- else if (c >= 0 && c < 0x100) {
- s = c;
- }
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
- return c;
-}
-
-/*
- * cp1252 => wchar
- */
-int mbfl_filt_conv_cp1252_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0x80 && c < 0xa0) {
- s = cp1252_ucs_table[c - 0x80];
- } else {
- s = c;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/* We only distinguish the MS extensions to ISO-8859-1.
- * Actually, this is pretty much a NO-OP, since the identification
- * system doesn't allow us to discriminate between a positive match,
- * a possible match and a definite non-match.
- * The problem here is that cp1252 looks like SJIS for certain chars.
- * */
-static int mbfl_filt_ident_cp1252(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xa0)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.h b/ext/mbstring/libmbfl/filters/mbfilter_cp1252.h
deleted file mode 100644
index afb2fffa9b..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1252.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Wez Furlong <wez@thebrainroom.com>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP1252_H
-#define MBFL_MBFILTER_CP1252_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_cp1252;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp1252;
-extern const struct mbfl_convert_vtbl vtbl_cp1252_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp1252;
-
-int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_cp1252_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP1252_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c b/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c
deleted file mode 100644
index 7e4bb4b148..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Haluk AKIN <halukakin@gmail.com>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp1254.h"
-#include "unicode_table_cp1254.h"
-
-static int mbfl_filt_ident_cp1254(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp1254_aliases[] = {"CP1254", "CP-1254", "WINDOWS-1254", NULL};
-
-const mbfl_encoding mbfl_encoding_cp1254 = {
- mbfl_no_encoding_cp1254,
- "Windows-1254",
- "Windows-1254",
- (const char *(*)[])&mbfl_encoding_cp1254_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp1254_wchar,
- &vtbl_wchar_cp1254
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp1254 = {
- mbfl_no_encoding_cp1254,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp1254
-};
-
-const struct mbfl_convert_vtbl vtbl_cp1254_wchar = {
- mbfl_no_encoding_cp1254,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp1254_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp1254 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp1254,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp1254,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * wchar => cp1254
- */
-int
-mbfl_filt_conv_wchar_cp1254(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp1254_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp1254_ucs_table[n] && c != 0xfffe) {
- s = cp1254_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP1254) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-/*
- * cp1254 => wchar
- */
-int
-mbfl_filt_conv_cp1254_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp1254_ucs_table_min) {
- s = c;
- } else if (c >= cp1254_ucs_table_min && c < 0x100) {
- s = cp1254_ucs_table[c - cp1254_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP1254;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/* We only distinguish the MS extensions to ISO-8859-1.
- * Actually, this is pretty much a NO-OP, since the identification
- * system doesn't allow us to discriminate between a positive match,
- * a possible match and a definite non-match.
- * The problem here is that cp1254 looks like SJIS for certain chars.
- * */
-static int mbfl_filt_ident_cp1254(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.h b/ext/mbstring/libmbfl/filters/mbfilter_cp1254.h
deleted file mode 100644
index 15a63eae30..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp1254.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Haluk AKIN <halukakin@gmail.com>
- *
- */
-/*
- * the source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP1254_H
-#define MBFL_MBFILTER_CP1254_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_cp1254;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp1254;
-extern const struct mbfl_convert_vtbl vtbl_cp1254_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp1254;
-
-int mbfl_filt_conv_wchar_cp1254(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_cp1254_wchar(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP1254_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c
index 3879f9eb5b..a4d1724e8f 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c
@@ -36,10 +36,6 @@ typedef struct _mbfl_filt_conv_wchar_cp50220_ctx {
mbfl_convert_filter last;
} mbfl_filt_conv_wchar_cp50220_ctx;
-static int mbfl_filt_ident_jis_ms(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_cp50220(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_cp50221(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_cp50222(int c, mbfl_identify_filter *filter);
static void mbfl_filt_conv_wchar_cp50220_ctor(mbfl_convert_filter *filt);
static void mbfl_filt_conv_wchar_cp50220_dtor(mbfl_convert_filter *filt);
static void mbfl_filt_conv_wchar_cp50220_copy(mbfl_convert_filter *src, mbfl_convert_filter *dest);
@@ -59,7 +55,7 @@ const mbfl_encoding mbfl_encoding_cp50220 = {
mbfl_no_encoding_cp50220,
"CP50220",
"ISO-2022-JP",
- (const char *(*)[])NULL,
+ NULL,
NULL,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp50220_wchar,
@@ -70,7 +66,7 @@ const mbfl_encoding mbfl_encoding_cp50220raw = {
mbfl_no_encoding_cp50220raw,
"CP50220raw",
"ISO-2022-JP",
- (const char *(*)[])NULL,
+ NULL,
NULL,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp50220raw_wchar,
@@ -99,36 +95,6 @@ const mbfl_encoding mbfl_encoding_cp50222 = {
&vtbl_wchar_cp50222
};
-const struct mbfl_identify_vtbl vtbl_identify_jis_ms = {
- mbfl_no_encoding_jis_ms,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_jis_ms
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50220 = {
- mbfl_no_encoding_cp50220,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50220
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50220raw = {
- mbfl_no_encoding_cp50220raw,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50220
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50221 = {
- mbfl_no_encoding_cp50221,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50221
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp50222 = {
- mbfl_no_encoding_cp50222,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp50222
-};
-
const struct mbfl_convert_vtbl vtbl_jis_ms_wchar = {
mbfl_no_encoding_jis_ms,
mbfl_no_encoding_wchar,
@@ -585,7 +551,7 @@ mbfl_filt_conv_wchar_cp50220_ctor(mbfl_convert_filter *filt)
ctx->last.opaque = ctx;
ctx->last.data = filt->data;
filt->filter_function = vtbl_tl_jisx0201_jisx0208.filter_function;
- filt->filter_flush = vtbl_tl_jisx0201_jisx0208.filter_flush;
+ filt->filter_flush = (filter_flush_t)vtbl_tl_jisx0201_jisx0208.filter_flush;
filt->output_function = (output_function_t)ctx->last.filter_function;
filt->flush_function = (flush_function_t)ctx->last.filter_flush;
filt->data = &ctx->last;
@@ -948,332 +914,3 @@ mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter)
return 0;
}
-
-
-static int mbfl_filt_ident_jis_ms(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x20: X 0201 kana */
-/* case 0x80: X 0208 */
-/* case 0x90: X 0212 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 0x20;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
-/* case 0x91: X 0212 second char */
- case 1:
- filter->status &= ~0xf;
- if (c == 0x1b) {
- goto retry;
- } else if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x44) { /* 'D' */
- filter->status = 0x90;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp50220(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp50221(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp50222(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h
index e7cde7dff8..e97cd0fab8 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h
@@ -37,11 +37,7 @@ extern const mbfl_encoding mbfl_encoding_cp50220;
extern const mbfl_encoding mbfl_encoding_cp50220raw;
extern const mbfl_encoding mbfl_encoding_cp50221;
extern const mbfl_encoding mbfl_encoding_cp50222;
-extern const struct mbfl_identify_vtbl vtbl_identify_jis_ms;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50220;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50220raw;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50221;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp50222;
+
extern const struct mbfl_convert_vtbl vtbl_jis_ms_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_jis_ms;
extern const struct mbfl_convert_vtbl vtbl_cp50220_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c
index da046c86b7..cb95469408 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c
@@ -34,8 +34,6 @@
#include "unicode_table_jis.h"
#include "cp932_table.h"
-static int mbfl_filt_ident_cp51932(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -55,20 +53,13 @@ static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1
};
-
static const char *mbfl_encoding_cp51932_aliases[] = {"cp51932", NULL};
-const struct mbfl_identify_vtbl vtbl_identify_cp51932 = {
- mbfl_no_encoding_cp51932,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp51932
-};
-
const mbfl_encoding mbfl_encoding_cp51932 = {
mbfl_no_encoding_cp51932,
"CP51932",
"CP51932",
- (const char *(*)[])&mbfl_encoding_cp51932_aliases,
+ mbfl_encoding_cp51932_aliases,
mblen_table_eucjp,
MBFL_ENCTYPE_MBCS,
&vtbl_cp51932_wchar,
@@ -299,40 +290,3 @@ mbfl_filt_conv_wchar_cp51932(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_cp51932(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* kanji first char */
- filter->status = 1;
- } else if (c == 0x8e) { /* kana first char */
- filter->status = 2;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got first half */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got 0x8e */
- if (c < 0xa1 || c > 0xdf) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h
index bbf56f48ca..f48ec7cb3d 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_cp51932;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp51932;
extern const struct mbfl_convert_vtbl vtbl_cp51932_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp51932;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp850.c b/ext/mbstring/libmbfl/filters/mbfilter_cp850.c
deleted file mode 100644
index 5d6b265fc1..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp850.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- * Adaption for CP850: D. Giffeler <dg@artegic.de>
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp850.h"
-#include "unicode_table_cp850.h"
-
-static int mbfl_filt_ident_cp850(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp850_aliases[] = {"CP850", "CP-850", "IBM850", "IBM-850", NULL};
-
-const mbfl_encoding mbfl_encoding_cp850 = {
- mbfl_no_encoding_cp850,
- "CP850",
- "CP850",
- (const char *(*)[])&mbfl_encoding_cp850_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp850_wchar,
- &vtbl_wchar_cp850
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp850 = {
- mbfl_no_encoding_cp850,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp850
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp850 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp850,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp850,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_cp850_wchar = {
- mbfl_no_encoding_cp850,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp850_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * cp850 => wchar
- */
-int
-mbfl_filt_conv_cp850_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp850_ucs_table_min) {
- s = c;
- } else if (c >= cp850_ucs_table_min && c < 0x100) {
- s = cp850_ucs_table[c - cp850_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP850;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => cp850
- */
-int
-mbfl_filt_conv_wchar_cp850(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp850_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp850_ucs_table[n]) {
- s = cp850_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP850) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp850(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp850.h b/ext/mbstring/libmbfl/filters/mbfilter_cp850.h
deleted file mode 100644
index 2a0e8e9e65..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp850.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- * Adaption for CP850: D. Giffeler <dg@artegic.de>
- *
- */
-
-#ifndef MBFL_MBFILTER_CP850_H
-#define MBFL_MBFILTER_CP850_H
-
-extern const mbfl_encoding mbfl_encoding_cp850;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp850;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp850;
-extern const struct mbfl_convert_vtbl vtbl_cp850_wchar;
-
-int mbfl_filt_conv_cp850_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_cp850(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP850_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp866.c b/ext/mbstring/libmbfl/filters/mbfilter_cp866.c
deleted file mode 100644
index 504903bef0..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp866.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_cp866.h"
-#include "unicode_table_cp866.h"
-
-static int mbfl_filt_ident_cp866(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_cp866_aliases[] = {"CP866", "CP-866", "IBM866", "IBM-866", NULL};
-
-const mbfl_encoding mbfl_encoding_cp866 = {
- mbfl_no_encoding_cp866,
- "CP866",
- "CP866",
- (const char *(*)[])&mbfl_encoding_cp866_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_cp866_wchar,
- &vtbl_wchar_cp866
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_cp866 = {
- mbfl_no_encoding_cp866,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp866
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_cp866 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_cp866,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_cp866,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_cp866_wchar = {
- mbfl_no_encoding_cp866,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_cp866_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * cp866 => wchar
- */
-int
-mbfl_filt_conv_cp866_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < cp866_ucs_table_min) {
- s = c;
- } else if (c >= cp866_ucs_table_min && c < 0x100) {
- s = cp866_ucs_table[c - cp866_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_CP866;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => cp866
- */
-int
-mbfl_filt_conv_wchar_cp866(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = cp866_ucs_table_len-1;
- while (n >= 0) {
- if (c == cp866_ucs_table[n]) {
- s = cp866_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_CP866) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_cp866(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp866.h b/ext/mbstring/libmbfl/filters/mbfilter_cp866.h
deleted file mode 100644
index e9eb25a541..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp866.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_CP866_H
-#define MBFL_MBFILTER_CP866_H
-
-extern const mbfl_encoding mbfl_encoding_cp866;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp866;
-extern const struct mbfl_convert_vtbl vtbl_wchar_cp866;
-extern const struct mbfl_convert_vtbl vtbl_cp866_wchar;
-
-int mbfl_filt_conv_cp866_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_cp866(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_CP866_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
index 3cbca1cb64..351a94c81c 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c
@@ -33,8 +33,6 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-static int mbfl_filt_ident_cp932(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,19 +58,13 @@ const mbfl_encoding mbfl_encoding_cp932 = {
mbfl_no_encoding_cp932,
"CP932",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_cp932_aliases,
+ mbfl_encoding_cp932_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp932_wchar,
&vtbl_wchar_cp932
};
-const struct mbfl_identify_vtbl vtbl_identify_cp932 = {
- mbfl_no_encoding_cp932,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp932
-};
-
const struct mbfl_convert_vtbl vtbl_cp932_wchar = {
mbfl_no_encoding_cp932,
mbfl_no_encoding_wchar,
@@ -323,23 +315,3 @@ mbfl_filt_conv_wchar_cp932(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_cp932(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0xa0 && c < 0xe0) { /* kana ok */
- ;
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.h b/ext/mbstring/libmbfl/filters/mbfilter_cp932.h
index f0b6daeac7..031276ddf1 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_cp932;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp932;
extern const struct mbfl_convert_vtbl vtbl_cp932_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp932;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
index df6d77907f..4cfd1af877 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c
@@ -32,8 +32,6 @@
#define UNICODE_TABLE_CP936_DEF
#include "unicode_table_cp936.h"
-static int mbfl_filt_ident_cp936(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_cp936[] = { /* 0x81-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,19 +57,13 @@ const mbfl_encoding mbfl_encoding_cp936 = {
mbfl_no_encoding_cp936,
"CP936",
"CP936",
- (const char *(*)[])&mbfl_encoding_cp936_aliases,
+ mbfl_encoding_cp936_aliases,
mblen_table_cp936,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_cp936_wchar,
&vtbl_wchar_cp936
};
-const struct mbfl_identify_vtbl vtbl_identify_cp936 = {
- mbfl_no_encoding_cp936,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_cp936
-};
-
const struct mbfl_convert_vtbl vtbl_cp936_wchar = {
mbfl_no_encoding_cp936,
mbfl_no_encoding_wchar,
@@ -283,21 +275,3 @@ mbfl_filt_conv_wchar_cp936(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_cp936(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfe || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0x80 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.h b/ext/mbstring/libmbfl/filters/mbfilter_cp936.h
index cc5e9bd333..d10391f5d2 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_cp936;
-extern const struct mbfl_identify_vtbl vtbl_identify_cp936;
extern const struct mbfl_convert_vtbl vtbl_cp936_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_cp936;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c
index 53a8aac2a6..6ee0bf9bd0 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c
@@ -32,8 +32,6 @@
#include "unicode_table_cp936.h"
-static int mbfl_filt_ident_euccn(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_euccn[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,19 +57,13 @@ const mbfl_encoding mbfl_encoding_euc_cn = {
mbfl_no_encoding_euc_cn,
"EUC-CN",
"CN-GB",
- (const char *(*)[])&mbfl_encoding_euc_cn_aliases,
+ mbfl_encoding_euc_cn_aliases,
mblen_table_euccn,
MBFL_ENCTYPE_MBCS,
&vtbl_euccn_wchar,
&vtbl_wchar_euccn
};
-const struct mbfl_identify_vtbl vtbl_identify_euccn = {
- mbfl_no_encoding_euc_cn,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_euccn
-};
-
const struct mbfl_convert_vtbl vtbl_euccn_wchar = {
mbfl_no_encoding_euc_cn,
mbfl_no_encoding_wchar,
@@ -209,31 +201,3 @@ mbfl_filt_conv_wchar_euccn(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_euccn(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h
index 31251fcf6d..7ef92d8b4b 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_cn;
-extern const struct mbfl_identify_vtbl vtbl_identify_euccn;
extern const struct mbfl_convert_vtbl vtbl_euccn_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_euccn;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c
index 252a10a58d..1589ae7966 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c
@@ -33,7 +33,7 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-int mbfl_filt_ident_eucjp(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_eucjp_wchar_flush(mbfl_convert_filter *filter);
const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,26 +60,20 @@ const mbfl_encoding mbfl_encoding_euc_jp = {
mbfl_no_encoding_euc_jp,
"EUC-JP",
"EUC-JP",
- (const char *(*)[])&mbfl_encoding_euc_jp_aliases,
+ mbfl_encoding_euc_jp_aliases,
mblen_table_eucjp,
MBFL_ENCTYPE_MBCS,
&vtbl_eucjp_wchar,
&vtbl_wchar_eucjp
};
-const struct mbfl_identify_vtbl vtbl_identify_eucjp = {
- mbfl_no_encoding_euc_jp,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_eucjp
-};
-
const struct mbfl_convert_vtbl vtbl_eucjp_wchar = {
mbfl_no_encoding_euc_jp,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_eucjp_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_eucjp_wchar_flush,
NULL,
};
@@ -101,7 +95,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_eucjp = {
int
mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
{
- int c1, s, w;
+ int c1, s, w = 0;
switch (filter->status) {
case 0:
@@ -115,9 +109,7 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
} else if (c == 0x8f) { /* X 0212 first char */
filter->status = 3;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
}
break;
@@ -128,21 +120,13 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
s = (c1 - 0xa1)*94 + c - 0xa1;
if (s >= 0 && s < jisx0208_ucs_table_size) {
w = jisx0208_ucs_table[s];
- } else {
- w = 0;
}
if (w <= 0) {
- w = ((c1 & 0x7f) << 8) | (c & 0x7f);
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_JIS0208;
+ w = ((c1 & 0x7f) << 8) | (c & 0x7f) | MBFL_WCSPLANE_JIS0208;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -152,47 +136,31 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
if (c > 0xa0 && c < 0xe0) {
w = 0xfec0 + c;
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = 0x8e00 | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = 0x8e00 | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
- case 3: /* got 0x8f, X 0212 first char */
- if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
- filter->status = 0;
- } else {
- filter->status++;
- filter->cache = c;
- }
+ case 3: /* got 0x8f, JIS X 0212 first byte */
+ filter->status++;
+ filter->cache = c;
break;
- case 4: /* got 0x8f, X 0212 second char */
+
+ case 4: /* got 0x8f, JIS X 0212 second byte */
filter->status = 0;
c1 = filter->cache;
- if (c1 > 0xa0 && c1 < 0xff && c > 0xa0 && c < 0xff) {
+ if (c > 0xA0 && c < 0xFF && c1 > 0xA0 && c1 < 0xFF) {
s = (c1 - 0xa1)*94 + c - 0xa1;
if (s >= 0 && s < jisx0212_ucs_table_size) {
w = jisx0212_ucs_table[s];
- } else {
- w = 0;
}
if (w <= 0) {
- w = ((c1 & 0x7f) << 8) | (c & 0x7f);
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_JIS0212;
+ w = ((c1 & 0x7f) << 8) | (c & 0x7f) | MBFL_WCSPLANE_JIS0212;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c | 0x8f0000;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | 0x8f0000 | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
break;
@@ -205,13 +173,26 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter)
return c;
}
+static int mbfl_filt_conv_eucjp_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ (*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data);
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
+
/*
* wchar => EUC-JP
*/
int
mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
{
- int c1, s;
+ int s;
s = 0;
if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
@@ -224,13 +205,7 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
s = ucs_r_jis_table[c - ucs_r_jis_table_min];
}
if (s <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_JIS0208) {
- s = c & MBFL_WCSPLANE_MASK;
- } else if (c1 == MBFL_WCSPLANE_JIS0212) {
- s = c & MBFL_WCSPLANE_MASK;
- s |= 0x8080;
- } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
+ if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s = 0x2140;
} else if (c == 0xff5e) { /* FULLWIDTH TILDE */
s = 0x2141;
@@ -244,10 +219,9 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
s = 0x2172;
} else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
s = 0x224c;
- }
- if (c == 0) {
+ } else if (c == 0) {
s = 0;
- } else if (s <= 0) {
+ } else {
s = -1;
}
}
@@ -271,55 +245,3 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter)
return c;
}
-
-int mbfl_filt_ident_eucjp(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* kanji first char */
- filter->status = 1;
- } else if (c == 0x8e) { /* kana first char */
- filter->status = 2;
- } else if (c == 0x8f) { /* X 0212 first char */
- filter->status = 3;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got first half */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got 0x8e */
- if (c < 0xa1 || c > 0xdf) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 3: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status++;
- break;
- case 4: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h
index e1bd565343..cc7aa3a6bf 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_jp;
-extern const struct mbfl_identify_vtbl vtbl_identify_eucjp;
extern const struct mbfl_convert_vtbl vtbl_eucjp_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_eucjp;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c
index 30d869cea5..a14d37ec93 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c
@@ -31,7 +31,6 @@
#include "mbfilter_euc_jp_2004.h"
#include "mbfilter_sjis_2004.h"
-extern int mbfl_filt_ident_eucjp(int c, mbfl_identify_filter *filter);
extern const unsigned char mblen_table_eucjp[];
static const char *mbfl_encoding_eucjp2004_aliases[] = {"EUC_JP-2004", NULL};
@@ -40,19 +39,13 @@ const mbfl_encoding mbfl_encoding_eucjp2004 = {
mbfl_no_encoding_eucjp2004,
"EUC-JP-2004",
"EUC-JP",
- (const char *(*)[])&mbfl_encoding_eucjp2004_aliases,
+ mbfl_encoding_eucjp2004_aliases,
mblen_table_eucjp,
MBFL_ENCTYPE_MBCS,
&vtbl_eucjp2004_wchar,
&vtbl_wchar_eucjp2004
};
-const struct mbfl_identify_vtbl vtbl_identify_eucjp2004 = {
- mbfl_no_encoding_eucjp2004,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_eucjp
-};
-
const struct mbfl_convert_vtbl vtbl_eucjp2004_wchar = {
mbfl_no_encoding_eucjp2004,
mbfl_no_encoding_wchar,
@@ -69,6 +62,6 @@ const struct mbfl_convert_vtbl vtbl_wchar_eucjp2004 = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_jis2004,
- mbfl_filt_conv_jis2004_flush,
+ mbfl_filt_conv_wchar_jis2004_flush,
NULL,
};
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h
index 55c06aef98..affdd447f5 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_eucjp2004;
-extern const struct mbfl_identify_vtbl vtbl_identify_eucjp2004;
extern const struct mbfl_convert_vtbl vtbl_eucjp2004_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_eucjp2004;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c
index 5798bff0fc..b93fc9101a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c
@@ -34,8 +34,6 @@
#include "unicode_table_jis.h"
#include "cp932_table.h"
-static int mbfl_filt_ident_eucjp_win(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -55,21 +53,13 @@ static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1
};
-
-static const char *mbfl_encoding_eucjp_win_aliases[] = {"eucJP-open",
- "eucJP-ms", NULL};
-
-const struct mbfl_identify_vtbl vtbl_identify_eucjpwin = {
- mbfl_no_encoding_eucjp_win,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_eucjp_win
-};
+static const char *mbfl_encoding_eucjp_win_aliases[] = {"eucJP-open", "eucJP-ms", NULL};
const mbfl_encoding mbfl_encoding_eucjp_win = {
mbfl_no_encoding_eucjp_win,
"eucJP-win",
"EUC-JP",
- (const char *(*)[])&mbfl_encoding_eucjp_win_aliases,
+ mbfl_encoding_eucjp_win_aliases,
mblen_table_eucjp,
MBFL_ENCTYPE_MBCS,
&vtbl_eucjpwin_wchar,
@@ -319,8 +309,6 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter)
s1 = 0x2172;
} else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
s1 = 0x224c;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
- s1 = 0x2141;
} else {
s1 = -1;
c1 = 0;
@@ -375,55 +363,3 @@ mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_eucjp_win(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* kanji first char */
- filter->status = 1;
- } else if (c == 0x8e) { /* kana first char */
- filter->status = 2;
- } else if (c == 0x8f) { /* X 0212 first char */
- filter->status = 3;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got first half */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got 0x8e */
- if (c < 0xa1 || c > 0xdf) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 3: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status++;
- break;
- case 4: /* got 0x8f */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h
index f17058d523..bb1e4dc392 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_eucjp_win;
-extern const struct mbfl_identify_vtbl vtbl_identify_eucjpwin;
extern const struct mbfl_convert_vtbl vtbl_eucjpwin_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_eucjpwin;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c
index e9b08e08c1..3f423f5969 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c
@@ -31,8 +31,6 @@
#include "mbfilter_euc_kr.h"
#include "unicode_table_uhc.h"
-static int mbfl_filt_ident_euckr(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_euckr[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -58,19 +56,13 @@ const mbfl_encoding mbfl_encoding_euc_kr = {
mbfl_no_encoding_euc_kr,
"EUC-KR",
"EUC-KR",
- (const char *(*)[])&mbfl_encoding_euc_kr_aliases,
+ mbfl_encoding_euc_kr_aliases,
mblen_table_euckr,
MBFL_ENCTYPE_MBCS,
&vtbl_euckr_wchar,
&vtbl_wchar_euckr
};
-const struct mbfl_identify_vtbl vtbl_identify_euckr = {
- mbfl_no_encoding_euc_kr,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_euckr
-};
-
const struct mbfl_convert_vtbl vtbl_euckr_wchar = {
mbfl_no_encoding_euc_kr,
mbfl_no_encoding_wchar,
@@ -223,31 +215,3 @@ mbfl_filt_conv_wchar_euckr(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_euckr(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h
index 1534d2bedc..e0c13cf53a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_kr;
-extern const struct mbfl_identify_vtbl vtbl_identify_euckr;
extern const struct mbfl_convert_vtbl vtbl_euckr_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_euckr;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c
index c76eeb36bf..68dd539b72 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c
@@ -32,8 +32,6 @@
#include "unicode_table_cns11643.h"
-static int mbfl_filt_ident_euctw(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_euctw[] = { /* 0xA1-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,19 +58,13 @@ const mbfl_encoding mbfl_encoding_euc_tw = {
mbfl_no_encoding_euc_tw,
"EUC-TW",
"EUC-TW",
- (const char *(*)[])&mbfl_encoding_euc_tw_aliases,
+ mbfl_encoding_euc_tw_aliases,
mblen_table_euctw,
MBFL_ENCTYPE_MBCS,
&vtbl_euctw_wchar,
&vtbl_wchar_euctw
};
-const struct mbfl_identify_vtbl vtbl_identify_euctw = {
- mbfl_no_encoding_euc_tw,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_euctw
-};
-
const struct mbfl_convert_vtbl vtbl_euctw_wchar = {
mbfl_no_encoding_euc_tw,
mbfl_no_encoding_wchar,
@@ -271,55 +263,3 @@ mbfl_filt_conv_wchar_euctw(int c, mbfl_convert_filter *filter)
}
return c;
}
-
-static int mbfl_filt_ident_euctw(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c > 0xa0 && c < 0xff) { /* DBCS lead byte */
- filter->status = 1;
- } else if (c == 0x8e) { /* DBCS lead byte */
- filter->status = 2;
- } else { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 1: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 2: /* got lead byte */
- if (c >= 0xa1 && c < 0xaf) { /* ok */
- filter->status = 3;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
- case 3: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 4;
- break;
-
- case 4: /* got lead byte */
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h
index ed1f091259..9c2ffa4802 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_euc_tw;
-extern const struct mbfl_identify_vtbl vtbl_identify_euctw;
extern const struct mbfl_convert_vtbl vtbl_euctw_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_euctw;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c
index b94d664f40..dfab3d59df 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c
@@ -33,27 +33,19 @@
#include "unicode_table_cp936.h"
#include "unicode_table_gb18030.h"
-static int mbfl_filt_ident_gb18030(int c, mbfl_identify_filter *filter);
-
static const char *mbfl_encoding_gb18030_aliases[] = {"gb-18030", "gb-18030-2000", NULL};
const mbfl_encoding mbfl_encoding_gb18030 = {
mbfl_no_encoding_gb18030,
"GB18030",
"GB18030",
- (const char *(*)[])&mbfl_encoding_gb18030_aliases,
+ mbfl_encoding_gb18030_aliases,
NULL,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_gb18030_wchar,
&vtbl_wchar_gb18030
};
-const struct mbfl_identify_vtbl vtbl_identify_gb18030 = {
- mbfl_no_encoding_gb18030,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_gb18030
-};
-
const struct mbfl_convert_vtbl vtbl_gb18030_wchar = {
mbfl_no_encoding_gb18030,
mbfl_no_encoding_wchar,
@@ -76,42 +68,37 @@ const struct mbfl_convert_vtbl vtbl_wchar_gb18030 = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-int
-mbfl_bisec_srch(int w, const unsigned short *tbl, int n)
+/* `tbl` contains inclusive ranges, each represented by a pair of unsigned shorts */
+int mbfl_bisec_srch(int w, const unsigned short *tbl, int n)
{
- int k, k1 = 0, k2 = n-1;
-
- while (k1 < k2) {
- k = (k1+k2) >> 1;
- if (w <= tbl[2*k+1]) {
- k2 = k;
- } else if (w >= tbl[2*k+2]) {
- k1 = k + 1;
+ int l = 0, r = n-1;
+ while (l <= r) {
+ int probe = (l + r) >> 1;
+ unsigned short lo = tbl[2 * probe], hi = tbl[(2 * probe) + 1];
+ if (w < lo) {
+ r = probe - 1;
+ } else if (w > hi) {
+ l = probe + 1;
} else {
- return -1;
+ return probe;
}
}
- return k1;
+ return -1;
}
-int
-mbfl_bisec_srch2(int w, const unsigned short tbl[], int n)
+/* `tbl` contains single values, not ranges */
+int mbfl_bisec_srch2(int w, const unsigned short tbl[], int n)
{
- int k, k1 = 0, k2 = n;
-
- if (w == tbl[0]) {
- return 0;
- }
-
- while (k2 - k1 > 1) {
- k = (k1 + k2) >> 1;
- if (w < tbl[k]) {
- k2 = k;
- } else if (w > tbl[k]) {
- k1 = k;
+ int l = 0, r = n-1;
+ while (l <= r) {
+ int probe = (l + r) >> 1;
+ unsigned short val = tbl[probe];
+ if (w < val) {
+ r = probe - 1;
+ } else if (w > val) {
+ l = probe + 1;
} else {
- return k;
+ return probe;
}
}
return -1;
@@ -414,55 +401,3 @@ mbfl_filt_conv_wchar_gb18030(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_gb18030(int c, mbfl_identify_filter *filter)
-{
- int c1;
-
- c1 = (filter->status >> 8) & 0xff;
- filter->status &= 0xff;
-
- if (filter->status == 0) {
- if (c <= 0x80 || c == 0xff) {
- filter->status = 0;
- } else {
- filter->status = 1;
- filter->status |= (c << 8);
- }
- } else if (filter->status == 1) { /* dbcs/qbcs 2nd byte */
- if (((c1 >= 0x81 && c1 <= 0x84) || (c1 >= 0x90 && c1 <= 0xe3)) && c >= 0x30 && c <= 0x39) { /* qbcs */
- filter->status = 2;
- } else if (((c1 >= 0xaa && c1 <= 0xaf) || (c1 >= 0xf8 && c1 <= 0xfe)) && (c >= 0xa1 && c <= 0xfe)) {
- filter->status = 0; /* UDA part 1,2 */
- } else if (c1 >= 0xa1 && c1 <= 0xa7 && c >= 0x40 && c < 0xa1 && c != 0x7f) {
- filter->status = 0; /* UDA part 3 */
- } else if ((c1 >= 0xa1 && c1 <= 0xa9 && c >= 0xa1 && c <= 0xfe) ||
- (c1 >= 0xb0 && c1 <= 0xf7 && c >= 0xa1 && c <= 0xfe) ||
- (c1 >= 0x81 && c1 <= 0xa0 && c >= 0x40 && c <= 0xfe && c != 0x7f) ||
- (c1 >= 0xaa && c1 <= 0xfe && c >= 0x40 && c <= 0xa0 && c != 0x7f) ||
- (c1 >= 0xa8 && c1 <= 0xa9 && c >= 0x40 && c <= 0xa0 && c != 0x7f)) {
- filter->status = 0; /* DBCS */
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- } else if (filter->status == 2) { /* qbcs 3rd byte */
- if (c > 0x80 && c < 0xff) {
- filter->status = 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- } else if (filter->status == 3) { /* qbcs 4th byte */
- if (c >= 0x30 && c < 0x40) {
- filter->status = 0;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h
index dc7d51b6e2..e7f0eae16b 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_gb18030;
-extern const struct mbfl_identify_vtbl vtbl_identify_gb18030;
extern const struct mbfl_convert_vtbl vtbl_gb18030_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_gb18030;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
index 7176fd4717..95a0817103 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
@@ -57,7 +57,7 @@ const mbfl_encoding mbfl_encoding_html_ent = {
mbfl_no_encoding_html_ent,
"HTML-ENTITIES",
"HTML-ENTITIES",
- (const char *(*)[])&mbfl_encoding_html_ent_aliases,
+ mbfl_encoding_html_ent_aliases,
NULL,
MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_html_wchar,
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_hz.c b/ext/mbstring/libmbfl/filters/mbfilter_hz.c
index ceac85816c..bf3f8c4b77 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_hz.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_hz.c
@@ -32,8 +32,6 @@
#include "unicode_table_cp936.h"
-static int mbfl_filt_ident_hz(int c, mbfl_identify_filter *filter);
-
const mbfl_encoding mbfl_encoding_hz = {
mbfl_no_encoding_hz,
"HZ",
@@ -45,12 +43,6 @@ const mbfl_encoding mbfl_encoding_hz = {
&vtbl_wchar_hz
};
-const struct mbfl_identify_vtbl vtbl_identify_hz = {
- mbfl_no_encoding_hz,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_hz
-};
-
const struct mbfl_convert_vtbl vtbl_hz_wchar = {
mbfl_no_encoding_hz,
mbfl_no_encoding_wchar,
@@ -225,49 +217,3 @@ mbfl_filt_conv_any_hz_flush(mbfl_convert_filter *filter)
filter->status &= 0xff;
return 0;
}
-
-static int mbfl_filt_ident_hz(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: GB2312 */
- case 0:
- if (c == 0x7e) {
- filter->status += 2;
- } else if (filter->status == 0x10 && c > 0x20 && c < 0x7f) { /* DBCS first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x11: GB2312 second char */
- case 1:
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- case 2:
- if (c == 0x7d) { /* '}' */
- filter->status = 0;
- } else if (c == 0x7b) { /* '{' */
- filter->status = 0x10;
- } else if (c == 0x7e) { /* '~' */
- filter->status = 0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_hz.h b/ext/mbstring/libmbfl/filters/mbfilter_hz.h
index e7e35cacc8..6b1dfb1564 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_hz.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_hz.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_hz;
-extern const struct mbfl_identify_vtbl vtbl_identify_hz;
extern const struct mbfl_convert_vtbl vtbl_hz_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_hz;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c
index 1e9757eae6..950365045c 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c
@@ -34,27 +34,19 @@
#include "unicode_table_jis.h"
#include "cp932_table.h"
-int mbfl_filt_ident_2022jpms(int c, mbfl_identify_filter *filter);
-
static const char *mbfl_encoding_2022jpms_aliases[] = {"ISO2022JPMS", NULL};
const mbfl_encoding mbfl_encoding_2022jpms = {
mbfl_no_encoding_2022jpms,
"ISO-2022-JP-MS",
"ISO-2022-JP",
- (const char *(*)[])&mbfl_encoding_2022jpms_aliases,
+ mbfl_encoding_2022jpms_aliases,
NULL,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_2022jpms_wchar,
&vtbl_wchar_2022jpms
};
-const struct mbfl_identify_vtbl vtbl_identify_2022jpms = {
- mbfl_no_encoding_2022jpms,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jpms
-};
-
const struct mbfl_convert_vtbl vtbl_2022jpms_wchar = {
mbfl_no_encoding_2022jpms,
mbfl_no_encoding_wchar,
@@ -429,97 +421,3 @@ mbfl_filt_conv_any_2022jpms_flush(mbfl_convert_filter *filter)
return 0;
}
-
-int mbfl_filt_ident_2022jpms(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x20: X 0201 kana */
-/* case 0x80: X 0208 */
-/* case 0xa0: X UDC */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if ((filter->status == 0x80 || filter->status == 0xa0) && c > 0x20 && c < 0x80) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
-/* case 0xa1: UDC second char */
- case 1:
- filter->status &= ~0xf;
- if (c == 0x1b) {
- goto retry;
- } else if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x3f) { /* '?' */
- filter->status = 0xa0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h
index 7c40b19246..fdc85183d7 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022jpms;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jpms;
extern const struct mbfl_convert_vtbl vtbl_2022jpms_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022jpms;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c
index 8df1d6f9b5..feb29a0a2a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c
@@ -31,8 +31,6 @@
#include "mbfilter_iso2022_kr.h"
#include "unicode_table_uhc.h"
-static int mbfl_filt_ident_2022kr(int c, mbfl_identify_filter *filter);
-
const mbfl_encoding mbfl_encoding_2022kr = {
mbfl_no_encoding_2022kr,
"ISO-2022-KR",
@@ -44,12 +42,6 @@ const mbfl_encoding mbfl_encoding_2022kr = {
&vtbl_wchar_2022kr
};
-const struct mbfl_identify_vtbl vtbl_identify_2022kr = {
- mbfl_no_encoding_2022kr,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022kr
-};
-
const struct mbfl_convert_vtbl vtbl_wchar_2022kr = {
mbfl_no_encoding_wchar,
mbfl_no_encoding_2022kr,
@@ -282,73 +274,3 @@ mbfl_filt_conv_any_2022kr_flush(mbfl_convert_filter *filter)
return 0;
}
-
-static int mbfl_filt_ident_2022kr(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: KSC5601 mode */
-/* case 0x20: KSC5601 DBCS */
-/* case 0x40: KSC5601 SBCS */
- case 0:
- if (!(filter->status & 0x10)) {
- if (c == 0x1b)
- filter->status += 2;
- } else if (filter->status == 0x20 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x21: KSC5601 second char */
- case 1:
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x29) { /* ')' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $) */
- case 5:
- if (c == 0x43) { /* 'C' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h
index 7277c5f11c..a00da5bbac 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022kr;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022kr;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022kr;
extern const struct mbfl_convert_vtbl vtbl_2022kr_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c
index b381f09bea..a8f2a1da53 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c
@@ -34,7 +34,6 @@
#include "unicode_table_jis.h"
extern int mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter);
-static int mbfl_filt_ident_2022jp_2004(int c, mbfl_identify_filter *filter);
const mbfl_encoding mbfl_encoding_2022jp_2004 = {
mbfl_no_encoding_2022jp_2004,
@@ -47,12 +46,6 @@ const mbfl_encoding mbfl_encoding_2022jp_2004 = {
&vtbl_wchar_2022jp_2004
};
-const struct mbfl_identify_vtbl vtbl_identify_2022jp_2004 = {
- mbfl_no_encoding_2022jp_2004,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jp_2004
-};
-
const struct mbfl_convert_vtbl vtbl_2022jp_2004_wchar = {
mbfl_no_encoding_2022jp_2004,
mbfl_no_encoding_wchar,
@@ -69,96 +62,6 @@ const struct mbfl_convert_vtbl vtbl_wchar_2022jp_2004 = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_jis2004,
- mbfl_filt_conv_jis2004_flush,
+ mbfl_filt_conv_wchar_jis2004_flush,
NULL,
};
-
-static int mbfl_filt_ident_2022jp_2004(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x80: X 0212 */
-/* case 0x90: X 0213 plane 1 */
-/* case 0xa0: X 0213 plane 2 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x42) { /* 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x51) { /* JIS X 0213 plane 1 */
- filter->status = 0x90;
- } else if (c == 0x50) { /* JIS X 0213 plane 2 */
- filter->status = 0xa0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h
index 929559b87f..58b2dd31d8 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022jp_2004;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jp_2004;
extern const struct mbfl_convert_vtbl vtbl_2022jp_2004_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022jp_2004;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c
index 32ea47712e..e6300675e8 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c
@@ -36,7 +36,6 @@
#include "cp932_table.h"
extern int mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter);
-extern int mbfl_filt_ident_2022jpms(int c, mbfl_identify_filter *filter);
static const char *mbfl_encoding_2022jp_kddi_aliases[] = {"ISO-2022-JP-KDDI", NULL};
@@ -44,19 +43,13 @@ const mbfl_encoding mbfl_encoding_2022jp_kddi = {
mbfl_no_encoding_2022jp_kddi,
"ISO-2022-JP-MOBILE#KDDI",
"ISO-2022-JP",
- (const char *(*)[])&mbfl_encoding_2022jp_kddi_aliases,
+ mbfl_encoding_2022jp_kddi_aliases,
NULL,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_2022jp_kddi_wchar,
&vtbl_wchar_2022jp_kddi
};
-const struct mbfl_identify_vtbl vtbl_identify_2022jp_kddi = {
- mbfl_no_encoding_2022jp_kddi,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jpms
-};
-
const struct mbfl_convert_vtbl vtbl_2022jp_kddi_wchar = {
mbfl_no_encoding_2022jp_kddi,
mbfl_no_encoding_wchar,
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h
index a375e8df0e..a53ec2c36f 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_2022jp_kddi;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jp_kddi;
extern const struct mbfl_convert_vtbl vtbl_2022jp_kddi_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_2022jp_kddi;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c
deleted file mode 100644
index 1549ba81bf..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_1.h"
-
-static const char *mbfl_encoding_8859_1_aliases[] = {"ISO8859-1", "latin1", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_1 = {
- mbfl_no_encoding_8859_1,
- "ISO-8859-1",
- "ISO-8859-1",
- (const char *(*)[])&mbfl_encoding_8859_1_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_1_wchar,
- &vtbl_wchar_8859_1
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_1 = {
- mbfl_no_encoding_8859_1,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_1_wchar = {
- mbfl_no_encoding_8859_1,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_1_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_1 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_1,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_1,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-1 => wchar
- */
-int mbfl_filt_conv_8859_1_wchar(int c, mbfl_convert_filter *filter)
-{
- return (*filter->output_function)(c, filter->data);
-}
-
-/*
- * wchar => ISO-8859-1
- */
-int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter)
-{
- if (c >= 0 && c < 0x100) {
- CK((*filter->output_function)(c, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h
deleted file mode 100644
index b593f10f54..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_1.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_1_H
-#define MBFL_MBFILTER_ISO8859_1_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_1;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_1;
-extern const struct mbfl_convert_vtbl vtbl_8859_1_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_1;
-
-int mbfl_filt_conv_8859_1_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_1_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c
deleted file mode 100644
index 12cd960a88..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_10.h"
-#include "unicode_table_iso8859_10.h"
-
-static const char *mbfl_encoding_8859_10_aliases[] = {"ISO8859-10", "latin6", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_10 = {
- mbfl_no_encoding_8859_10,
- "ISO-8859-10",
- "ISO-8859-10",
- (const char *(*)[])&mbfl_encoding_8859_10_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_10_wchar,
- &vtbl_wchar_8859_10
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_10 = {
- mbfl_no_encoding_8859_10,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_10_wchar = {
- mbfl_no_encoding_8859_10,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_10_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_10 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_10,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_10,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-10 => wchar
- */
-int mbfl_filt_conv_8859_10_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_10_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_10;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-10
- */
-int mbfl_filt_conv_wchar_8859_10(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_10_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_10) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h
deleted file mode 100644
index f9133404de..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_10.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_10_H
-#define MBFL_MBFILTER_ISO8859_10_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_10;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_10;
-extern const struct mbfl_convert_vtbl vtbl_8859_10_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_10;
-
-int mbfl_filt_conv_8859_10_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_10(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_10_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c
deleted file mode 100644
index 25526263b8..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_13.h"
-#include "unicode_table_iso8859_13.h"
-
-static const char *mbfl_encoding_8859_13_aliases[] = {"ISO8859-13", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_13 = {
- mbfl_no_encoding_8859_13,
- "ISO-8859-13",
- "ISO-8859-13",
- (const char *(*)[])&mbfl_encoding_8859_13_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_13_wchar,
- &vtbl_wchar_8859_13
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_13 = {
- mbfl_no_encoding_8859_13,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_13_wchar = {
- mbfl_no_encoding_8859_13,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_13_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_13 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_13,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_13,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-13 => wchar
- */
-int mbfl_filt_conv_8859_13_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_13_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_13;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-13
- */
-int mbfl_filt_conv_wchar_8859_13(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_13_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_13) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h
deleted file mode 100644
index dcd6075594..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_13.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_13_H
-#define MBFL_MBFILTER_ISO8859_13_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_13;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_13;
-extern const struct mbfl_convert_vtbl vtbl_8859_13_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_13;
-
-int mbfl_filt_conv_8859_13_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_13(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_13_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c
deleted file mode 100644
index 06a2e4cd98..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_14.h"
-#include "unicode_table_iso8859_14.h"
-
-static const char *mbfl_encoding_8859_14_aliases[] = {"ISO8859-14", "latin8", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_14 = {
- mbfl_no_encoding_8859_14,
- "ISO-8859-14",
- "ISO-8859-14",
- (const char *(*)[])&mbfl_encoding_8859_14_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_14_wchar,
- &vtbl_wchar_8859_14
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_14 = {
- mbfl_no_encoding_8859_14,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_14_wchar = {
- mbfl_no_encoding_8859_14,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_14_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_14 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_14,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_14,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-14 => wchar
- */
-int mbfl_filt_conv_8859_14_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_14_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_14;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-14
- */
-int mbfl_filt_conv_wchar_8859_14(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_14_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_14) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h
deleted file mode 100644
index 90531e668a..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * COPYRIGHT NOTICE
- *
- * This file is a portion of "streamable kanji code filter and converter"
- * library, which is distributed under GNU Lesser General Public License
- * version 2.1.
- *
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_14_H
-#define MBFL_MBFILTER_ISO8859_14_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_14;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_14;
-extern const struct mbfl_convert_vtbl vtbl_8859_14_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_14;
-
-int mbfl_filt_conv_8859_14_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_14(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_14_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c
deleted file mode 100644
index 82b40796b8..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_15.h"
-#include "unicode_table_iso8859_15.h"
-
-static const char *mbfl_encoding_8859_15_aliases[] = {"ISO8859-15", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_15 = {
- mbfl_no_encoding_8859_15,
- "ISO-8859-15",
- "ISO-8859-15",
- (const char *(*)[])&mbfl_encoding_8859_15_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_15_wchar,
- &vtbl_wchar_8859_15
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_15 = {
- mbfl_no_encoding_8859_15,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_15_wchar = {
- mbfl_no_encoding_8859_15,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_15_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_15 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_15,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_15,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-15 => wchar
- */
-int mbfl_filt_conv_8859_15_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_15_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_15;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-15
- */
-int mbfl_filt_conv_wchar_8859_15(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_15_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_15) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h
deleted file mode 100644
index a8fb339b0d..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_15.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * COPYRIGHT NOTICE
- *
- * This file is a portion of "streamable kanji code filter and converter"
- * library, which is distributed under GNU Lesser General Public License
- * version 2.1.
- *
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 4 Dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_15_H
-#define MBFL_MBFILTER_ISO8859_15_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_15;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_15;
-extern const struct mbfl_convert_vtbl vtbl_8859_15_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_15;
-
-int mbfl_filt_conv_8859_15_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_15(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_15_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c
deleted file mode 100644
index 80f1461364..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_16.h"
-#include "unicode_table_iso8859_16.h"
-
-static const char *mbfl_encoding_8859_16_aliases[] = {"ISO8859-16", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_16 = {
- mbfl_no_encoding_8859_16,
- "ISO-8859-16",
- "ISO-8859-16",
- (const char *(*)[])&mbfl_encoding_8859_16_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_16_wchar,
- &vtbl_wchar_8859_16
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_16 = {
- mbfl_no_encoding_8859_16,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_16_wchar = {
- mbfl_no_encoding_8859_16,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_16_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_16 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_16,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_16,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-16 => wchar
- */
-int mbfl_filt_conv_8859_16_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_16_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_16;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-16
- */
-int mbfl_filt_conv_wchar_8859_16(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_16_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_16) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h
deleted file mode 100644
index a1a53d7909..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_16.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * COPYRIGHT NOTICE
- *
- * This file is a portion of "streamable kanji code filter and converter"
- * library, which is distributed under GNU Lesser General Public License
- * version 2.1.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_16_H
-#define MBFL_MBFILTER_ISO8859_16_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_16;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_16;
-extern const struct mbfl_convert_vtbl vtbl_8859_16_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_16;
-
-int mbfl_filt_conv_8859_16_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_16(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_16_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c
deleted file mode 100644
index 86044e15d3..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_2.h"
-#include "unicode_table_iso8859_2.h"
-
-static const char *mbfl_encoding_8859_2_aliases[] = {"ISO8859-2", "latin2", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_2 = {
- mbfl_no_encoding_8859_2,
- "ISO-8859-2",
- "ISO-8859-2",
- (const char *(*)[])&mbfl_encoding_8859_2_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_2_wchar,
- &vtbl_wchar_8859_2
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_2 = {
- mbfl_no_encoding_8859_2,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_2_wchar = {
- mbfl_no_encoding_8859_2,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_2_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_2 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_2,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_2,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-2 => wchar
- */
-int mbfl_filt_conv_8859_2_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_2_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_2;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-2
- */
-int mbfl_filt_conv_wchar_8859_2(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_2_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_2) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h
deleted file mode 100644
index f344168a18..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_2.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_2_H
-#define MBFL_MBFILTER_ISO8859_2_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_2;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_2;
-extern const struct mbfl_convert_vtbl vtbl_8859_2_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_2;
-
-int mbfl_filt_conv_8859_2_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_2(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_2_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c
deleted file mode 100644
index 64eb9b5cf9..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_3.h"
-#include "unicode_table_iso8859_3.h"
-
-static const char *mbfl_encoding_8859_3_aliases[] = {"ISO8859-3", "latin3", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_3 = {
- mbfl_no_encoding_8859_3,
- "ISO-8859-3",
- "ISO-8859-3",
- (const char *(*)[])&mbfl_encoding_8859_3_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_3_wchar,
- &vtbl_wchar_8859_3
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_3 = {
- mbfl_no_encoding_8859_3,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_3_wchar = {
- mbfl_no_encoding_8859_3,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_3_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_3 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_3,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_3,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-3 => wchar
- */
-int mbfl_filt_conv_8859_3_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_3_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_3;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-3
- */
-int mbfl_filt_conv_wchar_8859_3(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_3_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_3) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h
deleted file mode 100644
index 746085373a..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_3.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_3_H
-#define MBFL_MBFILTER_ISO8859_3_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_3;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_3;
-extern const struct mbfl_convert_vtbl vtbl_8859_3_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_3;
-
-int mbfl_filt_conv_8859_3_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_3(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_3_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c
deleted file mode 100644
index 12a9f7cb10..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_4.h"
-#include "unicode_table_iso8859_4.h"
-
-static const char *mbfl_encoding_8859_4_aliases[] = {"ISO8859-4", "latin4", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_4 = {
- mbfl_no_encoding_8859_4,
- "ISO-8859-4",
- "ISO-8859-4",
- (const char *(*)[])&mbfl_encoding_8859_4_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_4_wchar,
- &vtbl_wchar_8859_4
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_4 = {
- mbfl_no_encoding_8859_4,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_4_wchar = {
- mbfl_no_encoding_8859_4,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_4_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_4 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_4,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_4,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-4 => wchar
- */
-int mbfl_filt_conv_8859_4_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_4_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_4;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-4
- */
-int mbfl_filt_conv_wchar_8859_4(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_4_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_4) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h
deleted file mode 100644
index fe4dcdc696..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_4.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_4_H
-#define MBFL_MBFILTER_ISO8859_4_H
-
-extern const mbfl_encoding mbfl_encoding_8859_4;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_4;
-extern const struct mbfl_convert_vtbl vtbl_8859_4_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_4;
-
-int mbfl_filt_conv_8859_4_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_4(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_4_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c
deleted file mode 100644
index 70496d07e7..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_5.h"
-#include "unicode_table_iso8859_5.h"
-
-static const char *mbfl_encoding_8859_5_aliases[] = {"ISO8859-5", "cyrillic", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_5 = {
- mbfl_no_encoding_8859_5,
- "ISO-8859-5",
- "ISO-8859-5",
- (const char *(*)[])&mbfl_encoding_8859_5_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_5_wchar,
- &vtbl_wchar_8859_5
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_5 = {
- mbfl_no_encoding_8859_5,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_5_wchar = {
- mbfl_no_encoding_8859_5,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_5_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_5 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_5,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_5,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-5 => wchar
- */
-int mbfl_filt_conv_8859_5_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_5_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_5;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-5
- */
-int mbfl_filt_conv_wchar_8859_5(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_5_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_5) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h
deleted file mode 100644
index 8b09844141..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_5.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_5_H
-#define MBFL_MBFILTER_ISO8859_5_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_5;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_5;
-extern const struct mbfl_convert_vtbl vtbl_8859_5_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_5;
-
-int mbfl_filt_conv_8859_5_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_5(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_5_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c
deleted file mode 100644
index 59d981e9c2..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_6.h"
-#include "unicode_table_iso8859_6.h"
-
-static const char *mbfl_encoding_8859_6_aliases[] = {"ISO8859-6", "arabic", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_6 = {
- mbfl_no_encoding_8859_6,
- "ISO-8859-6",
- "ISO-8859-6",
- (const char *(*)[])&mbfl_encoding_8859_6_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_6_wchar,
- &vtbl_wchar_8859_6
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_6 = {
- mbfl_no_encoding_8859_6,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_6_wchar = {
- mbfl_no_encoding_8859_6,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_6_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_6 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_6,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_6,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-6 => wchar
- */
-int mbfl_filt_conv_8859_6_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_6_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_6;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-6
- */
-int mbfl_filt_conv_wchar_8859_6(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_6_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_6) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h
deleted file mode 100644
index c7e16c7e0b..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_6.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_6_H
-#define MBFL_MBFILTER_ISO8859_6_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_6;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_6;
-extern const struct mbfl_convert_vtbl vtbl_8859_6_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_6;
-
-int mbfl_filt_conv_8859_6_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_6(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_6_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c
deleted file mode 100644
index 73ead533ea..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_7.h"
-#include "unicode_table_iso8859_7.h"
-
-static const char *mbfl_encoding_8859_7_aliases[] = {"ISO8859-7", "greek", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_7 = {
- mbfl_no_encoding_8859_7,
- "ISO-8859-7",
- "ISO-8859-7",
- (const char *(*)[])&mbfl_encoding_8859_7_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_7_wchar,
- &vtbl_wchar_8859_7
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_7 = {
- mbfl_no_encoding_8859_7,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_7_wchar = {
- mbfl_no_encoding_8859_7,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_7_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_7 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_7,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_7,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-7 => wchar
- */
-int mbfl_filt_conv_8859_7_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_7_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_7;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-7
- */
-int mbfl_filt_conv_wchar_8859_7(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_7_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_7) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h
deleted file mode 100644
index 8421edb929..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_7.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_7_H
-#define MBFL_MBFILTER_ISO8859_7_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_7;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_7;
-extern const struct mbfl_convert_vtbl vtbl_8859_7_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_7;
-
-int mbfl_filt_conv_8859_7_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_7(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_7_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c
deleted file mode 100644
index 05ca13f330..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_8.h"
-#include "unicode_table_iso8859_8.h"
-
-static const char *mbfl_encoding_8859_8_aliases[] = {"ISO8859-8", "hebrew", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_8 = {
- mbfl_no_encoding_8859_8,
- "ISO-8859-8",
- "ISO-8859-8",
- (const char *(*)[])&mbfl_encoding_8859_8_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_8_wchar,
- &vtbl_wchar_8859_8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_8 = {
- mbfl_no_encoding_8859_8,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_8_wchar = {
- mbfl_no_encoding_8859_8,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_8_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_8 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_8,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_8,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-8 => wchar
- */
-int mbfl_filt_conv_8859_8_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_8_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_8;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-8
- */
-int mbfl_filt_conv_wchar_8859_8(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_8_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_8) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h
deleted file mode 100644
index ee679814f1..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_8.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_8_H
-#define MBFL_MBFILTER_ISO8859_8_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_8;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_8;
-extern const struct mbfl_convert_vtbl vtbl_8859_8_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_8;
-
-int mbfl_filt_conv_8859_8_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_8(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_8_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c
deleted file mode 100644
index 074f90bef2..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_iso8859_9.h"
-#include "unicode_table_iso8859_9.h"
-
-static const char *mbfl_encoding_8859_9_aliases[] = {"ISO8859-9", "latin5", NULL};
-
-const mbfl_encoding mbfl_encoding_8859_9 = {
- mbfl_no_encoding_8859_9,
- "ISO-8859-9",
- "ISO-8859-9",
- (const char *(*)[])&mbfl_encoding_8859_9_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_8859_9_wchar,
- &vtbl_wchar_8859_9
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_8859_9 = {
- mbfl_no_encoding_8859_9,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_true
-};
-
-const struct mbfl_convert_vtbl vtbl_8859_9_wchar = {
- mbfl_no_encoding_8859_9,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_8859_9_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_8859_9 = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_8859_9,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_8859_9,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * ISO-8859-9 => wchar
- */
-int mbfl_filt_conv_8859_9_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else if (c >= 0xa0 && c < 0x100) {
- s = iso8859_9_ucs_table[c - 0xa0];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_8859_9;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => ISO-8859-9
- */
-int mbfl_filt_conv_wchar_8859_9(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c >= 0 && c < 0xa0) {
- s = c;
- } else {
- s = -1;
- n = 95;
- while (n >= 0) {
- if (c == iso8859_9_ucs_table[n]) {
- s = 0xa0 + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_9) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h b/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h
deleted file mode 100644
index 5a61237113..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_iso8859_9.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_ISO8859_9_H
-#define MBFL_MBFILTER_ISO8859_9_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_8859_9;
-extern const struct mbfl_identify_vtbl vtbl_identify_8859_9;
-extern const struct mbfl_convert_vtbl vtbl_8859_9_wchar;
-extern const struct mbfl_convert_vtbl vtbl_wchar_8859_9;
-
-int mbfl_filt_conv_8859_9_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_8859_9(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_ISO8859_9_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.c b/ext/mbstring/libmbfl/filters/mbfilter_jis.c
index b08eec38b0..ba43872d83 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_jis.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.c
@@ -33,9 +33,6 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter);
-static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter);
-
const mbfl_encoding mbfl_encoding_jis = {
mbfl_no_encoding_jis,
"JIS",
@@ -58,18 +55,6 @@ const mbfl_encoding mbfl_encoding_2022jp = {
&vtbl_wchar_2022jp
};
-const struct mbfl_identify_vtbl vtbl_identify_jis = {
- mbfl_no_encoding_jis,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_jis
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_2022jp = {
- mbfl_no_encoding_2022jp,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_2022jp
-};
-
const struct mbfl_convert_vtbl vtbl_jis_wchar = {
mbfl_no_encoding_jis,
mbfl_no_encoding_wchar,
@@ -483,177 +468,3 @@ mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter)
return 0;
}
-
-static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x20: X 0201 kana */
-/* case 0x80: X 0208 */
-/* case 0x90: X 0212 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (c == 0x0e) { /* "kana in" */
- filter->status = 0x20;
- } else if (c == 0x0f) { /* "kana out" */
- filter->status = 0;
- } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
-/* case 0x91: X 0212 second char */
- case 1:
- filter->status &= ~0xf;
- if (c == 0x1b) {
- goto retry;
- } else if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x28) { /* '(' */
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ ( */
- case 4:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else if (c == 0x44) { /* 'D' */
- filter->status = 0x90;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else if (c == 0x49) { /* 'I' */
- filter->status = 0x20;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter)
-{
-retry:
- switch (filter->status & 0xf) {
-/* case 0x00: ASCII */
-/* case 0x10: X 0201 latin */
-/* case 0x80: X 0208 */
- case 0:
- if (c == 0x1b) {
- filter->status += 2;
- } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) { /* kanji first char */
- filter->status += 1;
- } else if (c >= 0 && c < 0x80) { /* latin, CTLs */
- ;
- } else {
- filter->flag = 1; /* bad */
- }
- break;
-
-/* case 0x81: X 0208 second char */
- case 1:
- if (c == 0x1b) {
- filter->status++;
- } else {
- filter->status &= ~0xf;
- if (c < 0x21 || c > 0x7e) { /* bad */
- filter->flag = 1;
- }
- }
- break;
-
- /* ESC */
- case 2:
- if (c == 0x24) { /* '$' */
- filter->status++;
- } else if (c == 0x28) { /* '(' */
- filter->status += 3;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC $ */
- case 3:
- if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
- filter->status = 0x80;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- /* ESC ( */
- case 5:
- if (c == 0x42) { /* 'B' */
- filter->status = 0;
- } else if (c == 0x4a) { /* 'J' */
- filter->status = 0x10;
- } else {
- filter->flag = 1; /* bad */
- filter->status &= ~0xf;
- goto retry;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.h b/ext/mbstring/libmbfl/filters/mbfilter_jis.h
index e7a164167e..55787c9acb 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_jis.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.h
@@ -34,8 +34,6 @@
extern const mbfl_encoding mbfl_encoding_jis;
extern const mbfl_encoding mbfl_encoding_2022jp;
-extern const struct mbfl_identify_vtbl vtbl_identify_2022jp;
-extern const struct mbfl_identify_vtbl vtbl_identify_jis;
extern const struct mbfl_convert_vtbl vtbl_jis_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_jis;
extern const struct mbfl_convert_vtbl vtbl_2022jp_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c b/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c
deleted file mode 100644
index 7790be65bb..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.c
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_koi8r.h"
-#include "unicode_table_koi8r.h"
-
-static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_koi8r_aliases[] = {"KOI8-R", "KOI8R", NULL};
-
-const mbfl_encoding mbfl_encoding_koi8r = {
- mbfl_no_encoding_koi8r,
- "KOI8-R",
- "KOI8-R",
- (const char *(*)[])&mbfl_encoding_koi8r_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_koi8r_wchar,
- &vtbl_wchar_koi8r
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_koi8r = {
- mbfl_no_encoding_koi8r,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_koi8r
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_koi8r = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_koi8r,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_koi8r,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_koi8r_wchar = {
- mbfl_no_encoding_koi8r,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_koi8r_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * koi8r => wchar
- */
-int
-mbfl_filt_conv_koi8r_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < koi8r_ucs_table_min) {
- s = c;
- } else if (c >= koi8r_ucs_table_min && c < 0x100) {
- s = koi8r_ucs_table[c - koi8r_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_KOI8R;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => koi8r
- */
-int
-mbfl_filt_conv_wchar_koi8r(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = koi8r_ucs_table_len-1;
- while (n >= 0) {
- if (c == koi8r_ucs_table[n]) {
- s = koi8r_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.h b/ext/mbstring/libmbfl/filters/mbfilter_koi8r.h
deleted file mode 100644
index 6073d140ae..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8r.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-/*
- * The source code included in this files was separated from mbfilter_ru.h
- * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
- *
- */
-
-#ifndef MBFL_MBFILTER_KOI8R_H
-#define MBFL_MBFILTER_KOI8R_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_koi8r;
-extern const struct mbfl_identify_vtbl vtbl_identify_koi8r;
-extern const struct mbfl_convert_vtbl vtbl_wchar_koi8r;
-extern const struct mbfl_convert_vtbl vtbl_koi8r_wchar;
-
-int mbfl_filt_conv_koi8r_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_koi8r(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_KOI8R_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c b/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c
deleted file mode 100644
index a62a1c596b..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Maksym Veremeyenko <verem@m1.tv>
- *
- * Based on mbfilter_koi8r.c code
- *
- */
-
-#include "mbfilter.h"
-#include "mbfilter_koi8u.h"
-#include "unicode_table_koi8u.h"
-
-static int mbfl_filt_ident_koi8u(int c, mbfl_identify_filter *filter);
-
-static const char *mbfl_encoding_koi8u_aliases[] = {"KOI8-U", "KOI8U", NULL};
-
-const mbfl_encoding mbfl_encoding_koi8u = {
- mbfl_no_encoding_koi8u,
- "KOI8-U",
- "KOI8-U",
- (const char *(*)[])&mbfl_encoding_koi8u_aliases,
- NULL,
- MBFL_ENCTYPE_SBCS,
- &vtbl_koi8u_wchar,
- &vtbl_wchar_koi8u
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_koi8u = {
- mbfl_no_encoding_koi8u,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_koi8u
-};
-
-const struct mbfl_convert_vtbl vtbl_wchar_koi8u = {
- mbfl_no_encoding_wchar,
- mbfl_no_encoding_koi8u,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_wchar_koi8u,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-const struct mbfl_convert_vtbl vtbl_koi8u_wchar = {
- mbfl_no_encoding_koi8u,
- mbfl_no_encoding_wchar,
- mbfl_filt_conv_common_ctor,
- NULL,
- mbfl_filt_conv_koi8u_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
-};
-
-#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-
-/*
- * koi8u => wchar
- */
-int
-mbfl_filt_conv_koi8u_wchar(int c, mbfl_convert_filter *filter)
-{
- int s;
-
- if (c >= 0 && c < koi8u_ucs_table_min) {
- s = c;
- } else if (c >= koi8u_ucs_table_min && c < 0x100) {
- s = koi8u_ucs_table[c - koi8u_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_KOI8U;
- }
- } else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
- }
-
- CK((*filter->output_function)(s, filter->data));
-
- return c;
-}
-
-/*
- * wchar => koi8u
- */
-int
-mbfl_filt_conv_wchar_koi8u(int c, mbfl_convert_filter *filter)
-{
- int s, n;
-
- if (c < 0x80) {
- s = c;
- } else {
- s = -1;
- n = koi8u_ucs_table_len-1;
- while (n >= 0) {
- if (c == koi8u_ucs_table[n]) {
- s = koi8u_ucs_table_min + n;
- break;
- }
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8U) {
- s = c & MBFL_WCSPLANE_MASK;
- }
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- CK(mbfl_filt_conv_illegal_output(c, filter));
- }
-
- return c;
-}
-
-static int mbfl_filt_ident_koi8u(int c, mbfl_identify_filter *filter)
-{
- if (c >= 0x80 && c < 0xff)
- filter->flag = 0;
- else
- filter->flag = 1; /* not it */
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.h b/ext/mbstring/libmbfl/filters/mbfilter_koi8u.h
deleted file mode 100644
index 16b95c1fc4..0000000000
--- a/ext/mbstring/libmbfl/filters/mbfilter_koi8u.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Maksym Veremeyenko <verem@m1.tv>
- *
- * Based on mbfilter_koi8r.h code
- *
- */
-
-#ifndef MBFL_MBFILTER_KOI8U_H
-#define MBFL_MBFILTER_KOI8U_H
-
-#include "mbfilter.h"
-
-extern const mbfl_encoding mbfl_encoding_koi8u;
-extern const struct mbfl_identify_vtbl vtbl_identify_koi8u;
-extern const struct mbfl_convert_vtbl vtbl_wchar_koi8u;
-extern const struct mbfl_convert_vtbl vtbl_koi8u_wchar;
-
-int mbfl_filt_conv_koi8u_wchar(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_wchar_koi8u(int c, mbfl_convert_filter *filter);
-
-#endif /* MBFL_MBFILTER_KOI8U_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c
index d42cdca883..8f806def25 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c
@@ -37,7 +37,7 @@ const mbfl_encoding mbfl_encoding_qprint = {
mbfl_no_encoding_qprint,
"Quoted-Printable",
"Quoted-Printable",
- (const char *(*)[])&mbfl_encoding_qprint_aliases,
+ mbfl_encoding_qprint_aliases,
NULL,
MBFL_ENCTYPE_GL_UNSAFE,
NULL,
@@ -110,8 +110,7 @@ int mbfl_filt_conv_qprintenc(int c, mbfl_convert_filter *filter)
}
if (s <= 0 || s >= 0x80 || s == 0x3d /* not ASCII or '=' */
- || ((filter->status & MBFL_QPRINT_STS_MIME_HEADER) != 0 &&
- (mbfl_charprop_table[s] & MBFL_CHP_MMHQENC) != 0)) {
+ || ((filter->status & MBFL_QPRINT_STS_MIME_HEADER) && mime_char_needs_qencode[s])) {
/* hex-octet */
CK((*filter->output_function)(0x3d, filter->data)); /* '=' */
n = (s >> 4) & 0xf;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c
new file mode 100644
index 0000000000..7e7bdfbfaa
--- /dev/null
+++ b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c
@@ -0,0 +1,581 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+*/
+
+#include "mbfilter_singlebyte.h"
+
+#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
+
+/* Helper for single-byte encodings which use a conversion table */
+static int mbfl_conv_singlebyte_table(int c, mbfl_convert_filter *filter, int tbl_min, const unsigned short tbl[])
+{
+ if (c < tbl_min) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ int s = tbl[c - tbl_min];
+ if (!s) {
+ s = c | MBFL_WCSGROUP_THROUGH;
+ }
+ CK((*filter->output_function)(s, filter->data));
+ }
+ return c;
+}
+
+static int mbfl_conv_reverselookup_table(int c, mbfl_convert_filter *filter, int tbl_min, const unsigned short tbl[])
+{
+ if (c < tbl_min) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ for (int i = 0; i < 256 - tbl_min; i++) {
+ if (c == tbl[i]) {
+ CK((*filter->output_function)(i + tbl_min, filter->data));
+ return c;
+ }
+ }
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+/* Initialize data structures for a single-byte encoding */
+#define DEF_SB(id, name, mime_name, aliases) \
+ static int mbfl_filt_conv_##id##_wchar(int c, mbfl_convert_filter *filter); \
+ static int mbfl_filt_conv_wchar_##id(int c, mbfl_convert_filter *filter); \
+ static const struct mbfl_convert_vtbl vtbl_##id##_wchar = { \
+ mbfl_no_encoding_##id, \
+ mbfl_no_encoding_wchar, \
+ mbfl_filt_conv_common_ctor, \
+ NULL, \
+ mbfl_filt_conv_##id##_wchar, \
+ mbfl_filt_conv_common_flush, \
+ NULL \
+ }; \
+ static const struct mbfl_convert_vtbl vtbl_wchar_##id = { \
+ mbfl_no_encoding_wchar, \
+ mbfl_no_encoding_##id, \
+ mbfl_filt_conv_common_ctor, \
+ NULL, \
+ mbfl_filt_conv_wchar_##id, \
+ mbfl_filt_conv_common_flush, \
+ NULL \
+ }; \
+ const mbfl_encoding mbfl_encoding_##id = { \
+ mbfl_no_encoding_##id, \
+ name, \
+ mime_name, \
+ aliases, \
+ NULL, \
+ MBFL_ENCTYPE_SBCS, \
+ &vtbl_##id##_wchar, \
+ &vtbl_wchar_##id \
+ }
+
+/* For single-byte encodings which use a conversion table */
+#define DEF_SB_TBL(id, name, mime_name, aliases, tbl_min, tbl) \
+ static int mbfl_filt_conv_##id##_wchar(int c, mbfl_convert_filter *filter) { \
+ return mbfl_conv_singlebyte_table(c, filter, tbl_min, tbl); \
+ } \
+ static int mbfl_filt_conv_wchar_##id(int c, mbfl_convert_filter *filter) { \
+ return mbfl_conv_reverselookup_table(c, filter, tbl_min, tbl); \
+ } \
+ DEF_SB(id, name, mime_name, aliases)
+
+/* The grand-daddy of them all: ASCII */
+static const char *ascii_aliases[] = {"ANSI_X3.4-1968", "iso-ir-6", "ANSI_X3.4-1986", "ISO_646.irv:1991", "US-ASCII", "ISO646-US", "us", "IBM367", "IBM-367", "cp367", "csASCII", NULL};
+DEF_SB(ascii, "ASCII", "US-ASCII", ascii_aliases);
+
+static int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter)
+{
+ if (c < 0x80) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+static int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter)
+{
+ if (c < 0x80) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+/* ISO-8859-X */
+
+static const char *iso8859_1_aliases[] = {"ISO8859-1", "latin1", NULL};
+DEF_SB(8859_1, "ISO-8859-1", "ISO-8859-1", iso8859_1_aliases);
+
+static int mbfl_filt_conv_8859_1_wchar(int c, mbfl_convert_filter *filter)
+{
+ return (*filter->output_function)(c, filter->data);
+}
+
+static int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter)
+{
+ if (c < 0x100) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+static const char *iso8859_2_aliases[] = {"ISO8859-2", "latin2", NULL};
+static const unsigned short iso8859_2_ucs_table[] = {
+ 0X00A0, 0X0104, 0X02D8, 0X0141, 0X00A4, 0X013D, 0X015A, 0X00A7,
+ 0X00A8, 0X0160, 0X015E, 0X0164, 0X0179, 0X00AD, 0X017D, 0X017B,
+ 0X00B0, 0X0105, 0X02DB, 0X0142, 0X00B4, 0X013E, 0X015B, 0X02C7,
+ 0X00B8, 0X0161, 0X015F, 0X0165, 0X017A, 0X02DD, 0X017E, 0X017C,
+ 0X0154, 0X00C1, 0X00C2, 0X0102, 0X00C4, 0X0139, 0X0106, 0X00C7,
+ 0X010C, 0X00C9, 0X0118, 0X00CB, 0X011A, 0X00CD, 0X00CE, 0X010E,
+ 0X0110, 0X0143, 0X0147, 0X00D3, 0X00D4, 0X0150, 0X00D6, 0X00D7,
+ 0X0158, 0X016E, 0X00DA, 0X0170, 0X00DC, 0X00DD, 0X0162, 0X00DF,
+ 0X0155, 0X00E1, 0X00E2, 0X0103, 0X00E4, 0X013A, 0X0107, 0X00E7,
+ 0X010D, 0X00E9, 0X0119, 0X00EB, 0X011B, 0X00ED, 0X00EE, 0X010F,
+ 0X0111, 0X0144, 0X0148, 0X00F3, 0X00F4, 0X0151, 0X00F6, 0X00F7,
+ 0X0159, 0X016F, 0X00FA, 0X0171, 0X00FC, 0X00FD, 0X0163, 0X02D9
+};
+DEF_SB_TBL(8859_2, "ISO-8859-2", "ISO-8859-2", iso8859_2_aliases, 0xA0, iso8859_2_ucs_table);
+
+static const char *iso8859_3_aliases[] = {"ISO8859-3", "latin3", NULL};
+static const unsigned short iso8859_3_ucs_table[] = {
+ 0X00A0, 0X0126, 0X02D8, 0X00A3, 0X00A4, 0X0000, 0X0124, 0X00A7,
+ 0X00A8, 0X0130, 0X015E, 0X011E, 0X0134, 0X00AD, 0X0000, 0X017B,
+ 0X00B0, 0X0127, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X0125, 0X00B7,
+ 0X00B8, 0X0131, 0X015F, 0X011F, 0X0135, 0X00BD, 0X0000, 0X017C,
+ 0X00C0, 0X00C1, 0X00C2, 0X0000, 0X00C4, 0X010A, 0X0108, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X0000, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X0120, 0X00D6, 0X00D7,
+ 0X011C, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X016C, 0X015C, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X0000, 0X00E4, 0X010B, 0X0109, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X0000, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X0121, 0X00F6, 0X00F7,
+ 0X011D, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X016D, 0X015D, 0X02D9
+};
+DEF_SB_TBL(8859_3, "ISO-8859-3", "ISO-8859-3", iso8859_3_aliases, 0xA0, iso8859_3_ucs_table);
+
+static const char *iso8859_4_aliases[] = {"ISO8859-4", "latin4", NULL};
+static const unsigned short iso8859_4_ucs_table[] = {
+ 0X00A0, 0X0104, 0X0138, 0X0156, 0X00A4, 0X0128, 0X013B, 0X00A7,
+ 0X00A8, 0X0160, 0X0112, 0X0122, 0X0166, 0X00AD, 0X017D, 0X00AF,
+ 0X00B0, 0X0105, 0X02DB, 0X0157, 0X00B4, 0X0129, 0X013C, 0X02C7,
+ 0X00B8, 0X0161, 0X0113, 0X0123, 0X0167, 0X014A, 0X017E, 0X014B,
+ 0X0100, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X012E,
+ 0X010C, 0X00C9, 0X0118, 0X00CB, 0X0116, 0X00CD, 0X00CE, 0X012A,
+ 0X0110, 0X0145, 0X014C, 0X0136, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X0172, 0X00DA, 0X00DB, 0X00DC, 0X0168, 0X016A, 0X00DF,
+ 0X0101, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X012F,
+ 0X010D, 0X00E9, 0X0119, 0X00EB, 0X0117, 0X00ED, 0X00EE, 0X012B,
+ 0X0111, 0X0146, 0X014D, 0X0137, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X0173, 0X00FA, 0X00FB, 0X00FC, 0X0169, 0X016B, 0X02D9
+};
+DEF_SB_TBL(8859_4, "ISO-8859-4", "ISO-8859-4", iso8859_4_aliases, 0xA0, iso8859_4_ucs_table);
+
+static const char *iso8859_5_aliases[] = {"ISO8859-5", "cyrillic", NULL};
+static const unsigned short iso8859_5_ucs_table[] = {
+ 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f
+};
+DEF_SB_TBL(8859_5, "ISO-8859-5", "ISO-8859-5", iso8859_5_aliases, 0xA0, iso8859_5_ucs_table);
+
+static const char *iso8859_6_aliases[] = {"ISO8859-6", "arabic", NULL};
+static const unsigned short iso8859_6_ucs_table[] = {
+ 0X00A0, 0X0000, 0X0000, 0X0000, 0X00A4, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X060C, 0X00AD, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X061B, 0X0000, 0X0000, 0X0000, 0X061F,
+ 0X0000, 0X0621, 0X0622, 0X0623, 0X0624, 0X0625, 0X0626, 0X0627,
+ 0X0628, 0X0629, 0X062A, 0X062B, 0X062C, 0X062D, 0X062E, 0X062F,
+ 0X0630, 0X0631, 0X0632, 0X0633, 0X0634, 0X0635, 0X0636, 0X0637,
+ 0X0638, 0X0639, 0X063A, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0640, 0X0641, 0X0642, 0X0643, 0X0644, 0X0645, 0X0646, 0X0647,
+ 0X0648, 0X0649, 0X064A, 0X064B, 0X064C, 0X064D, 0X064E, 0X064F,
+ 0X0650, 0X0651, 0X0652, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000
+};
+DEF_SB_TBL(8859_6, "ISO-8859-6", "ISO-8859-6", iso8859_6_aliases, 0xA0, iso8859_6_ucs_table);
+
+static const char *iso8859_7_aliases[] = {"ISO8859-7", "greek", NULL};
+static const unsigned short iso8859_7_ucs_table[] = {
+ 0X00A0, 0X2018, 0X2019, 0X00A3, 0X20AC, 0X20AF, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X037A, 0X00AB, 0X00AC, 0X00AD, 0X0000, 0X2015,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X0384, 0X0385, 0X0386, 0X00B7,
+ 0X0388, 0X0389, 0X038A, 0X00BB, 0X038C, 0X00BD, 0X038E, 0X038F,
+ 0X0390, 0X0391, 0X0392, 0X0393, 0X0394, 0X0395, 0X0396, 0X0397,
+ 0X0398, 0X0399, 0X039A, 0X039B, 0X039C, 0X039D, 0X039E, 0X039F,
+ 0X03A0, 0X03A1, 0X0000, 0X03A3, 0X03A4, 0X03A5, 0X03A6, 0X03A7,
+ 0X03A8, 0X03A9, 0X03AA, 0X03AB, 0X03AC, 0X03AD, 0X03AE, 0X03AF,
+ 0X03B0, 0X03B1, 0X03B2, 0X03B3, 0X03B4, 0X03B5, 0X03B6, 0X03B7,
+ 0X03B8, 0X03B9, 0X03BA, 0X03BB, 0X03BC, 0X03BD, 0X03BE, 0X03BF,
+ 0X03C0, 0X03C1, 0X03C2, 0X03C3, 0X03C4, 0X03C5, 0X03C6, 0X03C7,
+ 0X03C8, 0X03C9, 0X03CA, 0X03CB, 0X03CC, 0X03CD, 0X03CE, 0X0000
+};
+DEF_SB_TBL(8859_7, "ISO-8859-7", "ISO-8859-7", iso8859_7_aliases, 0xA0, iso8859_7_ucs_table);
+
+static const char *iso8859_8_aliases[] = {"ISO8859-8", "hebrew", NULL};
+static const unsigned short iso8859_8_ucs_table[] = {
+ 0X00A0, 0X0000, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X00D7, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7,
+ 0X00B8, 0X00B9, 0X00F7, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X2017,
+ 0X05D0, 0X05D1, 0X05D2, 0X05D3, 0X05D4, 0X05D5, 0X05D6, 0X05D7,
+ 0X05D8, 0X05D9, 0X05DA, 0X05DB, 0X05DC, 0X05DD, 0X05DE, 0X05DF,
+ 0X05E0, 0X05E1, 0X05E2, 0X05E3, 0X05E4, 0X05E5, 0X05E6, 0X05E7,
+ 0X05E8, 0X05E9, 0X05EA, 0X0000, 0X0000, 0X200E, 0X200F, 0X0000
+};
+DEF_SB_TBL(8859_8, "ISO-8859-8", "ISO-8859-8", iso8859_8_aliases, 0xA0, iso8859_8_ucs_table);
+
+static const char *iso8859_9_aliases[] = {"ISO8859-9", "latin5", NULL};
+static const unsigned short iso8859_9_ucs_table[] = {
+ 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7,
+ 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X011E, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0130, 0X015E, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X011F, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0131, 0X015F, 0X00FF
+};
+DEF_SB_TBL(8859_9, "ISO-8859-9", "ISO-8859-9", iso8859_9_aliases, 0xA0, iso8859_9_ucs_table);
+
+static const char *iso8859_10_aliases[] = {"ISO8859-10", "latin6", NULL};
+static const unsigned short iso8859_10_ucs_table[] = {
+ 0X00A0, 0X0104, 0X0112, 0X0122, 0X012A, 0X0128, 0X0136, 0X00A7,
+ 0X013B, 0X0110, 0X0160, 0X0166, 0X017D, 0X00AD, 0X016A, 0X014A,
+ 0X00B0, 0X0105, 0X0113, 0X0123, 0X012B, 0X0129, 0X0137, 0X00B7,
+ 0X013C, 0X0111, 0X0161, 0X0167, 0X017E, 0X2015, 0X016B, 0X014B,
+ 0X0100, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X012E,
+ 0X010C, 0X00C9, 0X0118, 0X00CB, 0X0116, 0X00CD, 0X00CE, 0X00CF,
+ 0X00D0, 0X0145, 0X014C, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X0168,
+ 0X00D8, 0X0172, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X00DE, 0X00DF,
+ 0X0101, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X012F,
+ 0X010D, 0X00E9, 0X0119, 0X00EB, 0X0117, 0X00ED, 0X00EE, 0X00EF,
+ 0X00F0, 0X0146, 0X014D, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X0169,
+ 0X00F8, 0X0173, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X00FE, 0X0138
+};
+DEF_SB_TBL(8859_10, "ISO-8859-10", "ISO-8859-10", iso8859_10_aliases, 0xA0, iso8859_10_ucs_table);
+
+static const char *iso8859_13_aliases[] = {"ISO8859-13", NULL};
+static const unsigned short iso8859_13_ucs_table[] = {
+ 0X00A0, 0X201D, 0X00A2, 0X00A3, 0X00A4, 0X201E, 0X00A6, 0X00A7,
+ 0X00D8, 0X00A9, 0X0156, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00C6,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X201C, 0X00B5, 0X00B6, 0X00B7,
+ 0X00F8, 0X00B9, 0X0157, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00E6,
+ 0X0104, 0X012E, 0X0100, 0X0106, 0X00C4, 0X00C5, 0X0118, 0X0112,
+ 0X010C, 0X00C9, 0X0179, 0X0116, 0X0122, 0X0136, 0X012A, 0X013B,
+ 0X0160, 0X0143, 0X0145, 0X00D3, 0X014C, 0X00D5, 0X00D6, 0X00D7,
+ 0X0172, 0X0141, 0X015A, 0X016A, 0X00DC, 0X017B, 0X017D, 0X00DF,
+ 0X0105, 0X012F, 0X0101, 0X0107, 0X00E4, 0X00E5, 0X0119, 0X0113,
+ 0X010D, 0X00E9, 0X017A, 0X0117, 0X0123, 0X0137, 0X012B, 0X013C,
+ 0X0161, 0X0144, 0X0146, 0X00F3, 0X014D, 0X00F5, 0X00F6, 0X00F7,
+ 0X0173, 0X0142, 0X015B, 0X016B, 0X00FC, 0X017C, 0X017E, 0X2019
+};
+DEF_SB_TBL(8859_13, "ISO-8859-13", "ISO-8859-13", iso8859_13_aliases, 0xA0, iso8859_13_ucs_table);
+
+static const char *iso8859_14_aliases[] = {"ISO8859-14", "latin8", NULL};
+static const unsigned short iso8859_14_ucs_table[] = {
+ 0X00A0, 0X1E02, 0X1E03, 0X00A3, 0X010A, 0X010B, 0X1E0A, 0X00A7,
+ 0X1E80, 0X00A9, 0X1E82, 0X1E0B, 0X1EF2, 0X00AD, 0X00AE, 0X0178,
+ 0X1E1E, 0X1E1F, 0X0120, 0X0121, 0X1E40, 0X1E41, 0X00B6, 0X1E56,
+ 0X1E81, 0X1E57, 0X1E83, 0X1E60, 0X1EF3, 0X1E84, 0X1E85, 0X1E61,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X0174, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X1E6A,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X0176, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X0175, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X1E6B,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X0177, 0X00FF
+};
+DEF_SB_TBL(8859_14, "ISO-8859-14", "ISO-8859-14", iso8859_14_aliases, 0xA0, iso8859_14_ucs_table);
+
+static const char *iso8859_15_aliases[] = {"ISO8859-15", NULL};
+static const unsigned short iso8859_15_ucs_table[] = {
+ 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X20AC, 0X00A5, 0X0160, 0X00A7,
+ 0X0161, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X017D, 0X00B5, 0X00B6, 0X00B7,
+ 0X017E, 0X00B9, 0X00BA, 0X00BB, 0X0152, 0X0153, 0X0178, 0X00BF,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X00D0, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X00DE, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X00F0, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X00FE, 0X00FF
+};
+DEF_SB_TBL(8859_15, "ISO-8859-15", "ISO-8859-15", iso8859_15_aliases, 0xA0, iso8859_15_ucs_table);
+
+static const char *iso8859_16_aliases[] = {"ISO8859-16", NULL};
+static const unsigned short iso8859_16_ucs_table[] = {
+ 0X00A0, 0X0104, 0X0105, 0X0141, 0X20AC, 0X201E, 0X0160, 0X00A7,
+ 0X0161, 0X00A9, 0X0218, 0X00AB, 0X0179, 0X00AD, 0X017A, 0X017B,
+ 0X00B0, 0X00B1, 0X010C, 0X0142, 0X017D, 0X201D, 0X00B6, 0X00B7,
+ 0X017E, 0X010D, 0X0219, 0X00BB, 0X0152, 0X0153, 0X0178, 0X017C,
+ 0X00C0, 0X00C1, 0X00C2, 0X0102, 0X00C4, 0X0106, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X0110, 0X0143, 0X00D2, 0X00D3, 0X00D4, 0X0150, 0X00D6, 0X015A,
+ 0X0170, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0118, 0X021A, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X0103, 0X00E4, 0X0107, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X0111, 0X0144, 0X00F2, 0X00F3, 0X00F4, 0X0151, 0X00F6, 0X015B,
+ 0X0171, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0119, 0X021B, 0X00FF
+};
+DEF_SB_TBL(8859_16, "ISO-8859-16", "ISO-8859-16", iso8859_16_aliases, 0xA0, iso8859_16_ucs_table);
+
+static const char *cp1251_aliases[] = {"CP1251", "CP-1251", "WINDOWS-1251", NULL};
+static const unsigned short cp1251_ucs_table[] = {
+ 0X0402, 0X0403, 0X201A, 0X0453, 0X201E, 0X2026, 0X2020, 0X2021,
+ 0X20AC, 0X2030, 0X0409, 0X2039, 0X040A, 0X040C, 0X040B, 0X040F,
+ 0X0452, 0X2018, 0X2019, 0X201C, 0X201D, 0X2022, 0X2013, 0X2014,
+ 0X0000, 0X2122, 0X0459, 0X203A, 0X045A, 0X045C, 0X045B, 0X045F,
+ 0X00A0, 0X040E, 0X045E, 0X0408, 0X00A4, 0X0490, 0X00A6, 0X00A7,
+ 0X0401, 0X00A9, 0X0404, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X0407,
+ 0X00B0, 0X00B1, 0X0406, 0X0456, 0X0491, 0X00B5, 0X00B6, 0X00B7,
+ 0X0451, 0X2116, 0X0454, 0X00BB, 0X0458, 0X0405, 0X0455, 0X0457,
+ 0X0410, 0X0411, 0X0412, 0X0413, 0X0414, 0X0415, 0X0416, 0X0417,
+ 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, 0X041F,
+ 0X0420, 0X0421, 0X0422, 0X0423, 0X0424, 0X0425, 0X0426, 0X0427,
+ 0X0428, 0X0429, 0X042A, 0X042B, 0X042C, 0X042D, 0X042E, 0X042F,
+ 0X0430, 0X0431, 0X0432, 0X0433, 0X0434, 0X0435, 0X0436, 0X0437,
+ 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, 0X043F,
+ 0X0440, 0X0441, 0X0442, 0X0443, 0X0444, 0X0445, 0X0446, 0X0447,
+ 0X0448, 0X0449, 0X044A, 0X044B, 0X044C, 0X044D, 0X044E, 0X044F
+};
+DEF_SB_TBL(cp1251, "Windows-1251", "Windows-1251", cp1251_aliases, 0x80, cp1251_ucs_table);
+
+static const char *cp1252_aliases[] = {"cp1252", NULL};
+static const unsigned short cp1252_ucs_table[] = {
+ 0X20AC,0X0000,0X201A,0X0192,0X201E,0X2026,0X2020,0X2021,
+ 0X02C6,0X2030,0X0160,0X2039,0X0152,0X0000,0X017D,0X0000,
+ 0X0000,0X2018,0X2019,0X201C,0X201D,0X2022,0X2013,0X2014,
+ 0X02DC,0X2122,0X0161,0X203A,0X0153,0X0000,0X017E,0X0178
+};
+DEF_SB(cp1252, "Windows-1252", "Windows-1252", cp1252_aliases);
+
+static int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter)
+{
+ if (c >= 0x100) {
+ for (int n = 0; n < 32; n++) {
+ if (c == cp1252_ucs_table[n]) {
+ CK((*filter->output_function)(0x80 + n, filter->data));
+ return c;
+ }
+ }
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ } else if (c <= 0x7F || c >= 0xA0) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
+
+static int mbfl_filt_conv_cp1252_wchar(int c, mbfl_convert_filter *filter)
+{
+ int s;
+
+ if (c >= 0x80 && c < 0xA0) {
+ s = cp1252_ucs_table[c - 0x80];
+ if (!s) {
+ s = c | MBFL_WCSGROUP_THROUGH;
+ }
+ } else {
+ s = c;
+ }
+
+ CK((*filter->output_function)(s, filter->data));
+ return c;
+}
+
+static const char *cp1254_aliases[] = {"CP1254", "CP-1254", "WINDOWS-1254", NULL};
+static const unsigned short cp1254_ucs_table[] = {
+ 0X20AC, 0X0000, 0X201A, 0X0192, 0X201E, 0X2026, 0X2020, 0X2021,
+ 0X02C6, 0X2030, 0X0160, 0X2039, 0X0152, 0X0000, 0X0000, 0X0000,
+ 0X0000, 0X2018, 0X2019, 0X201C, 0X201D, 0X2022, 0X2013, 0X2014,
+ 0X02DC, 0X2122, 0X0161, 0X203A, 0X0153, 0X0000, 0X0000, 0X0178,
+ 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7,
+ 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF,
+ 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7,
+ 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF,
+ 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7,
+ 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF,
+ 0X011E, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7,
+ 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0130, 0X015E, 0X00DF,
+ 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7,
+ 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF,
+ 0X011F, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7,
+ 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0131, 0X015F, 0X00FF
+};
+DEF_SB_TBL(cp1254, "Windows-1254", "Windows-1254", cp1254_aliases, 0x80, cp1254_ucs_table);
+
+static const char *cp866_aliases[] = {"CP-866", "IBM866", "IBM-866", NULL};
+static const unsigned short cp866_ucs_table[] = {
+ 0X0410, 0X0411, 0X0412, 0X0413, 0X0414, 0X0415, 0X0416, 0X0417,
+ 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, 0X041F,
+ 0X0420, 0X0421, 0X0422, 0X0423, 0X0424, 0X0425, 0X0426, 0X0427,
+ 0X0428, 0X0429, 0X042A, 0X042B, 0X042C, 0X042D, 0X042E, 0X042F,
+ 0X0430, 0X0431, 0X0432, 0X0433, 0X0434, 0X0435, 0X0436, 0X0437,
+ 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, 0X043F,
+ 0X2591, 0X2592, 0X2593, 0X2502, 0X2524, 0X2561, 0X2562, 0X2556,
+ 0X2555, 0X2563, 0X2551, 0X2557, 0X255D, 0X255C, 0X255B, 0X2510,
+ 0X2514, 0X2534, 0X252C, 0X251C, 0X2500, 0X253C, 0X255E, 0X255F,
+ 0X255A, 0X2554, 0X2569, 0X2566, 0X2560, 0X2550, 0X256C, 0X2567,
+ 0X2568, 0X2564, 0X2565, 0X2559, 0X2558, 0X2552, 0X2553, 0X256B,
+ 0X256A, 0X2518, 0X250C, 0X2588, 0X2584, 0X258C, 0X2590, 0X2580,
+ 0X0440, 0X0441, 0X0442, 0X0443, 0X0444, 0X0445, 0X0446, 0X0447,
+ 0X0448, 0X0449, 0X044A, 0X044B, 0X044C, 0X044D, 0X044E, 0X044F,
+ 0X0401, 0X0451, 0X0404, 0X0454, 0X0407, 0X0457, 0X040E, 0X045E,
+ 0X00B0, 0X2219, 0X00B7, 0X221A, 0X2116, 0X00A4, 0X25A0, 0X00A0
+};
+DEF_SB_TBL(cp866, "CP866", "CP866", cp866_aliases, 0x80, cp866_ucs_table);
+
+static const char *cp850_aliases[] = {"CP-850", "IBM850", "IBM-850", NULL};
+static const unsigned short cp850_ucs_table[] = {
+ 0X00C7, 0X00FC, 0X00E9, 0X00E2, 0X00E4, 0X00E0, 0X00E5, 0X00E7,
+ 0X00EA, 0X00EB, 0X00E8, 0X00EF, 0X00EE, 0X00EC, 0X00C4, 0X00C5,
+ 0X00C9, 0X00E6, 0X00C6, 0X00F4, 0X00F6, 0X00F2, 0X00FB, 0X00F9,
+ 0X00FF, 0X00D6, 0X00DC, 0X00F8, 0X00A3, 0X00D8, 0X00D7, 0X0192,
+ 0X00E1, 0X00ED, 0X00F3, 0X00FA, 0X00F1, 0X00D1, 0X00AA, 0X00BA,
+ 0X00BF, 0X00AE, 0X00AC, 0X00BD, 0X00BC, 0X00A1, 0X00AB, 0X00BB,
+ 0X2591, 0X2592, 0X2593, 0X2502, 0X2524, 0X00C1, 0X00C2, 0X00C0,
+ 0X00A9, 0X2563, 0X2551, 0X2557, 0X255D, 0X00A2, 0X00A5, 0X2510,
+ 0X2514, 0X2534, 0X252C, 0X251C, 0X2500, 0X253C, 0X00E3, 0X00C3,
+ 0X255A, 0X2554, 0X2569, 0X2566, 0X2560, 0X2550, 0X256C, 0X00A4,
+ 0X00F0, 0X00D0, 0X00CA, 0X00CB, 0X00C8, 0X0131, 0X00CD, 0X00CE,
+ 0X00CF, 0X2518, 0X250C, 0X2588, 0X2584, 0X00A6, 0X00CC, 0X2580,
+ 0X00D3, 0X00DF, 0X00D4, 0X00D2, 0X00F5, 0X00D5, 0X00B5, 0X00FE,
+ 0X00DE, 0X00DA, 0X00DB, 0X00D9, 0X00FD, 0X00DD, 0X00AF, 0X00B4,
+ 0X00AD, 0X00B1, 0X2017, 0X00BE, 0X00B6, 0X00A7, 0X00F7, 0X00B8,
+ 0X00B0, 0X00A8, 0X00B7, 0X00B9, 0X00B3, 0X00B2, 0X25A0, 0X00A0
+};
+DEF_SB_TBL(cp850, "CP850", "CP850", cp850_aliases, 0x80, cp850_ucs_table);
+
+static const char *koi8r_aliases[] = {"KOI8R", NULL};
+static const unsigned short koi8r_ucs_table[] = {
+ 0X2500, 0X2502, 0X250C, 0X2510, 0X2514, 0X2518, 0X251C, 0X2524,
+ 0X252C, 0X2534, 0X253C, 0X2580, 0X2584, 0X2588, 0X258C, 0X2590,
+ 0X2591, 0X2592, 0X2593, 0X2320, 0X25A0, 0X2219, 0X221A, 0X2248,
+ 0X2264, 0X2265, 0X00A0, 0X2321, 0X00B0, 0X00B2, 0X00B7, 0X00F7,
+ 0X2550, 0X2551, 0X2552, 0X0451, 0X2553, 0X2554, 0X2555, 0X2556,
+ 0X2557, 0X2558, 0X2559, 0X255A, 0X255B, 0X255C, 0X255D, 0X255E,
+ 0X255F, 0X2560, 0X2561, 0X0401, 0X2562, 0X2563, 0X2564, 0X2565,
+ 0X2566, 0X2567, 0X2568, 0X2569, 0X256A, 0X256B, 0X256C, 0X00A9,
+ 0X044E, 0X0430, 0X0431, 0X0446, 0X0434, 0X0435, 0X0444, 0X0433,
+ 0X0445, 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E,
+ 0X043F, 0X044F, 0X0440, 0X0441, 0X0442, 0X0443, 0X0436, 0X0432,
+ 0X044C, 0X044B, 0X0437, 0X0448, 0X044D, 0X0449, 0X0447, 0X044A,
+ 0X042E, 0X0410, 0X0411, 0X0426, 0X0414, 0X0415, 0X0424, 0X0413,
+ 0X0425, 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E,
+ 0X041F, 0X042F, 0X0420, 0X0421, 0X0422, 0X0423, 0X0416, 0X0412,
+ 0X042C, 0X042B, 0X0417, 0X0428, 0X042D, 0X0429, 0X0427, 0X042A
+};
+DEF_SB_TBL(koi8r, "KOI8-R", "KOI8-R", koi8r_aliases, 0x80, koi8r_ucs_table);
+
+static const char *koi8u_aliases[] = {"KOI8U", NULL};
+static const unsigned short koi8u_ucs_table[] = {
+ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
+ 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
+ 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
+ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457,
+ 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E,
+ 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407,
+ 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9,
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A
+};
+DEF_SB_TBL(koi8u, "KOI8-U", "KOI8-U", koi8u_aliases, 0x80, koi8u_ucs_table);
+
+static const char *armscii8_aliases[] = {"ArmSCII8", "ARMSCII-8", "ARMSCII8", NULL};
+static const unsigned short armscii8_ucs_table[] = {
+ 0X00A0, 0X0000, 0X0587, 0X0589, 0X0029, 0X0028, 0X00BB, 0X00AB,
+ 0X2014, 0X002E, 0X055D, 0X002C, 0X002D, 0X058A, 0X2026, 0X055C,
+ 0X055B, 0X055E, 0X0531, 0X0561, 0X0532, 0X0562, 0X0533, 0X0563,
+ 0X0534, 0X0564, 0X0535, 0X0565, 0X0536, 0X0566, 0X0537, 0X0567,
+ 0X0538, 0X0568, 0X0539, 0X0569, 0X053A, 0X056A, 0X053B, 0X056B,
+ 0X053C, 0X056C, 0X053D, 0X056D, 0X053E, 0X056E, 0X053F, 0X056F,
+ 0X0540, 0X0570, 0X0541, 0X0571, 0X0542, 0X0572, 0X0543, 0X0573,
+ 0X0544, 0X0574, 0X0545, 0X0575, 0X0546, 0X0576, 0X0547, 0X0577,
+ 0X0548, 0X0578, 0X0549, 0X0579, 0X054A, 0X057A, 0X054B, 0X057B,
+ 0X054C, 0X057C, 0X054D, 0X057D, 0X054E, 0X057E, 0X054F, 0X057F,
+ 0X0550, 0X0580, 0X0551, 0X0581, 0X0552, 0X0582, 0X0553, 0X0583,
+ 0X0554, 0X0584, 0X0555, 0X0585, 0X0556, 0X0586, 0X055A, 0X0000
+};
+static const unsigned char ucs_armscii8_table[] = {
+ 0XA5, 0XA4, 0X2A, 0X2B, 0XAB, 0XAC, 0XA9, 0X2F
+};
+DEF_SB(armscii8, "ArmSCII-8", "ArmSCII-8", armscii8_aliases);
+
+int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter)
+{
+ int s;
+
+ if (c < 0xA0) {
+ s = c;
+ } else {
+ s = armscii8_ucs_table[c - 0xA0];
+ if (!s) {
+ s = c | MBFL_WCSGROUP_THROUGH;
+ }
+ }
+
+ CK((*filter->output_function)(s, filter->data));
+ return c;
+}
+
+int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter)
+{
+ if (c >= 0x28 && c <= 0x2F) {
+ CK((*filter->output_function)(ucs_armscii8_table[c - 0x28], filter->data));
+ } else if (c < 0xA0) {
+ CK((*filter->output_function)(c, filter->data));
+ } else {
+ for (int n = 0; n < 0x60; n++) {
+ if (c == armscii8_ucs_table[n]) {
+ CK((*filter->output_function)(0xA0 + n, filter->data));
+ return c;
+ }
+ }
+ CK(mbfl_filt_conv_illegal_output(c, filter));
+ }
+ return c;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h
new file mode 100644
index 0000000000..ca7c6f806c
--- /dev/null
+++ b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.h
@@ -0,0 +1,44 @@
+/*
+ +----------------------------------------------------------------------+
+ | Copyright (c) The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef MBFL_SINGLEBYTE_H
+#define MBFL_SINGLEBYTE_H
+
+#include "mbfilter.h"
+
+extern const mbfl_encoding mbfl_encoding_ascii;
+extern const mbfl_encoding mbfl_encoding_8859_1;
+extern const mbfl_encoding mbfl_encoding_8859_2;
+extern const mbfl_encoding mbfl_encoding_8859_3;
+extern const mbfl_encoding mbfl_encoding_8859_4;
+extern const mbfl_encoding mbfl_encoding_8859_5;
+extern const mbfl_encoding mbfl_encoding_8859_6;
+extern const mbfl_encoding mbfl_encoding_8859_7;
+extern const mbfl_encoding mbfl_encoding_8859_8;
+extern const mbfl_encoding mbfl_encoding_8859_9;
+extern const mbfl_encoding mbfl_encoding_8859_10;
+extern const mbfl_encoding mbfl_encoding_8859_13;
+extern const mbfl_encoding mbfl_encoding_8859_14;
+extern const mbfl_encoding mbfl_encoding_8859_15;
+extern const mbfl_encoding mbfl_encoding_8859_16;
+extern const mbfl_encoding mbfl_encoding_cp1251;
+extern const mbfl_encoding mbfl_encoding_cp1252;
+extern const mbfl_encoding mbfl_encoding_cp1254;
+extern const mbfl_encoding mbfl_encoding_cp866;
+extern const mbfl_encoding mbfl_encoding_cp850;
+extern const mbfl_encoding mbfl_encoding_koi8r;
+extern const mbfl_encoding mbfl_encoding_koi8u;
+extern const mbfl_encoding mbfl_encoding_armscii8;
+
+#endif /* MBFL_SINGLEBYTE_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
index dc5c2e4882..39e7879c1a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c
@@ -36,7 +36,7 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter);
const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -63,27 +63,21 @@ const mbfl_encoding mbfl_encoding_sjis = {
mbfl_no_encoding_sjis,
"SJIS",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_aliases,
+ mbfl_encoding_sjis_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_wchar,
&vtbl_wchar_sjis
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis = {
- mbfl_no_encoding_sjis,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_wchar = {
mbfl_no_encoding_sjis,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_sjis_wchar,
- mbfl_filt_conv_common_flush,
- NULL,
+ mbfl_filt_conv_sjis_wchar_flush,
+ NULL
};
const struct mbfl_convert_vtbl vtbl_wchar_sjis = {
@@ -93,7 +87,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis = {
NULL,
mbfl_filt_conv_wchar_sjis,
mbfl_filt_conv_common_flush,
- NULL,
+ NULL
};
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
@@ -141,35 +135,32 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis = {
} \
} while (0)
-
-/*
- * SJIS => wchar
- */
-int
-mbfl_filt_conv_sjis_wchar(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_sjis_wchar(int c, mbfl_convert_filter *filter)
{
- int c1, s1, s2, w;
+ int s1, s2, w;
switch (filter->status) {
case 0:
- if (c >= 0 && c < 0x80) { /* latin */
+ if (c == 0x5C) {
+ CK((*filter->output_function)(0xA5, filter->data));
+ } else if (c == 0x7E) {
+ CK((*filter->output_function)(0x203E, filter->data));
+ } else if (c >= 0 && c < 0x80) { /* ASCII */
CK((*filter->output_function)(c, filter->data));
- } else if (c > 0xa0 && c < 0xe0) { /* kana */
- CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
+ } else if (c > 0xA0 && c < 0xE0) { /* Kana */
+ CK((*filter->output_function)(0xFEC0 + c, filter->data));
+ } else if (c > 0x80 && c < 0xF0 && c != 0xA0) { /* Kanji, first byte */
filter->status = 1;
filter->cache = c;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
}
break;
- case 1: /* kanji second char */
+ case 1: /* Kanji, second byte */
filter->status = 0;
- c1 = filter->cache;
- if (c >= 0x40 && c <= 0xfc && c != 0x7f) {
+ int c1 = filter->cache;
+ if (c >= 0x40 && c <= 0xFC && c != 0x7F) {
SJIS_DECODE(c1, c, s1, s2);
w = (s1 - 0x21)*94 + s2 - 0x21;
if (w >= 0 && w < jisx0208_ucs_table_size) {
@@ -178,45 +169,45 @@ mbfl_filt_conv_sjis_wchar(int c, mbfl_convert_filter *filter)
w = 0;
}
if (w <= 0) {
- if (s1 < 0x7f && s2 < 0x7f) {
- w = (s1 << 8) | s2;
- w &= MBFL_WCSPLANE_MASK;
- w |= MBFL_WCSPLANE_JIS0208;
+ if (s1 < 0x7F && s2 < 0x7F) {
+ w = (s1 << 8) | s2 | MBFL_WCSPLANE_JIS0208;
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
}
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
- w = (c1 << 8) | c;
- w &= MBFL_WCSGROUP_MASK;
- w |= MBFL_WCSGROUP_THROUGH;
+ w = (c1 << 8) | c | MBFL_WCSGROUP_THROUGH;
CK((*filter->output_function)(w, filter->data));
}
- break;
-
- default:
- filter->status = 0;
- break;
}
return c;
}
-/*
- * wchar => SJIS
- */
-int
-mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
+static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ mbfl_filt_conv_illegal_output(filter->cache, filter);
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
+
+int mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
{
int c1, c2, s1, s2;
s1 = 0;
- if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
+ if (c == 0x5C) {
+ /* Unicode 0x5C is a backslash; but Shift-JIS uses 0x5C for the
+ * Yen sign. JIS X 0208 kuten 0x2140 is a backslash. */
+ s1 = 0x2140;
+ } else if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
} else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
s1 = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
@@ -226,42 +217,39 @@ mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
s1 = ucs_r_jis_table[c - ucs_r_jis_table_min];
}
if (s1 <= 0) {
- c1 = c & ~MBFL_WCSPLANE_MASK;
- if (c1 == MBFL_WCSPLANE_JIS0208) {
- s1 = c & MBFL_WCSPLANE_MASK;
- } else if (c == 0xa5) { /* YEN SIGN */
- s1 = 0x216f; /* FULLWIDTH YEN SIGN */
- } else if (c == 0x203e) { /* OVER LINE */
- s1 = 0x2131; /* FULLWIDTH MACRON */
- } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
+ if (c == 0xA5) { /* YEN SIGN */
+ s1 = 0x5C;
+ } else if (c == 0x203E) { /* OVER LINE */
+ s1 = 0x7E;
+ } else if (c == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */
s1 = 0x2140;
- } else if (c == 0xff5e) { /* FULLWIDTH TILDE */
+ } else if (c == 0xFF5E) { /* FULLWIDTH TILDE */
s1 = 0x2141;
- } else if (c == 0x2225) { /* PARALLEL TO */
+ } else if (c == 0x2225) { /* PARALLEL TO */
s1 = 0x2142;
- } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */
- s1 = 0x215d;
- } else if (c == 0xffe0) { /* FULLWIDTH CENT SIGN */
+ } else if (c == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */
+ s1 = 0x215D;
+ } else if (c == 0xFFE0) { /* FULLWIDTH CENT SIGN */
s1 = 0x2171;
- } else if (c == 0xffe1) { /* FULLWIDTH POUND SIGN */
+ } else if (c == 0xFFE1) { /* FULLWIDTH POUND SIGN */
s1 = 0x2172;
- } else if (c == 0xffe2) { /* FULLWIDTH NOT SIGN */
- s1 = 0x224c;
- }
- if (c == 0) {
+ } else if (c == 0xFFE2) { /* FULLWIDTH NOT SIGN */
+ s1 = 0x224C;
+ } else if (c == 0) {
s1 = 0;
- } else if (s1 <= 0) {
+ } else {
s1 = -1;
}
- } else if (s1 >= 0x8080) {
+ } else if (s1 >= 0x8080) { /* JIS X 0212; not supported */
s1 = -1;
}
+
if (s1 >= 0) {
- if (s1 < 0x100) { /* latin or kana */
+ if (s1 < 0x100) { /* Latin/Kana */
CK((*filter->output_function)(s1, filter->data));
- } else { /* kanji */
- c1 = (s1 >> 8) & 0xff;
- c2 = s1 & 0xff;
+ } else { /* Kanji */
+ c1 = (s1 >> 8) & 0xFF;
+ c2 = s1 & 0xFF;
SJIS_ENCODE(c1, c2, s1, s2);
CK((*filter->output_function)(s1, filter->data));
CK((*filter->output_function)(s2, filter->data));
@@ -272,23 +260,3 @@ mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter)
return c;
}
-
-int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0xa0 && c < 0xe0) { /* kana ok */
- ;
- } else if (c > 0x80 && c < 0xf0 && c != 0xa0) { /* kanji first char */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis.h
index f271f399c9..b0689fce64 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_sjis;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis;
extern const struct mbfl_convert_vtbl vtbl_sjis_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c
index 04e1d3af17..02bbdccdc8 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c
@@ -35,7 +35,6 @@
extern const unsigned char mblen_table_sjis[];
-extern int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
extern int mbfl_bisec_srch(int w, const unsigned short *tbl, int n);
extern int mbfl_bisec_srch2(int w, const unsigned short tbl[], int n);
@@ -45,26 +44,20 @@ const mbfl_encoding mbfl_encoding_sjis2004 = {
mbfl_no_encoding_sjis2004,
"SJIS-2004",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis2004_aliases,
+ mbfl_encoding_sjis2004_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis2004_wchar,
&vtbl_wchar_sjis2004
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis2004 = {
- mbfl_no_encoding_sjis2004,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis2004_wchar = {
mbfl_no_encoding_sjis2004,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_jis2004_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_jis2004_wchar_flush,
NULL,
};
@@ -74,7 +67,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis2004 = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_jis2004,
- mbfl_filt_conv_jis2004_flush,
+ mbfl_filt_conv_wchar_jis2004_flush,
NULL,
};
@@ -209,6 +202,9 @@ retry:
} else if (filter->from->no_encoding == mbfl_no_encoding_sjis2004) {
if (c >= 0x40 && c <= 0xfc && c != 0x7f) {
SJIS_DECODE(c1, c, s1, s2);
+ } else {
+ CK((*filter->output_function)(c | MBFL_WCSGROUP_THROUGH, filter->data));
+ break;
}
} else {
s1 = c1;
@@ -478,13 +474,21 @@ retry:
return c;
}
+int mbfl_filt_conv_jis2004_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status & 0xF) {
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+ return 0;
+}
+
int
mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter) {
int k;
- int c1, c2, s1 = 0, s2;
+ int c1, c2, s1, s2;
retry:
-
+ s1 = 0;
/* check for 1st char of combining characters */
if ((filter->status & 0xf)== 0 && (
c == 0x00E6 ||
@@ -672,7 +676,7 @@ retry:
}
int
-mbfl_filt_conv_jis2004_flush(mbfl_convert_filter *filter)
+mbfl_filt_conv_wchar_jis2004_flush(mbfl_convert_filter *filter)
{
int k, c1, c2, s1, s2;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h
index c75e3a910b..869fd145c1 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.h
@@ -33,14 +33,14 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_sjis2004;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis2004;
extern const struct mbfl_convert_vtbl vtbl_sjis2004_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis2004;
int mbfl_filt_conv_jis2004_wchar(int c, mbfl_convert_filter *filter);
int mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter);
-int mbfl_filt_conv_jis2004_flush(mbfl_convert_filter *filter);
+int mbfl_filt_conv_wchar_jis2004_flush(mbfl_convert_filter *filter);
+int mbfl_filt_conv_jis2004_wchar_flush(mbfl_convert_filter *filter);
#endif /* MBFL_MBFILTER_SJIS_2004_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c
index dc3d3692f4..45b87a8f98 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c
@@ -35,10 +35,10 @@
#include "sjis_mac2uni.h"
-extern int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
extern const unsigned char mblen_table_sjis[];
-static int mbfl_filt_conv_sjis_mac_flush(mbfl_convert_filter *filter);
+static int mbfl_filt_conv_wchar_sjis_mac_flush(mbfl_convert_filter *filter);
+static int mbfl_filt_conv_sjis_mac_wchar_flush(mbfl_convert_filter *filter);
static const char *mbfl_encoding_sjis_mac_aliases[] = {"MacJapanese", "x-Mac-Japanese", NULL};
@@ -46,26 +46,20 @@ const mbfl_encoding mbfl_encoding_sjis_mac = {
mbfl_no_encoding_sjis_mac,
"SJIS-mac",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_mac_aliases,
+ mbfl_encoding_sjis_mac_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_mac_wchar,
&vtbl_wchar_sjis_mac
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis_mac = {
- mbfl_no_encoding_sjis_mac,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_mac_wchar = {
mbfl_no_encoding_sjis_mac,
mbfl_no_encoding_wchar,
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_sjis_mac_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_sjis_mac_wchar_flush,
NULL,
};
@@ -75,7 +69,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_sjis_mac = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_wchar_sjis_mac,
- mbfl_filt_conv_sjis_mac_flush,
+ mbfl_filt_conv_wchar_sjis_mac_flush,
NULL,
};
@@ -139,7 +133,7 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
CK((*filter->output_function)(c, filter->data));
} else if (c > 0xa0 && c < 0xe0) { /* kana */
CK((*filter->output_function)(0xfec0 + c, filter->data));
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
+ } else if (c > 0x80 && c <= 0xed && c != 0xa0) { /* kanji first char */
filter->status = 1;
filter->cache = c;
} else if (c == 0x5c) {
@@ -223,6 +217,10 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
for (i=0; i<8; i++) {
if (s >= code_ofst_tbl[i][0] && s <= code_ofst_tbl[i][1]) {
w = code_map[i][s - code_ofst_tbl[i][0]];
+ if (w == 0) {
+ CK((*filter->output_function)((c1 << 8) | c | MBFL_WCSGROUP_THROUGH, filter->data));
+ return c;
+ }
s2 = 0;
if (s >= 0x043e && s <= 0x0441) {
s2 = 0xf87a;
@@ -254,8 +252,6 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
w |= MBFL_WCSPLANE_WINCP932;
}
CK((*filter->output_function)(w, filter->data));
- } else if ((c >= 0 && c < 0x21) || c == 0x7f) { /* CTLs */
- CK((*filter->output_function)(c, filter->data));
} else {
w = (c1 << 8) | c;
w &= MBFL_WCSGROUP_MASK;
@@ -272,6 +268,15 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter)
return c;
}
+static int mbfl_filt_conv_sjis_mac_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status == 1) {
+ int w = (filter->cache & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(w, filter->data));
+ }
+ return 0;
+}
+
/*
* wchar => SJIS-mac
*/
@@ -367,6 +372,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
if (s2 <= 0 || s1 == -1) {
break;
}
+ s1 = s2 = 0;
case 0:
@@ -402,6 +408,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
}
if (c == 0xf860 || c == 0xf861 || c == 0xf862) {
+ /* Apple 'transcoding hint' codepoints (from private use area) */
filter->status = 2;
filter->cache = c;
return c;
@@ -420,8 +427,10 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
s1 |= 0x8080;
} else if (c == 0xa0) {
s1 = 0x00a0;
- } else if (c == 0xa5) { /* YEN SIGN */
- s1 = 0x216f; /* FULLWIDTH YEN SIGN */
+ } else if (c == 0xa5) { /* YEN SIGN */
+ /* Unicode has codepoint 0xFFE5 for a fullwidth Yen sign;
+ * convert codepoint 0xA5 to halfwidth Yen sign */
+ s1 = 0x5c; /* HALFWIDTH YEN SIGN */
} else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */
s1 = 0x2140;
}
@@ -519,8 +528,9 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
}
if (filter->status == 0) {
+ /* Didn't find any of expected codepoints after Apple transcoding hint */
CK(mbfl_filt_conv_illegal_output(c1, filter));
- CK(mbfl_filt_conv_illegal_output(c, filter));
+ return mbfl_filt_conv_wchar_sjis_mac(c, filter);
}
break;
@@ -667,7 +677,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter)
}
static int
-mbfl_filt_conv_sjis_mac_flush(mbfl_convert_filter *filter)
+mbfl_filt_conv_wchar_sjis_mac_flush(mbfl_convert_filter *filter)
{
int i, c1, s1 = 0;
if (filter->status == 1 && filter->cache > 0) {
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h
index f4b2adfeac..970d14a4c9 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.h
@@ -33,8 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_sjis_mac;
-
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_mac;
extern const struct mbfl_convert_vtbl vtbl_sjis_mac_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis_mac;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c
index 68084a0e0a..255a457c58 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c
@@ -36,7 +36,6 @@
#include "emoji2uni.h"
extern int mbfl_bisec_srch2(int w, const unsigned short tbl[], int n);
-extern int mbfl_filt_ident_sjis(int c, mbfl_identify_filter *filter);
extern const unsigned char mblen_table_sjis[];
static const char *mbfl_encoding_sjis_docomo_aliases[] = {"SJIS-DOCOMO", "shift_jis-imode", "x-sjis-emoji-docomo", NULL};
@@ -47,7 +46,7 @@ const mbfl_encoding mbfl_encoding_sjis_docomo = {
mbfl_no_encoding_sjis_docomo,
"SJIS-Mobile#DOCOMO",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_docomo_aliases,
+ mbfl_encoding_sjis_docomo_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_docomo_wchar,
@@ -58,7 +57,7 @@ const mbfl_encoding mbfl_encoding_sjis_kddi = {
mbfl_no_encoding_sjis_kddi,
"SJIS-Mobile#KDDI",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_kddi_aliases,
+ mbfl_encoding_sjis_kddi_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_kddi_wchar,
@@ -69,31 +68,13 @@ const mbfl_encoding mbfl_encoding_sjis_sb = {
mbfl_no_encoding_sjis_sb,
"SJIS-Mobile#SOFTBANK",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_sb_aliases,
+ mbfl_encoding_sjis_sb_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_sb_wchar,
&vtbl_wchar_sjis_sb
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis_docomo = {
- mbfl_no_encoding_sjis_docomo,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_sjis_kddi = {
- mbfl_no_encoding_sjis_kddi,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_sjis_sb = {
- mbfl_no_encoding_sjis_sb,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_docomo_wchar = {
mbfl_no_encoding_sjis_docomo,
mbfl_no_encoding_wchar,
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h
index 51b703da72..19e1920c6e 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.h
@@ -36,10 +36,6 @@ extern const mbfl_encoding mbfl_encoding_sjis_docomo;
extern const mbfl_encoding mbfl_encoding_sjis_kddi;
extern const mbfl_encoding mbfl_encoding_sjis_sb;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_docomo;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_kddi;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_sb;
-
extern const struct mbfl_convert_vtbl vtbl_sjis_docomo_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis_docomo;
extern const struct mbfl_convert_vtbl vtbl_sjis_kddi_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c
index 2535036e23..d37f01568e 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.c
@@ -33,8 +33,6 @@
#include "unicode_table_cp932_ext.h"
#include "unicode_table_jis.h"
-static int mbfl_filt_ident_sjis_open(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -60,19 +58,13 @@ const mbfl_encoding mbfl_encoding_sjis_open = {
mbfl_no_encoding_sjis_open,
"SJIS-win",
"Shift_JIS",
- (const char *(*)[])&mbfl_encoding_sjis_open_aliases,
+ mbfl_encoding_sjis_open_aliases,
mblen_table_sjis,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_sjis_open_wchar,
&vtbl_wchar_sjis_open
};
-const struct mbfl_identify_vtbl vtbl_identify_sjis_open = {
- mbfl_no_encoding_sjis_open,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_sjis_open
-};
-
const struct mbfl_convert_vtbl vtbl_sjis_open_wchar = {
mbfl_no_encoding_sjis_open,
mbfl_no_encoding_wchar,
@@ -323,23 +315,3 @@ mbfl_filt_conv_wchar_sjis_open(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_sjis_open(int c, mbfl_identify_filter *filter)
-{
- if (filter->status) { /* kanji second char */
- if (c < 0x40 || c > 0xfc || c == 0x7f) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- } else if (c >= 0 && c < 0x80) { /* latin ok */
- ;
- } else if (c > 0xa0 && c < 0xe0) { /* kana ok */
- ;
- } else if (c > 0x80 && c < 0xfd && c != 0xa0) { /* kanji first char */
- filter->status = 1;
- } else { /* bad */
- filter->flag = 1;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h
index 2c6c70373a..764fad7e17 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_open.h
@@ -34,7 +34,6 @@
extern const mbfl_encoding mbfl_encoding_sjis_open;
-extern const struct mbfl_identify_vtbl vtbl_identify_sjis_open;
extern const struct mbfl_convert_vtbl vtbl_sjis_open_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_sjis_open;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c
index 68172efbe6..c886654f61 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c
@@ -30,13 +30,22 @@
#include "mbfilter.h"
#include "mbfilter_ucs2.h"
+static int mbfl_filt_conv_ucs2_wchar_flush(mbfl_convert_filter *filter);
+
static const char *mbfl_encoding_ucs2_aliases[] = {"ISO-10646-UCS-2", "UCS2" , "UNICODE", NULL};
+/* This library historically had encodings called 'byte2be' and 'byte2le'
+ * which were almost identical to UCS-2, except that they would truncate
+ * Unicode codepoints higher than 0xFFFF quietly
+ * Maintain minimal support by aliasing to UCS-2 */
+static const char *mbfl_encoding_ucs2be_aliases[] = {"byte2be", NULL};
+static const char *mbfl_encoding_ucs2le_aliases[] = {"byte2le", NULL};
+
const mbfl_encoding mbfl_encoding_ucs2 = {
mbfl_no_encoding_ucs2,
"UCS-2",
"UCS-2",
- (const char *(*)[])&mbfl_encoding_ucs2_aliases,
+ mbfl_encoding_ucs2_aliases,
NULL,
MBFL_ENCTYPE_WCS2BE,
&vtbl_ucs2_wchar,
@@ -47,7 +56,7 @@ const mbfl_encoding mbfl_encoding_ucs2be = {
mbfl_no_encoding_ucs2be,
"UCS-2BE",
"UCS-2BE",
- NULL,
+ mbfl_encoding_ucs2be_aliases,
NULL,
MBFL_ENCTYPE_WCS2BE,
&vtbl_ucs2be_wchar,
@@ -58,7 +67,7 @@ const mbfl_encoding mbfl_encoding_ucs2le = {
mbfl_no_encoding_ucs2le,
"UCS-2LE",
"UCS-2LE",
- NULL,
+ mbfl_encoding_ucs2le_aliases,
NULL,
MBFL_ENCTYPE_WCS2LE,
&vtbl_ucs2le_wchar,
@@ -71,7 +80,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_ucs2_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_ucs2_wchar_flush,
NULL,
};
@@ -91,7 +100,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2be_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_ucs2be_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_ucs2_wchar_flush,
NULL,
};
@@ -111,7 +120,7 @@ const struct mbfl_convert_vtbl vtbl_ucs2le_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_ucs2le_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_ucs2_wchar_flush,
NULL,
};
@@ -127,113 +136,83 @@ const struct mbfl_convert_vtbl vtbl_wchar_ucs2le = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * UCS-2 => wchar
- */
int mbfl_filt_conv_ucs2_wchar(int c, mbfl_convert_filter *filter)
{
- int n, endian;
-
- endian = filter->status & 0xff00;
- switch (filter->status & 0xff) {
- case 0:
- if (endian) {
- n = c & 0xff;
- } else {
- n = (c & 0xff) << 8;
- }
- filter->cache = n;
- filter->status++;
- break;
- default:
- if (endian) {
- n = (c & 0xff) << 8;
+ if (filter->status == 0) {
+ filter->status = 1;
+ filter->cache = c & 0xFF;
+ } else {
+ filter->status = 0;
+ int n = (filter->cache << 8) | (c & 0xFF);
+ if (n == 0xFFFE) {
+ /* Found little-endian byte order mark */
+ filter->filter_function = mbfl_filt_conv_ucs2le_wchar;
} else {
- n = c & 0xff;
- }
- n |= filter->cache;
- if (n == 0xfffe) {
- if (endian) {
- filter->status = 0; /* big-endian */
- } else {
- filter->status = 0x100; /* little-endian */
+ filter->filter_function = mbfl_filt_conv_ucs2be_wchar;
+ if (n != 0xFEFF) {
+ CK((*filter->output_function)(n, filter->data));
}
- CK((*filter->output_function)(0xfeff, filter->data));
- } else {
- filter->status &= ~0xff;
- CK((*filter->output_function)(n, filter->data));
}
- break;
}
-
return c;
}
-/*
- * UCS-2BE => wchar
- */
int mbfl_filt_conv_ucs2be_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
if (filter->status == 0) {
filter->status = 1;
- n = (c & 0xff) << 8;
- filter->cache = n;
+ filter->cache = (c & 0xFF) << 8;
} else {
filter->status = 0;
- n = (c & 0xff) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
+ CK((*filter->output_function)((c & 0xFF) | filter->cache, filter->data));
}
return c;
}
-/*
- * wchar => UCS-2BE
- */
int mbfl_filt_conv_wchar_ucs2be(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UCS2MAX) {
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
- CK((*filter->output_function)(c & 0xff, filter->data));
+ CK((*filter->output_function)((c >> 8) & 0xFF, filter->data));
+ CK((*filter->output_function)(c & 0xFF, filter->data));
} else {
CK(mbfl_filt_conv_illegal_output(c, filter));
}
-
return c;
}
-/*
- * UCS-2LE => wchar
- */
int mbfl_filt_conv_ucs2le_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
if (filter->status == 0) {
filter->status = 1;
- n = c & 0xff;
- filter->cache = n;
+ filter->cache = c & 0xFF;
} else {
filter->status = 0;
- n = ((c & 0xff) << 8) | filter->cache;
- CK((*filter->output_function)(n, filter->data));
+ CK((*filter->output_function)(((c & 0xFF) << 8) | filter->cache, filter->data));
}
return c;
}
-
-/*
- * wchar => UCS-2LE
- */
int mbfl_filt_conv_wchar_ucs2le(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UCS2MAX) {
- CK((*filter->output_function)(c & 0xff, filter->data));
- CK((*filter->output_function)((c >> 8) & 0xff, filter->data));
+ CK((*filter->output_function)(c & 0xFF, filter->data));
+ CK((*filter->output_function)((c >> 8) & 0xFF, filter->data));
} else {
CK(mbfl_filt_conv_illegal_output(c, filter));
}
-
return c;
}
+
+static int mbfl_filt_conv_ucs2_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ /* Input string was truncated */
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c
index fcdd20d615..96ef6fbf6d 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c
@@ -32,11 +32,17 @@
static const char *mbfl_encoding_ucs4_aliases[] = {"ISO-10646-UCS-4", "UCS4", NULL};
+/* This library historically had encodings called 'byte4be' and 'byte4le'
+ * which were almost identical to UCS-4
+ * Maintain minimal support by aliasing to UCS-2 */
+static const char *mbfl_encoding_ucs4be_aliases[] = {"byte4be", NULL};
+static const char *mbfl_encoding_ucs4le_aliases[] = {"byte4le", NULL};
+
const mbfl_encoding mbfl_encoding_ucs4 = {
mbfl_no_encoding_ucs4,
"UCS-4",
"UCS-4",
- (const char *(*)[])&mbfl_encoding_ucs4_aliases,
+ mbfl_encoding_ucs4_aliases,
NULL,
MBFL_ENCTYPE_WCS4BE,
&vtbl_ucs4_wchar,
@@ -47,7 +53,7 @@ const mbfl_encoding mbfl_encoding_ucs4be = {
mbfl_no_encoding_ucs4be,
"UCS-4BE",
"UCS-4BE",
- NULL,
+ mbfl_encoding_ucs4be_aliases,
NULL,
MBFL_ENCTYPE_WCS4BE,
&vtbl_ucs4be_wchar,
@@ -58,7 +64,7 @@ const mbfl_encoding mbfl_encoding_ucs4le = {
mbfl_no_encoding_ucs4le,
"UCS-4LE",
"UCS-4LE",
- NULL,
+ mbfl_encoding_ucs4le_aliases,
NULL,
MBFL_ENCTYPE_WCS4LE,
&vtbl_ucs4le_wchar,
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c
index 5dc4aa81a9..a164fccbcd 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c
@@ -32,8 +32,6 @@
#define UNICODE_TABLE_UHC_DEF
#include "unicode_table_uhc.h"
-static int mbfl_filt_ident_uhc(int c, mbfl_identify_filter *filter);
-
static const unsigned char mblen_table_uhc[] = { /* 0x81-0xFE */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -59,19 +57,13 @@ const mbfl_encoding mbfl_encoding_uhc = {
mbfl_no_encoding_uhc,
"UHC",
"UHC",
- (const char *(*)[])&mbfl_encoding_uhc_aliases,
+ mbfl_encoding_uhc_aliases,
mblen_table_uhc,
MBFL_ENCTYPE_MBCS,
&vtbl_uhc_wchar,
&vtbl_wchar_uhc
};
-const struct mbfl_identify_vtbl vtbl_identify_uhc = {
- mbfl_no_encoding_uhc,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_uhc
-};
-
const struct mbfl_convert_vtbl vtbl_uhc_wchar = {
mbfl_no_encoding_uhc,
mbfl_no_encoding_wchar,
@@ -220,43 +212,3 @@ mbfl_filt_conv_wchar_uhc(int c, mbfl_convert_filter *filter)
return c;
}
-
-static int mbfl_filt_ident_uhc(int c, mbfl_identify_filter *filter)
-{
- switch (filter->status) {
- case 0: /* latin */
- if (c >= 0 && c < 0x80) { /* ok */
- ;
- } else if (c >= 0x81 && c <= 0xa0) { /* dbcs first char */
- filter->status= 1;
- } else if (c >= 0xa1 && c <= 0xc6) { /* dbcs first char */
- filter->status= 2;
- } else if (c >= 0xc7 && c <= 0xfe) { /* dbcs first char */
- filter->status= 3;
- } else { /* bad */
- filter->flag = 1;
- }
-
- case 1:
- case 2:
- if (c < 0x41 || (c > 0x5a && c < 0x61)
- || (c > 0x7a && c < 0x81) || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- case 3:
- if (c < 0xa1 || c > 0xfe) { /* bad */
- filter->flag = 1;
- }
- filter->status = 0;
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.h b/ext/mbstring/libmbfl/filters/mbfilter_uhc.h
index 6ed5486767..860d45eb86 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_uhc;
-extern const struct mbfl_identify_vtbl vtbl_identify_uhc;
extern const struct mbfl_convert_vtbl vtbl_uhc_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_uhc;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c
index 620e8a76f7..10063883f2 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c
@@ -30,13 +30,15 @@
#include "mbfilter.h"
#include "mbfilter_utf16.h"
+static int mbfl_filt_conv_utf16_wchar_flush(mbfl_convert_filter *filter);
+
static const char *mbfl_encoding_utf16_aliases[] = {"utf16", NULL};
const mbfl_encoding mbfl_encoding_utf16 = {
mbfl_no_encoding_utf16,
"UTF-16",
"UTF-16",
- (const char *(*)[])&mbfl_encoding_utf16_aliases,
+ mbfl_encoding_utf16_aliases,
NULL,
MBFL_ENCTYPE_MWC2BE,
&vtbl_utf16_wchar,
@@ -71,7 +73,7 @@ const struct mbfl_convert_vtbl vtbl_utf16_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf16_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf16_wchar_flush,
NULL,
};
@@ -91,7 +93,7 @@ const struct mbfl_convert_vtbl vtbl_utf16be_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf16be_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf16_wchar_flush,
NULL,
};
@@ -111,7 +113,7 @@ const struct mbfl_convert_vtbl vtbl_utf16le_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf16le_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf16_wchar_flush,
NULL,
};
@@ -127,111 +129,89 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf16le = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * UTF-16 => wchar
- */
int mbfl_filt_conv_utf16_wchar(int c, mbfl_convert_filter *filter)
{
- int n, endian;
-
- endian = filter->status & 0xff00;
- switch (filter->status & 0x0f) {
- case 0:
- if (endian) {
- n = c & 0xff;
- } else {
- n = (c & 0xff) << 8;
- }
- filter->cache |= n;
- filter->status++;
- break;
- default:
- if (endian) {
- n = (c & 0xff) << 8;
+ /* Start with the assumption that the string is big-endian;
+ * If we find a little-endian BOM, then we will change that assumption */
+ if (filter->status == 0) {
+ filter->cache = c & 0xFF;
+ filter->status = 1;
+ } else {
+ int n = (filter->cache << 8) | (c & 0xFF);
+ if (n == 0xFFFE) {
+ /* Switch to little-endian mode */
+ filter->filter_function = mbfl_filt_conv_utf16le_wchar;
+ filter->cache = filter->status = 0;
} else {
- n = c & 0xff;
- }
- n |= filter->cache & 0xffff;
- filter->status &= ~0x0f;
- if (n >= 0xd800 && n < 0xdc00) {
- filter->cache = ((n & 0x3ff) << 16) + 0x400000;
- } else if (n >= 0xdc00 && n < 0xe000) {
- n &= 0x3ff;
- n |= (filter->cache & 0xfff0000) >> 6;
- filter->cache = 0;
- if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) {
- CK((*filter->output_function)(n, filter->data));
- } else { /* illegal character */
- n &= MBFL_WCSGROUP_MASK;
- n |= MBFL_WCSGROUP_THROUGH;
+ filter->filter_function = mbfl_filt_conv_utf16be_wchar;
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ filter->cache = n & 0x3FF; /* Pick out 10 data bits */
+ filter->status = 2;
+ return c;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ /* This is wrong; second part of surrogate pair has come first */
+ CK((*filter->output_function)(n | MBFL_WCSGROUP_THROUGH, filter->data));
+ } else if (n != 0xFEFF) {
CK((*filter->output_function)(n, filter->data));
}
- } else {
- int is_first = filter->status & 0x10;
- filter->cache = 0;
- filter->status |= 0x10;
- if (!is_first) {
- if (n == 0xfffe) {
- if (endian) {
- filter->status &= ~0x100; /* big-endian */
- } else {
- filter->status |= 0x100; /* little-endian */
- }
- break;
- } else if (n == 0xfeff) {
- break;
- }
- }
- CK((*filter->output_function)(n, filter->data));
+ filter->cache = filter->status = 0;
}
- break;
}
return c;
}
-/*
- * UTF-16BE => wchar
- */
int mbfl_filt_conv_utf16be_wchar(int c, mbfl_convert_filter *filter)
{
int n;
switch (filter->status) {
- case 0:
+ case 0: /* First byte */
+ filter->cache = c & 0xFF;
filter->status = 1;
- n = (c & 0xff) << 8;
- filter->cache |= n;
break;
- default:
- filter->status = 0;
- n = (filter->cache & 0xff00) | (c & 0xff);
- if (n >= 0xd800 && n < 0xdc00) {
- filter->cache = ((n & 0x3ff) << 16) + 0x400000;
- } else if (n >= 0xdc00 && n < 0xe000) {
- n &= 0x3ff;
- n |= (filter->cache & 0xfff0000) >> 6;
- filter->cache = 0;
- if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) {
- CK((*filter->output_function)(n, filter->data));
- } else { /* illegal character */
- n &= MBFL_WCSGROUP_MASK;
- n |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+
+ case 1: /* Second byte */
+ n = (filter->cache << 8) | (c & 0xFF);
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ filter->cache = n & 0x3FF; /* Pick out 10 data bits */
+ filter->status = 2;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ /* This is wrong; second part of surrogate pair has come first */
+ CK((*filter->output_function)(n | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->status = 0;
} else {
- filter->cache = 0;
CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
}
break;
+
+ case 2: /* Second part of surrogate, first byte */
+ filter->cache = (filter->cache << 8) | (c & 0xFF);
+ filter->status = 3;
+ break;
+
+ case 3: /* Second part of surrogate, second byte */
+ n = ((filter->cache & 0xFF) << 8) | (c & 0xFF);
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ /* Wrong; that's the first half of a surrogate pair, not the second */
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 8) | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->cache = n & 0x3FF;
+ filter->status = 2;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ n = ((filter->cache & 0x3FF00) << 2) + (n & 0x3FF) + 0x10000;
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
+ } else {
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 8) | MBFL_WCSGROUP_THROUGH, filter->data));
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
+ }
}
return c;
}
-/*
- * wchar => UTF-16BE
- */
int mbfl_filt_conv_wchar_utf16be(int c, mbfl_convert_filter *filter)
{
int n;
@@ -253,38 +233,53 @@ int mbfl_filt_conv_wchar_utf16be(int c, mbfl_convert_filter *filter)
return c;
}
-/*
- * UTF-16LE => wchar
- */
int mbfl_filt_conv_utf16le_wchar(int c, mbfl_convert_filter *filter)
{
int n;
switch (filter->status) {
case 0:
+ filter->cache = c & 0xff;
filter->status = 1;
- n = c & 0xff;
- filter->cache |= n;
break;
- default:
- filter->status = 0;
- n = (filter->cache & 0xff) | ((c & 0xff) << 8);
- if (n >= 0xd800 && n < 0xdc00) {
- filter->cache = ((n & 0x3ff) << 16) + 0x400000;
- } else if (n >= 0xdc00 && n < 0xe000) {
- n &= 0x3ff;
- n |= (filter->cache & 0xfff0000) >> 6;
- filter->cache = 0;
- if (n >= MBFL_WCSPLANE_SUPMIN && n < MBFL_WCSPLANE_SUPMAX) {
- CK((*filter->output_function)(n, filter->data));
- } else { /* illegal character */
- n &= MBFL_WCSGROUP_MASK;
- n |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+
+ case 1:
+ if ((c & 0xfc) == 0xd8) {
+ /* Looks like we have a surrogate pair here */
+ filter->cache += ((c & 0x3) << 8);
+ filter->status = 2;
+ } else if ((c & 0xfc) == 0xdc) {
+ /* This is wrong; the second part of the surrogate pair has come first
+ * Flag it with `MBFL_WCSGROUP_THROUGH`; the following filter will handle
+ * the error */
+ n = (filter->cache + ((c & 0xff) << 8)) | MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
} else {
- filter->cache = 0;
+ CK((*filter->output_function)(filter->cache + ((c & 0xff) << 8), filter->data));
+ filter->status = 0;
+ }
+ break;
+
+ case 2:
+ filter->cache = (filter->cache << 10) + (c & 0xff);
+ filter->status = 3;
+ break;
+
+ case 3:
+ n = (filter->cache & 0xFF) | ((c & 0xFF) << 8);
+ if (n >= 0xD800 && n <= 0xDBFF) {
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 10) | MBFL_WCSGROUP_THROUGH, filter->data));
+ filter->cache = n & 0x3FF;
+ filter->status = 2;
+ } else if (n >= 0xDC00 && n <= 0xDFFF) {
+ n = filter->cache + ((c & 0x3) << 8) + 0x10000;
+ CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
+ } else {
+ CK((*filter->output_function)((0xD8 << 10) | (filter->cache >> 10) | MBFL_WCSGROUP_THROUGH, filter->data));
CK((*filter->output_function)(n, filter->data));
+ filter->status = 0;
}
break;
}
@@ -292,9 +287,6 @@ int mbfl_filt_conv_utf16le_wchar(int c, mbfl_convert_filter *filter)
return c;
}
-/*
- * wchar => UTF-16LE
- */
int mbfl_filt_conv_wchar_utf16le(int c, mbfl_convert_filter *filter)
{
int n;
@@ -315,3 +307,21 @@ int mbfl_filt_conv_wchar_utf16le(int c, mbfl_convert_filter *filter)
return c;
}
+
+static int mbfl_filt_conv_utf16_wchar_flush(mbfl_convert_filter *filter)
+{
+ int status = filter->status;
+ int cache = filter->cache;
+ filter->status = filter->cache = 0;
+
+ if (status) {
+ /* Input string was truncated */
+ CK((*filter->output_function)(cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.h b/ext/mbstring/libmbfl/filters/mbfilter_utf16.h
index 4aa88619c7..727c231b34 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.h
@@ -33,6 +33,7 @@
extern const mbfl_encoding mbfl_encoding_utf16;
extern const mbfl_encoding mbfl_encoding_utf16be;
extern const mbfl_encoding mbfl_encoding_utf16le;
+
extern const struct mbfl_convert_vtbl vtbl_utf16_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf16;
extern const struct mbfl_convert_vtbl vtbl_utf16be_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
index b936ab4102..a9a7903b5d 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
@@ -30,13 +30,15 @@
#include "mbfilter.h"
#include "mbfilter_utf32.h"
+static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter);
+
static const char *mbfl_encoding_utf32_aliases[] = {"utf32", NULL};
const mbfl_encoding mbfl_encoding_utf32 = {
mbfl_no_encoding_utf32,
"UTF-32",
"UTF-32",
- (const char *(*)[])&mbfl_encoding_utf32_aliases,
+ mbfl_encoding_utf32_aliases,
NULL,
MBFL_ENCTYPE_WCS4BE,
&vtbl_utf32_wchar,
@@ -71,7 +73,7 @@ const struct mbfl_convert_vtbl vtbl_utf32_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -91,7 +93,7 @@ const struct mbfl_convert_vtbl vtbl_utf32be_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32be_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -111,7 +113,7 @@ const struct mbfl_convert_vtbl vtbl_utf32le_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32le_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -127,106 +129,53 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf32le = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * UTF-32 => wchar
- */
-int mbfl_filt_conv_utf32_wchar(int c, mbfl_convert_filter *filter)
+static int emit_char_if_valid(int n, mbfl_convert_filter *filter)
{
- int n, endian;
+ if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xD800 || n > 0xDFFF)) {
+ CK((*filter->output_function)(n, filter->data));
+ } else {
+ n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(n, filter->data));
+ }
+ return 0;
+}
- endian = filter->status & 0xff00;
- switch (filter->status & 0xff) {
- case 0:
- if (endian) {
- n = c & 0xff;
- } else {
- n = (c & 0xffu) << 24;
- }
- filter->cache = n;
- filter->status++;
- break;
- case 1:
- if (endian) {
- n = (c & 0xff) << 8;
- } else {
- n = (c & 0xff) << 16;
- }
- filter->cache |= n;
- filter->status++;
- break;
- case 2:
- if (endian) {
- n = (c & 0xff) << 16;
- } else {
- n = (c & 0xff) << 8;
- }
- filter->cache |= n;
+int mbfl_filt_conv_utf32_wchar(int c, mbfl_convert_filter *filter)
+{
+ if (filter->status < 3) {
+ filter->cache = (filter->cache << 8) | (c & 0xFF);
filter->status++;
- break;
- default:
- if (endian) {
- n = (c & 0xffu) << 24;
- } else {
- n = c & 0xff;
- }
- n |= filter->cache;
- if ((n & 0xffff) == 0 && ((n >> 16) & 0xffff) == 0xfffe) {
- if (endian) {
- filter->status = 0; /* big-endian */
- } else {
- filter->status = 0x100; /* little-endian */
- }
- CK((*filter->output_function)(0xfeff, filter->data));
+ } else {
+ int n = ((unsigned int)filter->cache << 8) | (c & 0xFF);
+ filter->cache = filter->status = 0;
+
+ if (n == 0xFFFE0000) {
+ /* Found a little-endian byte order mark */
+ filter->filter_function = mbfl_filt_conv_utf32le_wchar;
} else {
- filter->status &= ~0xff;
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff)) {
- CK((*filter->output_function)(n, filter->data));
- } else {
- n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
+ filter->filter_function = mbfl_filt_conv_utf32be_wchar;
+ if (n != 0xFEFF) {
+ CK(emit_char_if_valid(n, filter));
}
}
- break;
}
return c;
}
-/*
- * UTF-32BE => wchar
- */
int mbfl_filt_conv_utf32be_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xffu) << 24;
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 16;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 8;
- filter->cache |= n;
+ if (filter->status < 3) {
+ filter->cache = (filter->cache << 8) | (c & 0xFF);
+ filter->status++;
} else {
- filter->status = 0;
- n = (c & 0xff) | filter->cache;
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff)) {
- CK((*filter->output_function)(n, filter->data));
- } else {
- n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+ int n = ((unsigned int)filter->cache << 8) | (c & 0xFF);
+ filter->cache = filter->status = 0;
+ CK(emit_char_if_valid(n, filter));
}
return c;
}
-/*
- * wchar => UTF-32BE
- */
int mbfl_filt_conv_wchar_utf32be(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UTF32MAX) {
@@ -241,41 +190,19 @@ int mbfl_filt_conv_wchar_utf32be(int c, mbfl_convert_filter *filter)
return c;
}
-/*
- * UTF-32LE => wchar
- */
int mbfl_filt_conv_utf32le_wchar(int c, mbfl_convert_filter *filter)
{
- int n;
-
- if (filter->status == 0) {
- filter->status = 1;
- n = (c & 0xff);
- filter->cache = n;
- } else if (filter->status == 1) {
- filter->status = 2;
- n = (c & 0xff) << 8;
- filter->cache |= n;
- } else if (filter->status == 2) {
- filter->status = 3;
- n = (c & 0xff) << 16;
- filter->cache |= n;
+ if (filter->status < 3) {
+ filter->cache |= ((c & 0xFFU) << (8 * filter->status));
+ filter->status++;
} else {
- filter->status = 0;
- n = ((c & 0xffu) << 24) | filter->cache;
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff)) {
- CK((*filter->output_function)(n, filter->data));
- } else {
- n = (n & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(n, filter->data));
- }
+ int n = ((c & 0xFFU) << 24) | filter->cache;
+ filter->cache = filter->status = 0;
+ CK(emit_char_if_valid(n, filter));
}
return c;
}
-/*
- * wchar => UTF-32LE
- */
int mbfl_filt_conv_wchar_utf32le(int c, mbfl_convert_filter *filter)
{
if (c >= 0 && c < MBFL_WCSPLANE_UTF32MAX) {
@@ -289,3 +216,17 @@ int mbfl_filt_conv_wchar_utf32le(int c, mbfl_convert_filter *filter)
return c;
}
+
+static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status) {
+ /* Input string was truncated */
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ return 0;
+}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.h b/ext/mbstring/libmbfl/filters/mbfilter_utf32.h
index 14b9fa4823..58c69d72f1 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.h
@@ -33,6 +33,7 @@
extern const mbfl_encoding mbfl_encoding_utf32;
extern const mbfl_encoding mbfl_encoding_utf32be;
extern const mbfl_encoding mbfl_encoding_utf32le;
+
extern const struct mbfl_convert_vtbl vtbl_utf32_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf32;
extern const struct mbfl_convert_vtbl vtbl_utf32be_wchar;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
index b54bcf2b9c..bda303ef6f 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c
@@ -30,8 +30,6 @@
#include "mbfilter.h"
#include "mbfilter_utf7.h"
-static int mbfl_filt_ident_utf7(int c, mbfl_identify_filter *filter);
-
static const unsigned char mbfl_base64_table[] = {
/* 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', */
0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
@@ -51,19 +49,13 @@ const mbfl_encoding mbfl_encoding_utf7 = {
mbfl_no_encoding_utf7,
"UTF-7",
"UTF-7",
- (const char *(*)[])&mbfl_encoding_utf7_aliases,
+ mbfl_encoding_utf7_aliases,
NULL,
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE,
&vtbl_utf7_wchar,
&vtbl_wchar_utf7
};
-const struct mbfl_identify_vtbl vtbl_identify_utf7 = {
- mbfl_no_encoding_utf7,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf7
-};
-
const struct mbfl_convert_vtbl vtbl_utf7_wchar = {
mbfl_no_encoding_utf7,
mbfl_no_encoding_wchar,
@@ -409,52 +401,3 @@ int mbfl_filt_conv_wchar_utf7_flush(mbfl_convert_filter *filter)
return 0;
}
-
-static int mbfl_filt_ident_utf7(int c, mbfl_identify_filter *filter)
-{
- int n;
-
- switch (filter->status) {
- /* directly encoded characters */
- case 0:
- if (c == 0x2b) { /* '+' shift character */
- filter->status++;
- } else if (c == 0x5c || c == 0x7e || c < 0 || c > 0x7f) { /* illegal character */
- filter->flag = 1; /* bad */
- }
- break;
-
- /* Modified Base64 */
- case 1:
- case 2:
- n = 0;
- if (c >= 0x41 && c <= 0x5a) { /* A - Z */
- n = 1;
- } else if (c >= 0x61 && c <= 0x7a) { /* a - z */
- n = 1;
- } else if (c >= 0x30 && c <= 0x39) { /* 0 - 9 */
- n = 1;
- } else if (c == 0x2b) { /* '+' */
- n = 1;
- } else if (c == 0x2f) { /* '/' */
- n = 1;
- }
- if (n <= 0) {
- if (filter->status == 1 && c != 0x2d) {
- filter->flag = 1; /* bad */
- } else if (c < 0 || c > 0x7f) {
- filter->flag = 1; /* bad */
- }
- filter->status = 0;
- } else {
- filter->status = 2;
- }
- break;
-
- default:
- filter->status = 0;
- break;
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.h b/ext/mbstring/libmbfl/filters/mbfilter_utf7.h
index 6223bdba97..119937eb41 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.h
@@ -33,7 +33,6 @@
#include "mbfilter.h"
extern const mbfl_encoding mbfl_encoding_utf7;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf7;
extern const struct mbfl_convert_vtbl vtbl_utf7_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf7;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
index c8fe70fc7f..4c1cd8712f 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c
@@ -27,14 +27,64 @@
*
*/
+/* Modified UTF-7 used for 'international mailbox names' in the IMAP protocol
+ * Also known as mUTF-7
+ * Defined in RFC 3501 5.1.3 (https://tools.ietf.org/html/rfc3501)
+ *
+ * Quoting from the RFC:
+ *
+ ***********************************************************************
+ * In modified UTF-7, printable US-ASCII characters, except for "&",
+ * represent themselves; that is, characters with octet values 0x20-0x25
+ * and 0x27-0x7e. The character "&" (0x26) is represented by the
+ * two-octet sequence "&-".
+ *
+ * All other characters (octet values 0x00-0x1f and 0x7f-0xff) are
+ * represented in modified BASE64, with a further modification from
+ * UTF-7 that "," is used instead of "/". Modified BASE64 MUST NOT be
+ * used to represent any printing US-ASCII character which can represent
+ * itself.
+ *
+ * "&" is used to shift to modified BASE64 and "-" to shift back to
+ * US-ASCII. There is no implicit shift from BASE64 to US-ASCII, and
+ * null shifts ("-&" while in BASE64; note that "&-" while in US-ASCII
+ * means "&") are not permitted. However, all names start in US-ASCII,
+ * and MUST end in US-ASCII; that is, a name that ends with a non-ASCII
+ * ISO-10646 character MUST end with a "-").
+ ***********************************************************************
+ *
+ * The purpose of all this is: 1) to keep all parts of IMAP messages 7-bit clean,
+ * 2) to avoid giving special treatment to +, /, \, and ~, since these are
+ * commonly used in mailbox names, and 3) to ensure there is only one
+ * representation of any mailbox name (vanilla UTF-7 does allow multiple
+ * representations of the same string, by Base64-encoding characters which
+ * could have been included as ASCII literals.)
+ *
+ * RFC 2152 also applies, since it defines vanilla UTF-7 (minus IMAP modifications)
+ * The following paragraph is notable:
+ *
+ ***********************************************************************
+ * Unicode is encoded using Modified Base64 by first converting Unicode
+ * 16-bit quantities to an octet stream (with the most significant octet first).
+ * Surrogate pairs (UTF-16) are converted by treating each half of the pair as
+ * a separate 16 bit quantity (i.e., no special treatment). Text with an odd
+ * number of octets is ill-formed. ISO 10646 characters outside the range
+ * addressable via surrogate pairs cannot be encoded.
+ ***********************************************************************
+ *
+ * So after reversing the modified Base64 encoding on an encoded section,
+ * the contents are interpreted as UTF-16BE. */
+
#include "mbfilter.h"
#include "mbfilter_utf7imap.h"
+static const char *mbfl_encoding_utf7imap_aliases[] = {"mUTF-7", NULL};
+
const mbfl_encoding mbfl_encoding_utf7imap = {
mbfl_no_encoding_utf7imap,
"UTF7-IMAP",
NULL,
- NULL,
+ mbfl_encoding_utf7imap_aliases,
NULL,
MBFL_ENCTYPE_MBCS,
&vtbl_utf7imap_wchar,
@@ -106,7 +156,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
case 0:
if (c == 0x26) { /* '&' shift character */
filter->status++;
- } else if (c >= 0 && c < 0x80) { /* ASCII */
+ } else if (c >= 0x20 && c <= 0x7E) { /* ASCII */
CK((*filter->output_function)(c, filter->data));
} else { /* illegal character */
s = c & MBFL_WCSGROUP_MASK;
@@ -145,7 +195,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
}
} else {
filter->cache = n;
- CK((*filter->output_function)(s, filter->data));
+ /* Characters which can be expressed as literal, ASCII characters
+ * should not be Base64-encoded */
+ if (s < 0x20 || s > 0x7E || s == '&') {
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ s &= MBFL_WCSGROUP_MASK;
+ s |= MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(s, filter->data));
+ }
}
break;
@@ -177,7 +235,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
}
} else {
filter->cache = n;
- CK((*filter->output_function)(s, filter->data));
+ /* Characters which can be expressed as literal, ASCII characters
+ * should not be Base64-encoded */
+ if (s < 0x20 || s > 0x7E || s == '&') {
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ s &= MBFL_WCSGROUP_MASK;
+ s |= MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(s, filter->data));
+ }
}
break;
@@ -204,7 +270,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
}
} else {
filter->cache = 0;
- CK((*filter->output_function)(s, filter->data));
+ /* Characters which can be expressed as literal, ASCII characters
+ * should not be Base64-encoded */
+ if (s < 0x20 || s > 0x7E || s == '&') {
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ s &= MBFL_WCSGROUP_MASK;
+ s |= MBFL_WCSGROUP_THROUGH;
+ CK((*filter->output_function)(s, filter->data));
+ }
}
break;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
index 9e97d5b069..0c73952558 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
@@ -30,8 +30,6 @@
#include "mbfilter.h"
#include "mbfilter_utf8.h"
-int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter);
-
const unsigned char mblen_table_utf8[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -57,19 +55,13 @@ const mbfl_encoding mbfl_encoding_utf8 = {
mbfl_no_encoding_utf8,
"UTF-8",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_aliases,
+ mbfl_encoding_utf8_aliases,
mblen_table_utf8,
MBFL_ENCTYPE_MBCS,
&vtbl_utf8_wchar,
&vtbl_wchar_utf8
};
-const struct mbfl_identify_vtbl vtbl_identify_utf8 = {
- mbfl_no_encoding_utf8,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
const struct mbfl_convert_vtbl vtbl_utf8_wchar = {
mbfl_no_encoding_utf8,
mbfl_no_encoding_wchar,
@@ -236,76 +228,3 @@ int mbfl_filt_conv_wchar_utf8(int c, mbfl_convert_filter *filter)
return c;
}
-
-int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter)
-{
- int c1;
-
- c1 = (filter->status >> 8) & 0xff;
- filter->status &= 0xff;
-
- if (c < 0x80) {
- if (c < 0) {
- filter->flag = 1; /* bad */
- } else if (filter->status) {
- filter->flag = 1; /* bad */
- }
- filter->status = 0;
- } else if (c < 0xc0) {
- switch (filter->status) {
- case 0x20: /* 3 byte code 2nd char */
- if ((c1 == 0x0 && c >= 0xa0) ||
- (c1 == 0xd && c < 0xa0) ||
- (c1 > 0x0 && c1 != 0xd)) {
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- break;
- case 0x30: /* 4 byte code 2nd char */
- if ((c1 == 0x0 && c >= 0x90) ||
- (c1 > 0x0 && c1 < 0x4) ||
- (c1 == 0x4 && c < 0x90)) {
- filter->status++;
- } else {
- filter->flag = 1; /* bad */
- filter->status = 0;
- }
- break;
- case 0x31: /* 4 byte code 3rd char */
- filter->status++;
- break;
- case 0x10: /* 2 byte code 2nd char */
- case 0x21: /* 3 byte code 3rd char */
- case 0x32: /* 4 byte code 4th char */
- filter->status = 0;
- break;
- default:
- filter->flag = 1; /* bad */
- filter->status = 0;
- break;
- }
- } else if (c < 0xc2) { /* 0xc0,0xc1 */
- filter->flag = 1; /* bad */
- filter->status = 0;
- } else {
- if (filter->status) {
- filter->flag = 1; /* bad */
- }
- filter->status = 0;
- if (c < 0xe0) { /* 2 byte code first char */
- filter->status = 0x10;
- } else if (c < 0xf0) { /* 3 byte code 1st char */
- filter->status = 0x20;
- filter->status |= (c & 0xf) << 8;
- } else if (c < 0xf5) { /* 4 byte code 1st char */
- filter->status = 0x30;
- filter->status |= (c & 0x7) << 8;
- } else {
- filter->flag = 1; /* bad */
- }
- }
-
- return c;
-}
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.h b/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
index b0c93ccd3d..24cb91ea5a 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
@@ -31,7 +31,6 @@
#define MBFL_MBFILTER_UTF8_H
extern const mbfl_encoding mbfl_encoding_utf8;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8;
extern const struct mbfl_convert_vtbl vtbl_utf8_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf8;
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
index ef8d4cc075..763ed90fab 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
@@ -32,7 +32,6 @@
#include "mbfilter_utf8_mobile.h"
#include "mbfilter_sjis_mobile.h"
-extern int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter);
extern int mbfl_filt_conv_utf8_wchar_flush(mbfl_convert_filter *filter);
extern const unsigned char mblen_table_utf8[];
@@ -46,7 +45,7 @@ const mbfl_encoding mbfl_encoding_utf8_docomo = {
mbfl_no_encoding_utf8_docomo,
"UTF-8-Mobile#DOCOMO",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_docomo_aliases,
+ mbfl_encoding_utf8_docomo_aliases,
mblen_table_utf8,
MBFL_ENCTYPE_MBCS,
&vtbl_utf8_docomo_wchar,
@@ -57,7 +56,7 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_a = {
mbfl_no_encoding_utf8_kddi_a,
"UTF-8-Mobile#KDDI-A",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_kddi_a_aliases,
+ mbfl_encoding_utf8_kddi_a_aliases,
mblen_table_utf8,
MBFL_ENCTYPE_MBCS,
&vtbl_utf8_kddi_a_wchar,
@@ -68,7 +67,7 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_b = {
mbfl_no_encoding_utf8_kddi_b,
"UTF-8-Mobile#KDDI-B",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_kddi_b_aliases,
+ mbfl_encoding_utf8_kddi_b_aliases,
mblen_table_utf8,
MBFL_ENCTYPE_MBCS,
&vtbl_utf8_kddi_b_wchar,
@@ -79,37 +78,13 @@ const mbfl_encoding mbfl_encoding_utf8_sb = {
mbfl_no_encoding_utf8_sb,
"UTF-8-Mobile#SOFTBANK",
"UTF-8",
- (const char *(*)[])&mbfl_encoding_utf8_sb_aliases,
+ mbfl_encoding_utf8_sb_aliases,
mblen_table_utf8,
MBFL_ENCTYPE_MBCS,
&vtbl_utf8_sb_wchar,
&vtbl_wchar_utf8_sb
};
-const struct mbfl_identify_vtbl vtbl_identify_utf8_docomo = {
- mbfl_no_encoding_utf8_docomo,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_a = {
- mbfl_no_encoding_utf8_kddi_a,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_b = {
- mbfl_no_encoding_utf8_kddi_b,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
-const struct mbfl_identify_vtbl vtbl_identify_utf8_sb = {
- mbfl_no_encoding_utf8_sb,
- mbfl_filt_ident_common_ctor,
- mbfl_filt_ident_utf8
-};
-
const struct mbfl_convert_vtbl vtbl_utf8_docomo_wchar = {
mbfl_no_encoding_utf8_docomo,
mbfl_no_encoding_wchar,
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h
index 74ac6e195e..116bc16299 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.h
@@ -35,11 +35,6 @@ extern const mbfl_encoding mbfl_encoding_utf8_kddi_a;
extern const mbfl_encoding mbfl_encoding_utf8_kddi_b;
extern const mbfl_encoding mbfl_encoding_utf8_sb;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_docomo;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_a;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_kddi_b;
-extern const struct mbfl_identify_vtbl vtbl_identify_utf8_sb;
-
extern const struct mbfl_convert_vtbl vtbl_utf8_docomo_wchar;
extern const struct mbfl_convert_vtbl vtbl_wchar_utf8_docomo;
extern const struct mbfl_convert_vtbl vtbl_utf8_kddi_a_wchar;
diff --git a/ext/mbstring/libmbfl/filters/unicode_prop.h b/ext/mbstring/libmbfl/filters/unicode_prop.h
index 6eaefbc2e3..1ecf42c556 100644
--- a/ext/mbstring/libmbfl/filters/unicode_prop.h
+++ b/ext/mbstring/libmbfl/filters/unicode_prop.h
@@ -19,148 +19,136 @@
* Suite 330, Boston, MA 02111-1307 USA
*
* The authors of this file: PHP3 Internationalization team
- *
- */
-
-/* character property table */
-#define MBFL_CHP_CTL 0x01
-#define MBFL_CHP_DIGIT 0x02
-#define MBFL_CHP_UALPHA 0x04
-#define MBFL_CHP_LALPHA 0x08
-#define MBFL_CHP_MMHQENC 0x10 /* must Q-encoding in MIME Header encoded-word */
-#define MBFL_CHP_MSPECIAL 0x20 /* RFC822 Special characters */
-
-/*
- * Unicode table
*/
-static const unsigned char mbfl_charprop_table[] = {
-/* NUL 0 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC,
-/* SCH 1 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SIX 2 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EIX 3 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EOT 4 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* ENQ 5 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* ACK 6 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* BEL 7 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* BS 8 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* HI 9 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* LF 10 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* VI 11 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* FF 12 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* CR 13 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SO 14 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SI 15 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SLE 16 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* CSI 17 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* DC2 18 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* DC3 19 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* DC4 20 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* NAK 21 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SYN 22 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EIB 23 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* CAN 24 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* EM 25 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SLB 26 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* ESC 27 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* FS 28 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* GS 29 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* RS 30 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* US 31 */ MBFL_CHP_CTL | MBFL_CHP_MMHQENC ,
-/* SP 32 */ MBFL_CHP_MMHQENC ,
-/* ! 33 */ 0 ,
-/* " 34 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* # 35 */ MBFL_CHP_MMHQENC ,
-/* $ 36 */ MBFL_CHP_MMHQENC ,
-/* % 37 */ MBFL_CHP_MMHQENC ,
-/* & 38 */ MBFL_CHP_MMHQENC ,
-/* ' 39 */ MBFL_CHP_MMHQENC ,
-/* ( 40 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ) 41 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* * 42 */ 0 ,
-/* + 43 */ 0 ,
-/* , 44 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* - 45 */ 0 ,
-/* . 46 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* / 47 */ 0 ,
-/* 0 48 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 1 49 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 2 50 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 3 51 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 4 52 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 5 53 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 6 54 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 7 55 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 8 56 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* 9 57 */ MBFL_CHP_DIGIT | MBFL_CHP_MMHQENC ,
-/* : 58 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ; 59 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* < 60 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* = 61 */ 0 ,
-/* > 62 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ? 63 */ MBFL_CHP_MMHQENC ,
-/* @ 64 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* A 65 */ MBFL_CHP_UALPHA ,
-/* B 66 */ MBFL_CHP_UALPHA ,
-/* C 67 */ MBFL_CHP_UALPHA ,
-/* D 68 */ MBFL_CHP_UALPHA ,
-/* E 69 */ MBFL_CHP_UALPHA ,
-/* F 70 */ MBFL_CHP_UALPHA ,
-/* G 71 */ MBFL_CHP_UALPHA ,
-/* H 72 */ MBFL_CHP_UALPHA ,
-/* I 73 */ MBFL_CHP_UALPHA ,
-/* J 74 */ MBFL_CHP_UALPHA ,
-/* K 75 */ MBFL_CHP_UALPHA ,
-/* L 76 */ MBFL_CHP_UALPHA ,
-/* M 77 */ MBFL_CHP_UALPHA ,
-/* N 78 */ MBFL_CHP_UALPHA ,
-/* O 79 */ MBFL_CHP_UALPHA ,
-/* P 80 */ MBFL_CHP_UALPHA ,
-/* Q 81 */ MBFL_CHP_UALPHA ,
-/* R 82 */ MBFL_CHP_UALPHA ,
-/* S 83 */ MBFL_CHP_UALPHA ,
-/* T 84 */ MBFL_CHP_UALPHA ,
-/* U 85 */ MBFL_CHP_UALPHA ,
-/* V 86 */ MBFL_CHP_UALPHA ,
-/* W 87 */ MBFL_CHP_UALPHA ,
-/* X 88 */ MBFL_CHP_UALPHA ,
-/* Y 89 */ MBFL_CHP_UALPHA ,
-/* Z 90 */ MBFL_CHP_UALPHA ,
-/* [ 91 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* \ 92 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ] 93 */ MBFL_CHP_MMHQENC | MBFL_CHP_MSPECIAL ,
-/* ^ 94 */ MBFL_CHP_MMHQENC ,
-/* _ 95 */ MBFL_CHP_MMHQENC ,
-/* ` 96 */ MBFL_CHP_MMHQENC ,
-/* a 97 */ MBFL_CHP_LALPHA ,
-/* b 98 */ MBFL_CHP_LALPHA ,
-/* c 99 */ MBFL_CHP_LALPHA ,
-/* d 100 */ MBFL_CHP_LALPHA ,
-/* e 101 */ MBFL_CHP_LALPHA ,
-/* f 102 */ MBFL_CHP_LALPHA ,
-/* g 103 */ MBFL_CHP_LALPHA ,
-/* h 104 */ MBFL_CHP_LALPHA ,
-/* i 105 */ MBFL_CHP_LALPHA ,
-/* j 106 */ MBFL_CHP_LALPHA ,
-/* k 107 */ MBFL_CHP_LALPHA ,
-/* l 108 */ MBFL_CHP_LALPHA ,
-/* m 109 */ MBFL_CHP_LALPHA ,
-/* n 110 */ MBFL_CHP_LALPHA ,
-/* o 111 */ MBFL_CHP_LALPHA ,
-/* p 112 */ MBFL_CHP_LALPHA ,
-/* q 113 */ MBFL_CHP_LALPHA ,
-/* r 114 */ MBFL_CHP_LALPHA ,
-/* s 115 */ MBFL_CHP_LALPHA ,
-/* t 116 */ MBFL_CHP_LALPHA ,
-/* u 117 */ MBFL_CHP_LALPHA ,
-/* v 118 */ MBFL_CHP_LALPHA ,
-/* w 119 */ MBFL_CHP_LALPHA ,
-/* x 120 */ MBFL_CHP_LALPHA ,
-/* y 121 */ MBFL_CHP_LALPHA ,
-/* z 122 */ MBFL_CHP_LALPHA ,
-/* { 123 */ MBFL_CHP_MMHQENC ,
-/* | 124 */ MBFL_CHP_MMHQENC ,
-/* } 125 */ MBFL_CHP_MMHQENC ,
-/* ~ 126 */ MBFL_CHP_MMHQENC ,
-/* DEL 127 */ MBFL_CHP_MMHQENC
+/* Should we use QPrint-encoding in MIME Header encoded-word? */
+static const unsigned char mime_char_needs_qencode[] = {
+/* NUL 0 */ 1,
+/* SCH 1 */ 1,
+/* SIX 2 */ 1,
+/* EIX 3 */ 1,
+/* EOT 4 */ 1,
+/* ENQ 5 */ 1,
+/* ACK 6 */ 1,
+/* BEL 7 */ 1,
+/* BS 8 */ 1,
+/* HI 9 */ 1,
+/* LF 10 */ 1,
+/* VI 11 */ 1,
+/* FF 12 */ 1,
+/* CR 13 */ 1,
+/* SO 14 */ 1,
+/* SI 15 */ 1,
+/* SLE 16 */ 1,
+/* CSI 17 */ 1,
+/* DC2 18 */ 1,
+/* DC3 19 */ 1,
+/* DC4 20 */ 1,
+/* NAK 21 */ 1,
+/* SYN 22 */ 1,
+/* EIB 23 */ 1,
+/* CAN 24 */ 1,
+/* EM 25 */ 1,
+/* SLB 26 */ 1,
+/* ESC 27 */ 1,
+/* FS 28 */ 1,
+/* GS 29 */ 1,
+/* RS 30 */ 1,
+/* US 31 */ 1,
+/* SP 32 */ 1,
+/* ! 33 */ 0,
+/* " 34 */ 1,
+/* # 35 */ 1,
+/* $ 36 */ 1,
+/* % 37 */ 1,
+/* & 38 */ 1,
+/* ' 39 */ 1,
+/* ( 40 */ 1,
+/* ) 41 */ 1,
+/* * 42 */ 0,
+/* + 43 */ 0,
+/* , 44 */ 1,
+/* - 45 */ 0,
+/* . 46 */ 1,
+/* / 47 */ 0,
+/* 0 48 */ 1,
+/* 1 49 */ 1,
+/* 2 50 */ 1,
+/* 3 51 */ 1,
+/* 4 52 */ 1,
+/* 5 53 */ 1,
+/* 6 54 */ 1,
+/* 7 55 */ 1,
+/* 8 56 */ 1,
+/* 9 57 */ 1,
+/* : 58 */ 1,
+/* ; 59 */ 1,
+/* < 60 */ 1,
+/* = 61 */ 0,
+/* > 62 */ 1,
+/* ? 63 */ 1,
+/* @ 64 */ 1,
+/* A 65 */ 0,
+/* B 66 */ 0,
+/* C 67 */ 0,
+/* D 68 */ 0,
+/* E 69 */ 0,
+/* F 70 */ 0,
+/* G 71 */ 0,
+/* H 72 */ 0,
+/* I 73 */ 0,
+/* J 74 */ 0,
+/* K 75 */ 0,
+/* L 76 */ 0,
+/* M 77 */ 0,
+/* N 78 */ 0,
+/* O 79 */ 0,
+/* P 80 */ 0,
+/* Q 81 */ 0,
+/* R 82 */ 0,
+/* S 83 */ 0,
+/* T 84 */ 0,
+/* U 85 */ 0,
+/* V 86 */ 0,
+/* W 87 */ 0,
+/* X 88 */ 0,
+/* Y 89 */ 0,
+/* Z 90 */ 0,
+/* [ 91 */ 1,
+/* \ 92 */ 1,
+/* ] 93 */ 1,
+/* ^ 94 */ 1,
+/* _ 95 */ 1,
+/* ` 96 */ 1,
+/* a 97 */ 0,
+/* b 98 */ 0,
+/* c 99 */ 0,
+/* d 100 */ 0,
+/* e 101 */ 0,
+/* f 102 */ 0,
+/* g 103 */ 0,
+/* h 104 */ 0,
+/* i 105 */ 0,
+/* j 106 */ 0,
+/* k 107 */ 0,
+/* l 108 */ 0,
+/* m 109 */ 0,
+/* n 110 */ 0,
+/* o 111 */ 0,
+/* p 112 */ 0,
+/* q 113 */ 0,
+/* r 114 */ 0,
+/* s 115 */ 0,
+/* t 116 */ 0,
+/* u 117 */ 0,
+/* v 118 */ 0,
+/* w 119 */ 0,
+/* x 120 */ 0,
+/* y 121 */ 0,
+/* z 122 */ 0,
+/* { 123 */ 1,
+/* | 124 */ 1,
+/* } 125 */ 1,
+/* ~ 126 */ 1,
+/* DEL 127 */ 1
};
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_armscii8.h b/ext/mbstring/libmbfl/filters/unicode_table_armscii8.h
deleted file mode 100644
index abf89867ea..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_armscii8.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file: Hayk Chamyan <hamshen@gmail.com>
- *
- */
-
-#ifndef UNICODE_TABLE_ARMSCII8_H
-#define UNICODE_TABLE_ARMSCII8_H
-
-/* ArmSCII-8 to Unicode table */
-static const unsigned short armscii8_ucs_table[] = {
-/*0x00a0, 0x00a1, 0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab,*/
-0x00a0, 0xfffd, 0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab,
-0x2014, 0x002e, 0x055d, 0x002c, 0x002d, 0x058a, 0x2026, 0x055c,
-0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563,
-0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567,
-0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b,
-0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f,
-0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573,
-0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577,
-0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b,
-0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f,
-0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583,
-/*0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055a, 0x00ff*/
-0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055a, 0xfffd
-};
-
-static const unsigned char ucs_armscii8_table[] = {
-0xa5, 0xa4, 0x2a, 0x2b, 0xab, 0xac, 0xa9, 0x2f
-};
-
-static const int armscii8_ucs_table_min = 0xa0;
-static const int armscii8_ucs_table_len = (sizeof (armscii8_ucs_table) / sizeof (unsigned short));
-static const int armscii8_ucs_table_max = 0xa0 + (sizeof (armscii8_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_ARMSCII8_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp1251.h b/ext/mbstring/libmbfl/filters/unicode_table_cp1251.h
deleted file mode 100644
index f504713805..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp1251.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The authors of this file: PHP3 internationalization team
- * You can contact the primary author 金本 茂 <sgk@happysize.co.jp>.
- *
- */
-
-#ifndef UNICODE_TABLE_CP1251_H
-
-/* cp1251 to Unicode table */
-static const unsigned short cp1251_ucs_table[] = {
- 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021,
- 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f,
- 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
- 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f,
- 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7,
- 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
- 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7,
- 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f
-};
-static const int cp1251_ucs_table_min = 0x80;
-static const int cp1251_ucs_table_len = (sizeof (cp1251_ucs_table) / sizeof (unsigned short));
-static const int cp1251_ucs_table_max = 0x80 + (sizeof (cp1251_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP1251_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h b/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h
index 92d20893cd..9eb813885b 100644
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h
+++ b/ext/mbstring/libmbfl/filters/unicode_table_cp1252.h
@@ -32,9 +32,9 @@
* as it only covers this range, while the rest cover 0xa0 onwards */
static const unsigned short cp1252_ucs_table[] = {
- 0x20ac,0xfffd,0x201a,0x0192,0x201e,0x2026,0x2020,0x2021,
- 0x02c6,0x2030,0x0160,0x2039,0x0152,0xfffd,0x017d,0xfffd,
- 0xfffd,0x2018,0x2019,0x201c,0x201d,0x2022,0x2013,0x2014,
- 0x02dc,0x2122,0x0161,0x203a,0x0153,0xfffd,0x017e,0x0178
+ 0x20ac,0x0000,0x201a,0x0192,0x201e,0x2026,0x2020,0x2021,
+ 0x02c6,0x2030,0x0160,0x2039,0x0152,0x0000,0x017d,0x0000,
+ 0x0000,0x2018,0x2019,0x201c,0x201d,0x2022,0x2013,0x2014,
+ 0x02dc,0x2122,0x0161,0x203a,0x0153,0x0000,0x017e,0x0178
};
#endif /* UNICODE_TABLE_CP1252_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp1254.h b/ext/mbstring/libmbfl/filters/unicode_table_cp1254.h
deleted file mode 100644
index 7a9c4424ad..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp1254.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The authors of this file: PHP3 internationalization team
- * You can contact the primary author 金本 茂 <sgk@happysize.co.jp>.
- *
- */
-
-#ifndef UNICODE_TABLE_CP1254_H
-
-/* cp1254 to Unicode table */
-static const unsigned short cp1254_ucs_table[] = {
- 0x20ac, 0xfffe, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
- 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffe, 0xfffe, 0xfffe,
- 0xfffe, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
- 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffe, 0xfffe, 0x0178,
- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
- 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff
-};
-static const int cp1254_ucs_table_min = 0x80;
-static const int cp1254_ucs_table_len = (sizeof (cp1254_ucs_table) / sizeof (unsigned short));
-static const int cp1254_ucs_table_max = 0x80 + (sizeof (cp1254_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP1254_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp850.h b/ext/mbstring/libmbfl/filters/unicode_table_cp850.h
deleted file mode 100644
index 57fb61dbc9..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp850.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Den V. Tsopa <tdv@edisoft.ru>
- * Adaption for CP850: D. Giffeler <dg@artegic.de>
- *
- */
-
-#ifndef UNICODE_TABLE_CP850_H
-#define UNICODE_TABLE_CP850_H
-
-/* cp850_DOS to Unicode table */
-static const unsigned short cp850_ucs_table[] = {
- 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7
-, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5
-, 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9
-, 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192
-, 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba
-, 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb
-, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0
-, 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510
-, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3
-, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4
-, 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce
-, 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580
-, 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe
-, 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4
-, 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8
-, 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0
-};
-static const int cp850_ucs_table_min = 0x80;
-static const int cp850_ucs_table_len = (sizeof (cp850_ucs_table) / sizeof (unsigned short));
-static const int cp850_ucs_table_max = 0x80 + (sizeof (cp850_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP850_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_cp866.h b/ext/mbstring/libmbfl/filters/unicode_table_cp866.h
deleted file mode 100644
index 468e1a77c2..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_cp866.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The original author of this file: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-
-#ifndef UNICODE_TABLE_CP866_H
-#define UNICODE_TABLE_CP866_H
-
-/* cp866_DOSCyrillicRussian to Unicode table */
-static const unsigned short cp866_ucs_table[] = {
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
- 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
- 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
- 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
- 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
- 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
- 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
- 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e,
- 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0
-};
-static const int cp866_ucs_table_min = 0x80;
-static const int cp866_ucs_table_len = (sizeof (cp866_ucs_table) / sizeof (unsigned short));
-static const int cp866_ucs_table_max = 0x80 + (sizeof (cp866_ucs_table) / sizeof (unsigned short));
-
-#endif /* UNICODE_TABLE_CP866_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h
deleted file mode 100644
index 2b6b78f32b..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_10.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_10_H
-static const int iso8859_10_ucs_table[] = {
- 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7,
- 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
- 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7,
- 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
- 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
- 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
- 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168,
- 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
- 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
- 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
- 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169,
- 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138
-};
-#endif /* UNICODE_TABLE_ISO8859_10_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h
deleted file mode 100644
index 5822396525..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_13.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_13_H
-static const int iso8859_13_ucs_table[] = {
- 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7,
- 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7,
- 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
- 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112,
- 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
- 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7,
- 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
- 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113,
- 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
- 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7,
- 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019
-};
-#endif /* UNICODE_TABLE_ISO8859_13_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h
deleted file mode 100644
index 6bd03b367a..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_14.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_14_H
-static const int iso8859_14_ucs_table[] = {
- 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7,
- 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
- 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56,
- 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff
-};
-#endif /* UNICODE_TABLE_ISO8859_14_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h
deleted file mode 100644
index 029a2bcfc4..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_15.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_15_H
-static const int iso8859_15_ucs_table[] = {
- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7,
- 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7,
- 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
-};
-#endif /* UNICODE_TABLE_ISO8859_15_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h
deleted file mode 100644
index 555472d0dc..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_16.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLEISO8859_16_H
-static const int iso8859_16_ucs_table[] = {
- 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
- 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
- 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
- 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
- 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
- 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
- 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff
-};
-#endif /* UNICODE_TABLEISO8859_16_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h
deleted file mode 100644
index 12bb3cb2dc..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_2.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_2_H
-static const int iso8859_2_ucs_table[] = {
- 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
- 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
- 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
- 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
- 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
- 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
- 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
- 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
- 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
- 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
- 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
- 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9
-};
-#endif /* UNICODE_TABLE_ISO8859_2_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h
deleted file mode 100644
index f50c348aff..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_3.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_3_H
-static const int iso8859_3_ucs_table[] = {
- 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7,
- 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b,
- 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7,
- 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c,
- 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7,
- 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7,
- 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9
-};
-#endif /* UNICODE_TABLE_ISO8859_3_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h
deleted file mode 100644
index ff7ecdb4c0..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_4.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_4_H
-static const int iso8859_4_ucs_table[] = {
- 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7,
- 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
- 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7,
- 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
- 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
- 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
- 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
- 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
- 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
- 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9
-};
-#endif /* UNICODE_TABLE_ISO8859_4_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h
deleted file mode 100644
index 411ab84b60..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_5.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_5_H
-static const int iso8859_5_ucs_table[] = {
- 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
- 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
- 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
- 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f
-};
-#endif /* UNICODE_TABLE_ISO8859_5_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h
deleted file mode 100644
index 0b3952e3a0..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_6.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_6_H
-static const int iso8859_6_ucs_table[] = {
- 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f,
- 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
- 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
- 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
- 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
- 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-#endif /* UNICODE_TABLE_ISO8859_6_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h
deleted file mode 100644
index 687f4cbc74..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_7.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_7_H
-static const int iso8859_7_ucs_table[] = {
- 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7,
- 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
- 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
- 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
- 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
- 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
- 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
- 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
- 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000
-};
-#endif /* UNICODE_TABLE_ISO8859_7_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h
deleted file mode 100644
index 4ec6490bae..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_8.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_8_H
-static const int iso8859_8_ucs_table[] = {
- 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
- 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
- 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
- 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
- 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
- 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000
-};
-#endif /* UNICODE_TABLE_ISO8859_8_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h b/ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h
deleted file mode 100644
index 12f988ad7a..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_iso8859_9.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This file is automatically generated. Do not edit! */
-#ifndef UNICODE_TABLE_ISO8859_9_H
-static const int iso8859_9_ucs_table[] = {
- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
- 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
- 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff
-};
-#endif /* UNICODE_TABLE_ISO8859_9_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_koi8r.h b/ext/mbstring/libmbfl/filters/unicode_table_koi8r.h
deleted file mode 100644
index fc850e5685..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_koi8r.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The original author of this file: Den V. Tsopa <tdv@edisoft.ru>
- *
- */
-
-#ifndef UNICODE_TABLE_KOI8R_H
-#define UNICODE_TABLE_KOI8R_H
-
-/* KOI8-R (RFC1489) to Unicode */
-static const unsigned short koi8r_ucs_table[] = {
- 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524,
- 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590,
- 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248,
- 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7,
- 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
- 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e,
- 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
- 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9,
- 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
- 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
- 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
- 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
- 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
- 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
- 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
- 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a
-};
-static const int koi8r_ucs_table_min = 0x80;
-static const int koi8r_ucs_table_len = (sizeof (koi8r_ucs_table) / sizeof (unsigned short));
-static const int koi8r_ucs_table_max = 0x80 + (sizeof (koi8r_ucs_table) / sizeof (unsigned short));
-
-
-
-#endif /* UNNICODE_TABLE_KOI8R_H */
diff --git a/ext/mbstring/libmbfl/filters/unicode_table_koi8u.h b/ext/mbstring/libmbfl/filters/unicode_table_koi8u.h
deleted file mode 100644
index e59c685fe8..0000000000
--- a/ext/mbstring/libmbfl/filters/unicode_table_koi8u.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this part: Maksym Veremeyenko <verem@m1.tv>
- *
- */
-
-#ifndef UNICODE_TABLE_KOI8U_H
-#define UNICODE_TABLE_KOI8U_H
-
-/* KOI8-U (RFC2319) to Unicode */
-static const unsigned short koi8u_ucs_table[] = {
- 0x2500, /* BOX DRAWINGS LIGHT HORIZONTAL */
- 0x2502, /* BOX DRAWINGS LIGHT VERTICAL */
- 0x250C, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
- 0x2510, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
- 0x2514, /* BOX DRAWINGS LIGHT UP AND RIGHT */
- 0x2518, /* BOX DRAWINGS LIGHT UP AND LEFT */
- 0x251C, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
- 0x2524, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
- 0x252C, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
- 0x2534, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
- 0x253C, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
- 0x2580, /* UPPER HALF BLOCK */
- 0x2584, /* LOWER HALF BLOCK */
- 0x2588, /* FULL BLOCK */
- 0x258C, /* LEFT HALF BLOCK */
- 0x2590, /* RIGHT HALF BLOCK */
- 0x2591, /* LIGHT SHADE */
- 0x2592, /* MEDIUM SHADE */
- 0x2593, /* DARK SHADE */
- 0x2320, /* TOP HALF INTEGRAL */
- 0x25A0, /* BLACK SQUARE */
- 0x2219, /* BULLET OPERATOR */
- 0x221A, /* SQUARE ROOT */
- 0x2248, /* ALMOST EQUAL TO */
- 0x2264, /* LESS THAN OR EQUAL TO */
- 0x2265, /* GREATER THAN OR EQUAL TO */
- 0x00A0, /* NO-BREAK SPACE */
- 0x2321, /* BOTTOM HALF INTEGRAL */
- 0x00B0, /* DEGREE SIGN */
- 0x00B2, /* SUPERSCRIPT TWO */
- 0x00B7, /* MIDDLE DOT */
- 0x00F7, /* DIVISION SIGN */
- 0x2550, /* BOX DRAWINGS DOUBLE HORIZONTAL */
- 0x2551, /* BOX DRAWINGS DOUBLE VERTICAL */
- 0x2552, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */
- 0x0451, /* CYRILLIC SMALL LETTER IO */
- 0x0454, /* CYRILLIC SMALL LETTER UKRAINIAN IE */
- 0x2554, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */
- 0x0456, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
- 0x0457, /* CYRILLIC SMALL LETTER YI (UKRAINIAN) */
- 0x2557, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */
- 0x2558, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */
- 0x2559, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */
- 0x255A, /* BOX DRAWINGS DOUBLE UP AND RIGHT */
- 0x255B, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */
- 0x0491, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */
- 0x255D, /* BOX DRAWINGS DOUBLE UP AND LEFT */
- 0x255E, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */
- 0x255F, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */
- 0x2560, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */
- 0x2561, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */
- 0x0401, /* CYRILLIC CAPITAL LETTER IO */
- 0x0404, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
- 0x2563, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */
- 0x0406, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
- 0x0407, /* CYRILLIC CAPITAL LETTER YI (UKRAINIAN) */
- 0x2566, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */
- 0x2567, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */
- 0x2568, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */
- 0x2569, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */
- 0x256A, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */
- 0x0490, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
- 0x256C, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */
- 0x00A9, /* COPYRIGHT SIGN */
- 0x044E, /* CYRILLIC SMALL LETTER YU */
- 0x0430, /* CYRILLIC SMALL LETTER A */
- 0x0431, /* CYRILLIC SMALL LETTER BE */
- 0x0446, /* CYRILLIC SMALL LETTER TSE */
- 0x0434, /* CYRILLIC SMALL LETTER DE */
- 0x0435, /* CYRILLIC SMALL LETTER IE */
- 0x0444, /* CYRILLIC SMALL LETTER EF */
- 0x0433, /* CYRILLIC SMALL LETTER GHE */
- 0x0445, /* CYRILLIC SMALL LETTER KHA */
- 0x0438, /* CYRILLIC SMALL LETTER I */
- 0x0439, /* CYRILLIC SMALL LETTER SHORT I */
- 0x043A, /* CYRILLIC SMALL LETTER KA */
- 0x043B, /* CYRILLIC SMALL LETTER EL */
- 0x043C, /* CYRILLIC SMALL LETTER EM */
- 0x043D, /* CYRILLIC SMALL LETTER EN */
- 0x043E, /* CYRILLIC SMALL LETTER O */
- 0x043F, /* CYRILLIC SMALL LETTER PE */
- 0x044F, /* CYRILLIC SMALL LETTER YA */
- 0x0440, /* CYRILLIC SMALL LETTER ER */
- 0x0441, /* CYRILLIC SMALL LETTER ES */
- 0x0442, /* CYRILLIC SMALL LETTER TE */
- 0x0443, /* CYRILLIC SMALL LETTER U */
- 0x0436, /* CYRILLIC SMALL LETTER ZHE */
- 0x0432, /* CYRILLIC SMALL LETTER VE */
- 0x044C, /* CYRILLIC SMALL LETTER SOFT SIGN */
- 0x044B, /* CYRILLIC SMALL LETTER YERU */
- 0x0437, /* CYRILLIC SMALL LETTER ZE */
- 0x0448, /* CYRILLIC SMALL LETTER SHA */
- 0x044D, /* CYRILLIC SMALL LETTER E */
- 0x0449, /* CYRILLIC SMALL LETTER SHCHA */
- 0x0447, /* CYRILLIC SMALL LETTER CHE */
- 0x044A, /* CYRILLIC SMALL LETTER HARD SIGN */
- 0x042E, /* CYRILLIC CAPITAL LETTER YU */
- 0x0410, /* CYRILLIC CAPITAL LETTER A */
- 0x0411, /* CYRILLIC CAPITAL LETTER BE */
- 0x0426, /* CYRILLIC CAPITAL LETTER TSE */
- 0x0414, /* CYRILLIC CAPITAL LETTER DE */
- 0x0415, /* CYRILLIC CAPITAL LETTER IE */
- 0x0424, /* CYRILLIC CAPITAL LETTER EF */
- 0x0413, /* CYRILLIC CAPITAL LETTER GHE */
- 0x0425, /* CYRILLIC CAPITAL LETTER KHA */
- 0x0418, /* CYRILLIC CAPITAL LETTER I */
- 0x0419, /* CYRILLIC CAPITAL LETTER SHORT I */
- 0x041A, /* CYRILLIC CAPITAL LETTER KA */
- 0x041B, /* CYRILLIC CAPITAL LETTER EL */
- 0x041C, /* CYRILLIC CAPITAL LETTER EM */
- 0x041D, /* CYRILLIC CAPITAL LETTER EN */
- 0x041E, /* CYRILLIC CAPITAL LETTER O */
- 0x041F, /* CYRILLIC CAPITAL LETTER PE */
- 0x042F, /* CYRILLIC CAPITAL LETTER YA */
- 0x0420, /* CYRILLIC CAPITAL LETTER ER */
- 0x0421, /* CYRILLIC CAPITAL LETTER ES */
- 0x0422, /* CYRILLIC CAPITAL LETTER TE */
- 0x0423, /* CYRILLIC CAPITAL LETTER U */
- 0x0416, /* CYRILLIC CAPITAL LETTER ZHE */
- 0x0412, /* CYRILLIC CAPITAL LETTER VE */
- 0x042C, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
- 0x042B, /* CYRILLIC CAPITAL LETTER YERU */
- 0x0417, /* CYRILLIC CAPITAL LETTER ZE */
- 0x0428, /* CYRILLIC CAPITAL LETTER SHA */
- 0x042D, /* CYRILLIC CAPITAL LETTER E */
- 0x0429, /* CYRILLIC CAPITAL LETTER SHCHA */
- 0x0427, /* CYRILLIC CAPITAL LETTER CHE */
- 0x042A /* CYRILLIC CAPITAL LETTER HARD SIGN */
-};
-static const int koi8u_ucs_table_min = 0x80;
-static const int koi8u_ucs_table_len = (sizeof (koi8u_ucs_table) / sizeof (unsigned short));
-static const int koi8u_ucs_table_max = 0x80 + (sizeof (koi8u_ucs_table) / sizeof (unsigned short));
-
-
-
-#endif /* UNNICODE_TABLE_KOI8U_H */
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c
index 793dd8e078..a20960f926 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c
@@ -86,9 +86,11 @@
#include "mbfl_filter_output.h"
#include "mbfilter_8bit.h"
#include "mbfilter_wchar.h"
-#include "filters/mbfilter_ascii.h"
+#include "mbstring.h"
+#include "php_unicode.h"
#include "filters/mbfilter_base64.h"
#include "filters/mbfilter_qprint.h"
+#include "filters/mbfilter_singlebyte.h"
#include "filters/mbfilter_tl_jisx0201_jisx0208.h"
#include "filters/mbfilter_utf8.h"
@@ -200,7 +202,6 @@ size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *str
size_t n;
unsigned char *p;
mbfl_convert_filter *filter;
- int (*filter_function)(int c, mbfl_convert_filter *filter);
ZEND_ASSERT(convd);
ZEND_ASSERT(string);
@@ -212,9 +213,8 @@ size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *str
filter = convd->filter1;
if (filter != NULL) {
- filter_function = filter->filter_function;
while (n > 0) {
- if ((*filter_function)(*p++, filter) < 0) {
+ if ((*filter->filter_function)(*p++, filter) < 0) {
return p - string->val;
}
n--;
@@ -234,9 +234,6 @@ mbfl_buffer_converter_flush(mbfl_buffer_converter *convd)
if (convd->filter1 != NULL) {
mbfl_convert_filter_flush(convd->filter1);
}
- if (convd->filter2 != NULL) {
- mbfl_convert_filter_flush(convd->filter2);
- }
return 0;
}
@@ -262,9 +259,6 @@ mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *str
if (convd->filter1 != NULL) {
mbfl_convert_filter_flush(convd->filter1);
}
- if (convd->filter2 != NULL) {
- mbfl_convert_filter_flush(convd->filter2);
- }
result->encoding = convd->to;
return mbfl_memory_device_result(&convd->device, result);
}
@@ -291,126 +285,102 @@ size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd)
/*
* encoding detector
*/
-mbfl_encoding_detector *
-mbfl_encoding_detector_new(const mbfl_encoding **elist, int elistsz, int strict)
+static int mbfl_estimate_encoding_likelihood(int c, void* data)
{
- mbfl_encoding_detector *identd;
-
- int i, num;
- mbfl_identify_filter *filter;
+ mbfl_convert_filter *filter = *((mbfl_convert_filter**)data);
+ uintptr_t *score = (uintptr_t*)(&filter->opaque);
+
+ /* Receive wchars decoded from test string using candidate encoding
+ * If the test string was invalid in the candidate encoding, we assume
+ * it's the wrong one. */
+ if (c & MBFL_WCSGROUP_THROUGH) {
+ filter->num_illegalchar++;
+ } else if (php_unicode_is_cntrl(c) || php_unicode_is_private(c)) {
+ /* Otherwise, count how many control characters and 'private use'
+ * codepoints we see. Those are rarely used and may indicate that
+ * the candidate encoding is not the right one. */
+ *score += 10;
+ } else if (php_unicode_is_punct(c)) {
+ /* Punctuation is also less common than letters/digits */
+ (*score)++;
+ }
+ return c;
+}
- if (elist == NULL || elistsz <= 0) {
+mbfl_encoding_detector *mbfl_encoding_detector_new(const mbfl_encoding **elist, int elistsz, int strict)
+{
+ if (!elistsz) {
return NULL;
}
- /* allocate */
- identd = emalloc(sizeof(mbfl_encoding_detector));
- identd->filter_list = ecalloc(elistsz, sizeof(mbfl_identify_filter *));
-
- /* create filters */
- i = 0;
- num = 0;
- while (i < elistsz) {
- filter = mbfl_identify_filter_new2(elist[i]);
- if (filter != NULL) {
- identd->filter_list[num] = filter;
- num++;
- }
- i++;
+ mbfl_encoding_detector *identd = emalloc(sizeof(mbfl_encoding_detector));
+ identd->filter_list = ecalloc(elistsz, sizeof(mbfl_convert_filter*));
+ for (int i = 0; i < elistsz; i++) {
+ identd->filter_list[i] = mbfl_convert_filter_new(elist[i], &mbfl_encoding_wchar,
+ mbfl_estimate_encoding_likelihood, NULL, &identd->filter_list[i]);
+ identd->filter_list[i]->opaque = (void*)0;
}
- identd->filter_list_size = num;
-
- /* set strict flag */
+ identd->filter_list_size = elistsz;
identd->strict = strict;
-
return identd;
}
-
-void
-mbfl_encoding_detector_delete(mbfl_encoding_detector *identd)
+void mbfl_encoding_detector_delete(mbfl_encoding_detector *identd)
{
- int i;
-
- if (identd != NULL) {
- if (identd->filter_list != NULL) {
- i = identd->filter_list_size;
- while (i > 0) {
- i--;
- mbfl_identify_filter_delete(identd->filter_list[i]);
- }
- efree((void *)identd->filter_list);
- }
- efree((void *)identd);
+ for (int i = 0; i < identd->filter_list_size; i++) {
+ mbfl_convert_filter_delete(identd->filter_list[i]);
}
+ efree(identd->filter_list);
+ efree(identd);
}
-int
-mbfl_encoding_detector_feed(mbfl_encoding_detector *identd, mbfl_string *string)
+int mbfl_encoding_detector_feed(mbfl_encoding_detector *identd, mbfl_string *string)
{
- int res = 0;
- /* feed data */
- if (identd != NULL && string != NULL && string->val != NULL) {
- int num = identd->filter_list_size;
- size_t n = string->len;
- unsigned char *p = string->val;
- int bad = 0;
- while (n > 0) {
- int i;
- for (i = 0; i < num; i++) {
- mbfl_identify_filter *filter = identd->filter_list[i];
- if (!filter->flag) {
- (*filter->filter_function)(*p, filter);
- if (filter->flag) {
- bad++;
- }
+ int num = identd->filter_list_size;
+ size_t n = string->len;
+ unsigned char *p = string->val;
+ int bad = 0;
+
+ while (n--) {
+ for (int i = 0; i < num; i++) {
+ mbfl_convert_filter *filter = identd->filter_list[i];
+ if (!filter->num_illegalchar) {
+ (*filter->filter_function)(*p, filter);
+ if (filter->num_illegalchar) {
+ bad++;
}
}
- if ((num - 1) <= bad) {
- res = 1;
- break;
- }
- p++;
- n--;
}
+ if ((num - 1) <= bad && !identd->strict) {
+ return 1;
+ }
+ p++;
}
- return res;
+ if (identd->strict) {
+ for (int i = 0; i < num; i++) {
+ mbfl_convert_filter *filter = identd->filter_list[i];
+ (filter->filter_flush)(filter);
+ }
+ }
+
+ return 0;
}
const mbfl_encoding *mbfl_encoding_detector_judge(mbfl_encoding_detector *identd)
{
- mbfl_identify_filter *filter;
- const mbfl_encoding *encoding = NULL;
- int n;
-
- /* judge */
- if (identd != NULL) {
- n = identd->filter_list_size - 1;
- while (n >= 0) {
- filter = identd->filter_list[n];
- if (!filter->flag) {
- if (!identd->strict || !filter->status) {
- encoding = filter->encoding;
- }
- }
- n--;
- }
+ uintptr_t best_score = UINT_MAX; /* Low score is 'better' */
+ const mbfl_encoding *enc = NULL;
- /* fallback judge */
- if (!encoding) {
- n = identd->filter_list_size - 1;
- while (n >= 0) {
- filter = identd->filter_list[n];
- if (!filter->flag) {
- encoding = filter->encoding;
- }
- n--;
- }
+ for (int i = 0; i < identd->filter_list_size; i++) {
+ mbfl_convert_filter *filter = identd->filter_list[i];
+ if (!filter->num_illegalchar && (uintptr_t)filter->opaque < best_score) {
+ enc = filter->from;
+ best_score = (uintptr_t)filter->opaque;
}
}
- return encoding;
+ return enc;
}
/*
@@ -479,83 +449,19 @@ mbfl_convert_encoding(
return mbfl_memory_device_result(&device, result);
}
-
/*
* identify encoding
*/
-const mbfl_encoding *
-mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int elistsz, int strict)
+const mbfl_encoding *mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int elistsz, int strict)
{
- int i, num, bad;
- size_t n;
- unsigned char *p;
- mbfl_identify_filter *flist, *filter;
- const mbfl_encoding *encoding;
-
- /* flist is an array of mbfl_identify_filter instances */
- flist = ecalloc(elistsz, sizeof(mbfl_identify_filter));
-
- num = 0;
- if (elist != NULL) {
- for (i = 0; i < elistsz; i++) {
- if (!mbfl_identify_filter_init2(&flist[num], elist[i])) {
- num++;
- }
- }
- }
-
- /* feed data */
- n = string->len;
- p = string->val;
-
- if (p != NULL) {
- bad = 0;
- while (n > 0) {
- for (i = 0; i < num; i++) {
- filter = &flist[i];
- if (!filter->flag) {
- (*filter->filter_function)(*p, filter);
- if (filter->flag) {
- bad++;
- }
- }
- }
- if ((num - 1) <= bad && !strict) {
- break;
- }
- p++;
- n--;
- }
- }
-
- /* judge */
- encoding = NULL;
-
- for (i = 0; i < num; i++) {
- filter = &flist[i];
- if (!filter->flag) {
- if (strict && filter->status) {
- continue;
- }
- encoding = filter->encoding;
- break;
- }
- }
-
- /* fall-back judge */
- if (!encoding) {
- for (i = 0; i < num; i++) {
- filter = &flist[i];
- if (!filter->flag && (!strict || !filter->status)) {
- encoding = filter->encoding;
- break;
- }
- }
+ if (!elistsz) {
+ return NULL;
}
-
- efree((void *)flist);
-
- return encoding;
+ mbfl_encoding_detector *identd = mbfl_encoding_detector_new(elist, elistsz, strict);
+ mbfl_encoding_detector_feed(identd, string);
+ const mbfl_encoding *enc = mbfl_encoding_detector_judge(identd);
+ mbfl_encoding_detector_delete(identd);
+ return enc;
}
/*
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.h b/ext/mbstring/libmbfl/mbfl/mbfilter.h
index 16742be96c..b914a36c9e 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter.h
@@ -93,7 +93,6 @@
#include "mbfl_language.h"
#include "mbfl_string.h"
#include "mbfl_convert.h"
-#include "mbfl_ident.h"
/* Prefer local fix, otherwise need to include too much. */
#ifndef ssize_t
@@ -156,7 +155,7 @@ MBFLAPI extern size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd);
typedef struct _mbfl_encoding_detector mbfl_encoding_detector;
struct _mbfl_encoding_detector {
- mbfl_identify_filter **filter_list;
+ mbfl_convert_filter **filter_list;
int filter_list_size;
int strict;
};
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c
index f4c74946c1..4017829cf8 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c
@@ -43,7 +43,7 @@ const mbfl_encoding mbfl_encoding_8bit = {
mbfl_no_encoding_8bit,
"8bit",
"8bit",
- (const char *(*)[])&mbfl_encoding_8bit_aliases,
+ mbfl_encoding_8bit_aliases,
NULL,
MBFL_ENCTYPE_SBCS,
&vtbl_8bit_wchar,
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c
index 3d7cffe9c1..e43f746ecc 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c
@@ -38,7 +38,7 @@ const mbfl_encoding mbfl_encoding_pass = {
mbfl_no_encoding_pass,
"pass",
NULL,
- (const char *(*)[])&mbfl_encoding_pass_aliases,
+ mbfl_encoding_pass_aliases,
NULL,
0,
NULL,
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
index 3e15400879..0f57310d5e 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
@@ -51,33 +51,12 @@
#define MBFL_WCSPLANE_JIS0208 0x70e10000 /* JIS HEX : 2121h - 7E7Eh */
#define MBFL_WCSPLANE_JIS0212 0x70e20000 /* JIS HEX : 2121h - 7E7Eh */
#define MBFL_WCSPLANE_WINCP932 0x70e30000 /* JIS HEX : 2121h - 9898h */
-#define MBFL_WCSPLANE_8859_1 0x70e40000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_2 0x70e50000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_3 0x70e60000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_4 0x70e70000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_5 0x70e80000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_6 0x70e90000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_7 0x70ea0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_8 0x70eb0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_9 0x70ec0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_10 0x70ed0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_13 0x70ee0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_14 0x70ef0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_8859_15 0x70f00000 /* 00h - FFh */
#define MBFL_WCSPLANE_KSC5601 0x70f10000 /* 2121h - 7E7Eh */
#define MBFL_WCSPLANE_GB2312 0x70f20000 /* 2121h - 7E7Eh */
#define MBFL_WCSPLANE_WINCP936 0x70f30000 /* 2121h - 9898h */
#define MBFL_WCSPLANE_BIG5 0x70f40000 /* 2121h - 9898h */
#define MBFL_WCSPLANE_CNS11643 0x70f50000 /* 2121h - 9898h */
#define MBFL_WCSPLANE_UHC 0x70f60000 /* 8141h - fefeh */
-#define MBFL_WCSPLANE_CP1251 0x70f70000
-#define MBFL_WCSPLANE_CP866 0x70f80000
-#define MBFL_WCSPLANE_KOI8R 0x70f90000
-#define MBFL_WCSPLANE_8859_16 0x70fa0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_ARMSCII8 0x70fb0000
-#define MBFL_WCSPLANE_KOI8U 0x70fc0000
-#define MBFL_WCSPLANE_CP1254 0x70fd0000 /* 00h - FFh */
-#define MBFL_WCSPLANE_CP850 0x70fe0000 /* 00h - FFh */
#define MBFL_WCSPLANE_GB18030 0x70ff0000 /* a1a1h-e3329a35h */
#define MBFL_WCSGROUP_MASK 0xffffff
#define MBFL_WCSGROUP_UCS4MAX 0x70000000
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
index 6a46c2b541..cf35a4f4e4 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c
@@ -57,29 +57,9 @@
#include "filters/mbfilter_euc_jp_2004.h"
#include "filters/mbfilter_euc_jp_win.h"
#include "filters/mbfilter_gb18030.h"
-#include "filters/mbfilter_ascii.h"
-#include "filters/mbfilter_koi8r.h"
-#include "filters/mbfilter_koi8u.h"
-#include "filters/mbfilter_cp866.h"
#include "filters/mbfilter_cp932.h"
#include "filters/mbfilter_cp936.h"
-#include "filters/mbfilter_cp1251.h"
-#include "filters/mbfilter_cp1252.h"
-#include "filters/mbfilter_cp1254.h"
#include "filters/mbfilter_cp5022x.h"
-#include "filters/mbfilter_iso8859_1.h"
-#include "filters/mbfilter_iso8859_2.h"
-#include "filters/mbfilter_iso8859_3.h"
-#include "filters/mbfilter_iso8859_4.h"
-#include "filters/mbfilter_iso8859_5.h"
-#include "filters/mbfilter_iso8859_6.h"
-#include "filters/mbfilter_iso8859_7.h"
-#include "filters/mbfilter_iso8859_8.h"
-#include "filters/mbfilter_iso8859_9.h"
-#include "filters/mbfilter_iso8859_10.h"
-#include "filters/mbfilter_iso8859_13.h"
-#include "filters/mbfilter_iso8859_14.h"
-#include "filters/mbfilter_iso8859_15.h"
#include "filters/mbfilter_base64.h"
#include "filters/mbfilter_qprint.h"
#include "filters/mbfilter_uuencode.h"
@@ -90,13 +70,10 @@
#include "filters/mbfilter_utf8_mobile.h"
#include "filters/mbfilter_utf16.h"
#include "filters/mbfilter_utf32.h"
-#include "filters/mbfilter_byte2.h"
-#include "filters/mbfilter_byte4.h"
#include "filters/mbfilter_ucs4.h"
#include "filters/mbfilter_ucs2.h"
#include "filters/mbfilter_htmlent.h"
-#include "filters/mbfilter_armscii8.h"
-#include "filters/mbfilter_cp850.h"
+#include "filters/mbfilter_singlebyte.h"
/* hex character table "0123456789ABCDEF" */
static char mbfl_hexchar_table[] = {
@@ -115,7 +92,7 @@ static const struct mbfl_convert_vtbl *mbfl_special_filter_list[] = {
NULL
};
-static void mbfl_convert_filter_common_init(mbfl_convert_filter *filter, const mbfl_encoding *from, const mbfl_encoding *to,
+static void mbfl_convert_filter_init(mbfl_convert_filter *filter, const mbfl_encoding *from, const mbfl_encoding *to,
const struct mbfl_convert_vtbl *vtbl, output_function_t output_function, flush_function_t flush_function, void* data)
{
/* encoding structure */
@@ -136,13 +113,12 @@ static void mbfl_convert_filter_common_init(mbfl_convert_filter *filter, const m
filter->filter_ctor = vtbl->filter_ctor;
filter->filter_dtor = vtbl->filter_dtor;
filter->filter_function = vtbl->filter_function;
- filter->filter_flush = vtbl->filter_flush;
+ filter->filter_flush = (filter_flush_t)vtbl->filter_flush;
filter->filter_copy = vtbl->filter_copy;
(*filter->filter_ctor)(filter);
}
-
mbfl_convert_filter* mbfl_convert_filter_new(const mbfl_encoding *from, const mbfl_encoding *to, output_function_t output_function,
flush_function_t flush_function, void* data)
{
@@ -152,7 +128,7 @@ mbfl_convert_filter* mbfl_convert_filter_new(const mbfl_encoding *from, const mb
}
mbfl_convert_filter *filter = emalloc(sizeof(mbfl_convert_filter));
- mbfl_convert_filter_common_init(filter, from, to, vtbl, output_function, flush_function, data);
+ mbfl_convert_filter_init(filter, from, to, vtbl, output_function, flush_function, data);
return filter;
}
@@ -163,7 +139,7 @@ mbfl_convert_filter* mbfl_convert_filter_new2(const struct mbfl_convert_vtbl *vt
const mbfl_encoding *to_encoding = mbfl_no2encoding(vtbl->to);
mbfl_convert_filter *filter = emalloc(sizeof(mbfl_convert_filter));
- mbfl_convert_filter_common_init(filter, from_encoding, to_encoding, vtbl, output_function, flush_function, data);
+ mbfl_convert_filter_init(filter, from_encoding, to_encoding, vtbl, output_function, flush_function, data);
return filter;
}
@@ -195,7 +171,7 @@ unsigned char* mbfl_convert_filter_feed_string(mbfl_convert_filter *filter, unsi
int mbfl_convert_filter_flush(mbfl_convert_filter *filter)
{
(*filter->filter_flush)(filter);
- return filter->flush_function ? (*filter->flush_function)(filter->data) : 0;
+ return 0;
}
void mbfl_convert_filter_reset(mbfl_convert_filter *filter, const mbfl_encoding *from, const mbfl_encoding *to)
@@ -210,8 +186,7 @@ void mbfl_convert_filter_reset(mbfl_convert_filter *filter, const mbfl_encoding
vtbl = &vtbl_pass;
}
- mbfl_convert_filter_common_init(filter, from, to, vtbl,
- filter->output_function, filter->flush_function, filter->data);
+ mbfl_convert_filter_init(filter, from, to, vtbl, filter->output_function, filter->flush_function, filter->data);
}
void mbfl_convert_filter_copy(mbfl_convert_filter *src, mbfl_convert_filter *dest)
@@ -287,9 +262,6 @@ int mbfl_filt_conv_illegal_output(int c, mbfl_convert_filter *filter)
case MBFL_WCSPLANE_GB18030:
ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"GB+");
break;
- case MBFL_WCSPLANE_8859_1:
- ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"I8859_1+");
- break;
default:
ret = mbfl_convert_filter_strcat(filter, (const unsigned char *)"?+");
break;
@@ -399,16 +371,12 @@ const struct mbfl_convert_vtbl* mbfl_convert_filter_get_vtbl(const mbfl_encoding
*/
void mbfl_filt_conv_common_ctor(mbfl_convert_filter *filter)
{
- filter->status = 0;
- filter->cache = 0;
+ filter->status = filter->cache = 0;
}
int mbfl_filt_conv_common_flush(mbfl_convert_filter *filter)
{
- filter->status = 0;
- filter->cache = 0;
-
- if (filter->flush_function != NULL) {
+ if (filter->flush_function) {
(*filter->flush_function)(filter->data);
}
return 0;
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
index 3ecb06553d..e558fba4b9 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
@@ -61,30 +61,9 @@
#include "filters/mbfilter_euc_jp_win.h"
#include "filters/mbfilter_euc_jp_2004.h"
#include "filters/mbfilter_gb18030.h"
-#include "filters/mbfilter_ascii.h"
-#include "filters/mbfilter_koi8r.h"
-#include "filters/mbfilter_koi8u.h"
-#include "filters/mbfilter_cp866.h"
#include "filters/mbfilter_cp932.h"
#include "filters/mbfilter_cp936.h"
-#include "filters/mbfilter_cp1251.h"
-#include "filters/mbfilter_cp1252.h"
-#include "filters/mbfilter_cp1254.h"
#include "filters/mbfilter_cp5022x.h"
-#include "filters/mbfilter_iso8859_1.h"
-#include "filters/mbfilter_iso8859_2.h"
-#include "filters/mbfilter_iso8859_3.h"
-#include "filters/mbfilter_iso8859_4.h"
-#include "filters/mbfilter_iso8859_5.h"
-#include "filters/mbfilter_iso8859_6.h"
-#include "filters/mbfilter_iso8859_7.h"
-#include "filters/mbfilter_iso8859_8.h"
-#include "filters/mbfilter_iso8859_9.h"
-#include "filters/mbfilter_iso8859_10.h"
-#include "filters/mbfilter_iso8859_13.h"
-#include "filters/mbfilter_iso8859_14.h"
-#include "filters/mbfilter_iso8859_15.h"
-#include "filters/mbfilter_iso8859_16.h"
#include "filters/mbfilter_base64.h"
#include "filters/mbfilter_qprint.h"
#include "filters/mbfilter_uuencode.h"
@@ -95,13 +74,10 @@
#include "filters/mbfilter_utf8_mobile.h"
#include "filters/mbfilter_utf16.h"
#include "filters/mbfilter_utf32.h"
-#include "filters/mbfilter_byte2.h"
-#include "filters/mbfilter_byte4.h"
#include "filters/mbfilter_ucs4.h"
#include "filters/mbfilter_ucs2.h"
#include "filters/mbfilter_htmlent.h"
-#include "filters/mbfilter_armscii8.h"
-#include "filters/mbfilter_cp850.h"
+#include "filters/mbfilter_singlebyte.h"
#ifndef HAVE_STRCASECMP
#ifdef HAVE_STRICMP
@@ -112,10 +88,6 @@
static const mbfl_encoding *mbfl_encoding_ptr_list[] = {
&mbfl_encoding_wchar,
- &mbfl_encoding_byte2be,
- &mbfl_encoding_byte2le,
- &mbfl_encoding_byte4be,
- &mbfl_encoding_byte4le,
&mbfl_encoding_base64,
&mbfl_encoding_uuencode,
&mbfl_encoding_html_ent,
@@ -199,44 +171,32 @@ static const mbfl_encoding *mbfl_encoding_ptr_list[] = {
NULL
};
-/* encoding resolver */
-const mbfl_encoding *
-mbfl_name2encoding(const char *name)
+const mbfl_encoding *mbfl_name2encoding(const char *name)
{
- const mbfl_encoding *encoding;
- int i, j;
+ const mbfl_encoding **encoding;
- if (name == NULL) {
- return NULL;
- }
-
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL){
- if (strcasecmp(encoding->name, name) == 0) {
- return encoding;
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if (strcasecmp((*encoding)->name, name) == 0) {
+ return *encoding;
}
}
- /* serch MIME charset name */
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL) {
- if (encoding->mime_name != NULL) {
- if (strcasecmp(encoding->mime_name, name) == 0) {
- return encoding;
+ /* search MIME charset name */
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if ((*encoding)->mime_name) {
+ if (strcasecmp((*encoding)->mime_name, name) == 0) {
+ return *encoding;
}
}
}
- /* serch aliases */
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL) {
- if (encoding->aliases != NULL) {
- j = 0;
- while ((*encoding->aliases)[j] != NULL) {
- if (strcasecmp((*encoding->aliases)[j], name) == 0) {
- return encoding;
+ /* search aliases */
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if ((*encoding)->aliases) {
+ for (const char **alias = (*encoding)->aliases; *alias; alias++) {
+ if (strcasecmp(*alias, name) == 0) {
+ return *encoding;
}
- j++;
}
}
}
@@ -244,63 +204,45 @@ mbfl_name2encoding(const char *name)
return NULL;
}
-const mbfl_encoding *
-mbfl_no2encoding(enum mbfl_no_encoding no_encoding)
+const mbfl_encoding *mbfl_no2encoding(enum mbfl_no_encoding no_encoding)
{
- const mbfl_encoding *encoding;
- int i;
+ const mbfl_encoding **encoding;
- i = 0;
- while ((encoding = mbfl_encoding_ptr_list[i++]) != NULL){
- if (encoding->no_encoding == no_encoding) {
- return encoding;
+ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
+ if ((*encoding)->no_encoding == no_encoding) {
+ return *encoding;
}
}
return NULL;
}
-enum mbfl_no_encoding
-mbfl_name2no_encoding(const char *name)
+enum mbfl_no_encoding mbfl_name2no_encoding(const char *name)
{
- const mbfl_encoding *encoding;
-
- encoding = mbfl_name2encoding(name);
- if (encoding == NULL) {
- return mbfl_no_encoding_invalid;
- } else {
- return encoding->no_encoding;
- }
+ const mbfl_encoding *encoding = mbfl_name2encoding(name);
+ return encoding ? encoding->no_encoding : mbfl_no_encoding_invalid;
}
-const char *
-mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding)
+const char *mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding)
{
- const mbfl_encoding *encoding;
-
- encoding = mbfl_no2encoding(no_encoding);
- if (encoding == NULL) {
- return "";
- } else {
- return encoding->name;
- }
+ const mbfl_encoding *encoding = mbfl_no2encoding(no_encoding);
+ return encoding ? encoding->name : "";
}
-const mbfl_encoding **
-mbfl_get_supported_encodings(void)
+const mbfl_encoding **mbfl_get_supported_encodings(void)
{
return mbfl_encoding_ptr_list;
}
-const char *
-mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding)
+const char *mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding)
{
- const mbfl_encoding *encoding;
+ return mbfl_encoding_preferred_mime_name(mbfl_no2encoding(no_encoding));
+}
- encoding = mbfl_no2encoding(no_encoding);
- if (encoding != NULL && encoding->mime_name != NULL && encoding->mime_name[0] != '\0') {
+const char *mbfl_encoding_preferred_mime_name(const mbfl_encoding *encoding)
+{
+ if (encoding->mime_name && encoding->mime_name[0] != '\0') {
return encoding->mime_name;
- } else {
- return NULL;
}
+ return NULL;
}
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
index 0b39153c9d..40eb6e9bb9 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
@@ -37,10 +37,6 @@ enum mbfl_no_encoding {
mbfl_no_encoding_invalid = -1,
mbfl_no_encoding_pass,
mbfl_no_encoding_wchar,
- mbfl_no_encoding_byte2be,
- mbfl_no_encoding_byte2le,
- mbfl_no_encoding_byte4be,
- mbfl_no_encoding_byte4le,
mbfl_no_encoding_base64,
mbfl_no_encoding_uuencode,
mbfl_no_encoding_html_ent,
@@ -145,19 +141,19 @@ typedef struct _mbfl_encoding {
enum mbfl_no_encoding no_encoding;
const char *name;
const char *mime_name;
- const char *(*aliases)[];
+ const char **aliases;
const unsigned char *mblen_table;
unsigned int flag;
const struct mbfl_convert_vtbl *input_filter;
const struct mbfl_convert_vtbl *output_filter;
} mbfl_encoding;
-MBFLAPI extern const mbfl_encoding * mbfl_name2encoding(const char *name);
-MBFLAPI extern const mbfl_encoding * mbfl_no2encoding(enum mbfl_no_encoding no_encoding);
+MBFLAPI extern const mbfl_encoding *mbfl_name2encoding(const char *name);
+MBFLAPI extern const mbfl_encoding *mbfl_no2encoding(enum mbfl_no_encoding no_encoding);
MBFLAPI extern enum mbfl_no_encoding mbfl_name2no_encoding(const char *name);
-MBFLAPI extern const mbfl_encoding ** mbfl_get_supported_encodings();
-MBFLAPI extern const char * mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding);
-MBFLAPI extern const char * mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding);
-
+MBFLAPI extern const mbfl_encoding **mbfl_get_supported_encodings();
+MBFLAPI extern const char *mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding);
+MBFLAPI extern const char *mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding);
+MBFLAPI extern const char *mbfl_encoding_preferred_mime_name(const mbfl_encoding *encoding);
#endif /* MBFL_ENCODING_H */
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_ident.c b/ext/mbstring/libmbfl/mbfl/mbfl_ident.c
deleted file mode 100644
index 18144eb030..0000000000
--- a/ext/mbstring/libmbfl/mbfl/mbfl_ident.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.c
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 20 Dec 2002. The file
- * mbfilter.c is included in this package .
- *
- */
-
-#include <stddef.h>
-
-#include "mbfl_ident.h"
-#include "mbfilter_pass.h"
-#include "mbfilter_8bit.h"
-#include "mbfilter_wchar.h"
-
-#include "filters/mbfilter_euc_cn.h"
-#include "filters/mbfilter_hz.h"
-#include "filters/mbfilter_euc_tw.h"
-#include "filters/mbfilter_big5.h"
-#include "filters/mbfilter_uhc.h"
-#include "filters/mbfilter_euc_kr.h"
-#include "filters/mbfilter_iso2022_kr.h"
-#include "filters/mbfilter_sjis.h"
-#include "filters/mbfilter_sjis_open.h"
-#include "filters/mbfilter_sjis_mobile.h"
-#include "filters/mbfilter_jis.h"
-#include "filters/mbfilter_iso2022_jp_ms.h"
-#include "filters/mbfilter_iso2022jp_2004.h"
-#include "filters/mbfilter_iso2022jp_mobile.h"
-#include "filters/mbfilter_euc_jp.h"
-#include "filters/mbfilter_euc_jp_win.h"
-#include "filters/mbfilter_euc_jp_2004.h"
-#include "filters/mbfilter_utf8_mobile.h"
-#include "filters/mbfilter_ascii.h"
-#include "filters/mbfilter_koi8r.h"
-#include "filters/mbfilter_koi8u.h"
-#include "filters/mbfilter_cp866.h"
-#include "filters/mbfilter_cp932.h"
-#include "filters/mbfilter_cp936.h"
-#include "filters/mbfilter_cp1251.h"
-#include "filters/mbfilter_cp1252.h"
-#include "filters/mbfilter_cp1254.h"
-#include "filters/mbfilter_cp51932.h"
-#include "filters/mbfilter_cp5022x.h"
-#include "filters/mbfilter_gb18030.h"
-#include "filters/mbfilter_iso8859_1.h"
-#include "filters/mbfilter_iso8859_2.h"
-#include "filters/mbfilter_iso8859_3.h"
-#include "filters/mbfilter_iso8859_4.h"
-#include "filters/mbfilter_iso8859_5.h"
-#include "filters/mbfilter_iso8859_6.h"
-#include "filters/mbfilter_iso8859_7.h"
-#include "filters/mbfilter_iso8859_8.h"
-#include "filters/mbfilter_iso8859_9.h"
-#include "filters/mbfilter_iso8859_10.h"
-#include "filters/mbfilter_iso8859_13.h"
-#include "filters/mbfilter_iso8859_14.h"
-#include "filters/mbfilter_iso8859_15.h"
-#include "filters/mbfilter_base64.h"
-#include "filters/mbfilter_qprint.h"
-#include "filters/mbfilter_uuencode.h"
-#include "filters/mbfilter_7bit.h"
-#include "filters/mbfilter_utf7.h"
-#include "filters/mbfilter_utf7imap.h"
-#include "filters/mbfilter_utf8.h"
-#include "filters/mbfilter_utf16.h"
-#include "filters/mbfilter_utf32.h"
-#include "filters/mbfilter_byte2.h"
-#include "filters/mbfilter_byte4.h"
-#include "filters/mbfilter_ucs4.h"
-#include "filters/mbfilter_ucs2.h"
-#include "filters/mbfilter_htmlent.h"
-#include "filters/mbfilter_armscii8.h"
-#include "filters/mbfilter_cp850.h"
-
-static const struct mbfl_identify_vtbl vtbl_identify_false = {
- mbfl_no_encoding_pass,
- mbfl_filt_ident_false_ctor,
- mbfl_filt_ident_false
-};
-
-static const struct mbfl_identify_vtbl *mbfl_identify_filter_list[] = {
- &vtbl_identify_utf8,
- &vtbl_identify_utf7,
- &vtbl_identify_ascii,
- &vtbl_identify_eucjp,
- &vtbl_identify_sjis,
- &vtbl_identify_sjis_open,
- &vtbl_identify_eucjpwin,
- &vtbl_identify_eucjp2004,
- &vtbl_identify_cp932,
- &vtbl_identify_jis,
- &vtbl_identify_2022jp,
- &vtbl_identify_2022jpms,
- &vtbl_identify_2022jp_2004,
- &vtbl_identify_2022jp_kddi,
- &vtbl_identify_cp51932,
- &vtbl_identify_sjis_docomo,
- &vtbl_identify_sjis_kddi,
- &vtbl_identify_sjis_sb,
- &vtbl_identify_utf8_docomo,
- &vtbl_identify_utf8_kddi_a,
- &vtbl_identify_utf8_kddi_b,
- &vtbl_identify_utf8_sb,
- &vtbl_identify_euccn,
- &vtbl_identify_cp936,
- &vtbl_identify_hz,
- &vtbl_identify_euctw,
- &vtbl_identify_big5,
- &vtbl_identify_cp950,
- &vtbl_identify_euckr,
- &vtbl_identify_uhc,
- &vtbl_identify_2022kr,
- &vtbl_identify_cp1251,
- &vtbl_identify_cp866,
- &vtbl_identify_koi8r,
- &vtbl_identify_koi8u,
- &vtbl_identify_cp1252,
- &vtbl_identify_cp1254,
- &vtbl_identify_8859_1,
- &vtbl_identify_8859_2,
- &vtbl_identify_8859_3,
- &vtbl_identify_8859_4,
- &vtbl_identify_8859_5,
- &vtbl_identify_8859_6,
- &vtbl_identify_8859_7,
- &vtbl_identify_8859_8,
- &vtbl_identify_8859_9,
- &vtbl_identify_8859_10,
- &vtbl_identify_8859_13,
- &vtbl_identify_8859_14,
- &vtbl_identify_8859_15,
- &vtbl_identify_armscii8,
- &vtbl_identify_cp850,
- &vtbl_identify_jis_ms,
- &vtbl_identify_cp50220,
- &vtbl_identify_cp50221,
- &vtbl_identify_cp50222,
- &vtbl_identify_gb18030,
- &vtbl_identify_false,
- NULL
-};
-
-/*
- * identify filter
- */
-const struct mbfl_identify_vtbl * mbfl_identify_filter_get_vtbl(enum mbfl_no_encoding encoding)
-{
- const struct mbfl_identify_vtbl * vtbl;
- int i;
-
- i = 0;
- while ((vtbl = mbfl_identify_filter_list[i++]) != NULL) {
- if (vtbl->encoding == encoding) {
- break;
- }
- }
-
- return vtbl;
-}
-
-mbfl_identify_filter *mbfl_identify_filter_new(enum mbfl_no_encoding encoding)
-{
- mbfl_identify_filter *filter = emalloc(sizeof(mbfl_identify_filter));
- if (mbfl_identify_filter_init(filter, encoding)) {
- efree(filter);
- return NULL;
- }
-
- return filter;
-}
-
-mbfl_identify_filter *mbfl_identify_filter_new2(const mbfl_encoding *encoding)
-{
- mbfl_identify_filter *filter = emalloc(sizeof(mbfl_identify_filter));
- if (mbfl_identify_filter_init2(filter, encoding)) {
- efree(filter);
- return NULL;
- }
-
- return filter;
-}
-
-
-int mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding)
-{
- const mbfl_encoding *enc = mbfl_no2encoding(encoding);
- return mbfl_identify_filter_init2(filter, enc ? enc: &mbfl_encoding_pass);
-}
-
-int mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding)
-{
- const struct mbfl_identify_vtbl *vtbl;
-
- /* encoding structure */
- filter->encoding = encoding;
-
- filter->status = 0;
- filter->flag = 0;
- filter->score = 0;
-
- /* setup the function table */
- vtbl = mbfl_identify_filter_get_vtbl(filter->encoding->no_encoding);
- if (vtbl == NULL) {
- vtbl = &vtbl_identify_false;
- }
- filter->filter_ctor = vtbl->filter_ctor;
- filter->filter_function = vtbl->filter_function;
-
- /* constructor */
- (*filter->filter_ctor)(filter);
-
- return 0;
-}
-
-void mbfl_identify_filter_delete(mbfl_identify_filter *filter)
-{
- if (filter == NULL) {
- return;
- }
-
- efree((void*)filter);
-}
-
-void mbfl_filt_ident_common_ctor(mbfl_identify_filter *filter)
-{
- filter->status = 0;
- filter->flag = 0;
-}
-
-int mbfl_filt_ident_false(int c, mbfl_identify_filter *filter)
-{
- filter->flag = 1; /* bad */
- return c;
-}
-
-void mbfl_filt_ident_false_ctor(mbfl_identify_filter *filter)
-{
- filter->status = 0;
- filter->flag = 1;
-}
-
-int mbfl_filt_ident_true(int c, mbfl_identify_filter *filter)
-{
- return c;
-}
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_ident.h b/ext/mbstring/libmbfl/mbfl/mbfl_ident.h
deleted file mode 100644
index c9afd03fb4..0000000000
--- a/ext/mbstring/libmbfl/mbfl/mbfl_ident.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * "streamable kanji code filter and converter"
- * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
- *
- * LICENSE NOTICES
- *
- * This file is part of "streamable kanji code filter and converter",
- * which is distributed under the terms of GNU Lesser General Public
- * License (version 2) as published by the Free Software Foundation.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with "streamable kanji code filter and converter";
- * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
- * Suite 330, Boston, MA 02111-1307 USA
- *
- * The author of this file:
- *
- */
-/*
- * The source code included in this files was separated from mbfilter.h
- * by Moriyoshi Koizumi <moriyoshi@php.net> on 20 Dec 2002. The file
- * mbfilter.h is included in this package .
- *
- */
-
-#ifndef MBFL_IDENT_H
-#define MBFL_IDENT_H
-
-#include "mbfl_defs.h"
-#include "mbfl_encoding.h"
-
-/*
- * identify filter
- */
-typedef struct _mbfl_identify_filter mbfl_identify_filter;
-
-struct _mbfl_identify_filter {
- void (*filter_ctor)(mbfl_identify_filter *filter);
- int (*filter_function)(int c, mbfl_identify_filter *filter);
- int status;
- int flag;
- int score;
- const mbfl_encoding *encoding;
-};
-
-struct mbfl_identify_vtbl {
- enum mbfl_no_encoding encoding;
- void (*filter_ctor)(mbfl_identify_filter *filter);
- int (*filter_function)(int c, mbfl_identify_filter *filter);
-};
-
-MBFLAPI extern const struct mbfl_identify_vtbl * mbfl_identify_filter_get_vtbl(enum mbfl_no_encoding encoding);
-MBFLAPI extern mbfl_identify_filter * mbfl_identify_filter_new(enum mbfl_no_encoding encoding);
-MBFLAPI extern mbfl_identify_filter * mbfl_identify_filter_new2(const mbfl_encoding *encoding);
-MBFLAPI extern void mbfl_identify_filter_delete(mbfl_identify_filter *filter);
-MBFLAPI extern int mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding);
-MBFLAPI extern int mbfl_identify_filter_init2(mbfl_identify_filter *filter, const mbfl_encoding *encoding);
-
-MBFLAPI extern void mbfl_filt_ident_common_ctor(mbfl_identify_filter *filter);
-MBFLAPI extern void mbfl_filt_ident_false_ctor(mbfl_identify_filter *filter);
-
-MBFLAPI extern int mbfl_filt_ident_false(int c, mbfl_identify_filter *filter);
-MBFLAPI extern int mbfl_filt_ident_true(int c, mbfl_identify_filter *filter);
-
-#endif /* MBFL_IDENT_H */
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c
index 09746efcd0..cd064e5ee8 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.c
@@ -37,106 +37,67 @@
/*
* memory device output functions
*/
-void
-mbfl_memory_device_init(mbfl_memory_device *device, size_t initsz, size_t allocsz)
+void mbfl_memory_device_init(mbfl_memory_device *device, size_t initsz, size_t allocsz)
{
- if (device) {
- device->length = 0;
- device->buffer = NULL;
- if (initsz > 0) {
- device->buffer = emalloc(initsz);
- device->length = initsz;
- }
- device->pos = 0;
- if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
- device->allocsz = allocsz;
- } else {
- device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- }
- }
+ device->buffer = (initsz > 0) ? emalloc(initsz) : NULL;
+ device->length = initsz;
+ device->pos = 0;
+ device->allocsz = MAX(allocsz, MBFL_MEMORY_DEVICE_ALLOC_SIZE);
}
-void
-mbfl_memory_device_realloc(mbfl_memory_device *device, size_t initsz, size_t allocsz)
+void mbfl_memory_device_realloc(mbfl_memory_device *device, size_t initsz, size_t allocsz)
{
- if (device) {
- if (initsz > device->length) {
- device->buffer = erealloc(device->buffer, initsz);
- device->length = initsz;
- }
- if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
- device->allocsz = allocsz;
- } else {
- device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- }
+ if (initsz > device->length) {
+ device->buffer = erealloc(device->buffer, initsz);
+ device->length = initsz;
}
+ device->allocsz = MAX(allocsz, MBFL_MEMORY_DEVICE_ALLOC_SIZE);
}
-void
-mbfl_memory_device_clear(mbfl_memory_device *device)
+void mbfl_memory_device_clear(mbfl_memory_device *device)
{
- if (device) {
- if (device->buffer) {
- efree(device->buffer);
- }
- device->buffer = NULL;
- device->length = 0;
- device->pos = 0;
+ if (device->buffer) {
+ efree(device->buffer);
}
+ device->buffer = NULL;
+ device->length = device->pos = 0;
}
-void
-mbfl_memory_device_reset(mbfl_memory_device *device)
+void mbfl_memory_device_reset(mbfl_memory_device *device)
{
- if (device) {
- device->pos = 0;
- }
+ device->pos = 0;
}
-void
-mbfl_memory_device_unput(mbfl_memory_device *device)
+void mbfl_memory_device_unput(mbfl_memory_device *device)
{
if (device->pos > 0) {
device->pos--;
}
}
-mbfl_string *
-mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result)
+mbfl_string* mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result)
{
- if (device && result) {
- result->len = device->pos;
- mbfl_memory_device_output('\0', device);
- result->val = device->buffer;
- device->buffer = NULL;
- device->length = 0;
- device->pos= 0;
- if (result->val == NULL) {
- result->len = 0;
- result = NULL;
- }
- } else {
- result = NULL;
- }
-
+ result->len = device->pos;
+ mbfl_memory_device_output('\0', device);
+ result->val = device->buffer;
+ device->buffer = NULL;
+ device->length = device->pos = 0;
return result;
}
-int
-mbfl_memory_device_output(int c, void *data)
+int mbfl_memory_device_output(int c, void *data)
{
mbfl_memory_device *device = (mbfl_memory_device *)data;
if (device->pos >= device->length) {
/* reallocate buffer */
- size_t newlen;
if (device->length > SIZE_MAX - device->allocsz) {
/* overflow */
return -1;
}
- newlen = device->length + device->allocsz;
+ size_t newlen = device->length + device->allocsz;
device->buffer = erealloc(device->buffer, newlen);
device->length = newlen;
}
@@ -145,20 +106,15 @@ mbfl_memory_device_output(int c, void *data)
return c;
}
-int
-mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc)
+int mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc)
{
return mbfl_memory_device_strncat(device, psrc, strlen(psrc));
}
-int
-mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t len)
+int mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t len)
{
- unsigned char *w;
-
if (len > device->length - device->pos) {
/* reallocate buffer */
- size_t newlen;
if (len > SIZE_MAX - MBFL_MEMORY_DEVICE_ALLOC_SIZE
|| device->length > SIZE_MAX - (len + MBFL_MEMORY_DEVICE_ALLOC_SIZE)) {
@@ -166,50 +122,41 @@ mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, size_t
return -1;
}
- newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
+ size_t newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
device->buffer = erealloc(device->buffer, newlen);
device->length = newlen;
}
- w = &device->buffer[device->pos];
+ unsigned char *w = &device->buffer[device->pos];
memcpy(w, psrc, len);
device->pos += len;
return 0;
}
-int
-mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src)
+int mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src)
{
- return mbfl_memory_device_strncat(dest, (const char *) src->buffer, src->pos);
+ return mbfl_memory_device_strncat(dest, (const char*)src->buffer, src->pos);
}
-void
-mbfl_wchar_device_init(mbfl_wchar_device *device)
+void mbfl_wchar_device_init(mbfl_wchar_device *device)
{
- if (device) {
- device->buffer = NULL;
- device->length = 0;
- device->pos= 0;
- device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
- }
+ device->buffer = NULL;
+ device->length = 0;
+ device->pos = 0;
+ device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
}
-void
-mbfl_wchar_device_clear(mbfl_wchar_device *device)
+void mbfl_wchar_device_clear(mbfl_wchar_device *device)
{
- if (device) {
- if (device->buffer) {
- efree(device->buffer);
- }
- device->buffer = NULL;
- device->length = 0;
- device->pos = 0;
+ if (device->buffer) {
+ efree(device->buffer);
}
+ device->buffer = NULL;
+ device->length = device->pos = 0;
}
-int
-mbfl_wchar_device_output(int c, void *data)
+int mbfl_wchar_device_output(int c, void *data)
{
mbfl_wchar_device *device = (mbfl_wchar_device *)data;
@@ -228,11 +175,10 @@ mbfl_wchar_device_output(int c, void *data)
return -1;
}
- device->buffer = erealloc(device->buffer, newlen*sizeof(int));
+ device->buffer = erealloc(device->buffer, newlen * sizeof(int));
device->length = newlen;
}
device->buffer[device->pos++] = c;
-
return c;
}
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h
index 7e86db3e06..b8a188ec84 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h
@@ -69,6 +69,4 @@ MBFLAPI extern void mbfl_wchar_device_init(mbfl_wchar_device *device);
MBFLAPI extern int mbfl_wchar_device_output(int c, void *data);
MBFLAPI extern void mbfl_wchar_device_clear(mbfl_wchar_device *device);
-
-
#endif /* MBFL_MEMORY_DEVICE_H */
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_string.c b/ext/mbstring/libmbfl/mbfl/mbfl_string.c
index a036356dd2..760634e65d 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_string.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_string.c
@@ -31,31 +31,22 @@
#include "mbfl_string.h"
#include "mbfilter_pass.h"
-/*
- * string object
- */
-void
-mbfl_string_init(mbfl_string *string)
+void mbfl_string_init_set(mbfl_string *string, const mbfl_encoding *encoding)
{
- string->encoding = &mbfl_encoding_pass;
- string->val = (unsigned char*)NULL;
+ string->encoding = encoding;
+ string->val = NULL;
string->len = 0;
}
-void
-mbfl_string_init_set(mbfl_string *string, const mbfl_encoding *encoding)
+void mbfl_string_init(mbfl_string *string)
{
- string->encoding = encoding;
- string->val = (unsigned char*)NULL;
- string->len = 0;
+ mbfl_string_init_set(string, &mbfl_encoding_pass);
}
-void
-mbfl_string_clear(mbfl_string *string)
+void mbfl_string_clear(mbfl_string *string)
{
- if (string->val != (unsigned char*)NULL) {
+ if (string->val) {
efree(string->val);
}
- string->val = (unsigned char*)NULL;
- string->len = 0;
+ mbfl_string_init_set(string, NULL); /* Poison it so any attempt to reuse will fail hard */
}
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index b6395aecdd..6d5541f073 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -34,12 +34,12 @@
#include "libmbfl/mbfl/mbfilter_8bit.h"
#include "libmbfl/mbfl/mbfilter_pass.h"
#include "libmbfl/mbfl/mbfilter_wchar.h"
-#include "libmbfl/filters/mbfilter_ascii.h"
#include "libmbfl/filters/mbfilter_base64.h"
#include "libmbfl/filters/mbfilter_qprint.h"
#include "libmbfl/filters/mbfilter_ucs4.h"
#include "libmbfl/filters/mbfilter_utf8.h"
#include "libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h"
+#include "libmbfl/filters/mbfilter_singlebyte.h"
#include "php_variables.h"
#include "php_globals.h"
@@ -1497,9 +1497,6 @@ PHP_FUNCTION(mb_preferred_mime_name)
}
/* }}} */
-#define IS_SJIS1(c) ((((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xf5)) ? 1 : 0)
-#define IS_SJIS2(c) ((((c)>=0x40 && (c)<=0x7e) || ((c)>=0x80 && (c)<=0xfc)) ? 1 : 0)
-
/* {{{ Parses GET/POST/COOKIE data and sets global variables */
PHP_FUNCTION(mb_parse_str)
{
@@ -2764,8 +2761,7 @@ PHP_FUNCTION(mb_encoding_aliases)
array_init(return_value);
if (encoding->aliases != NULL) {
- const char **alias;
- for (alias = *encoding->aliases; *alias; ++alias) {
+ for (const char **alias = encoding->aliases; *alias; ++alias) {
add_next_index_string(return_value, (char *)*alias);
}
}
@@ -3649,7 +3645,7 @@ PHP_FUNCTION(mb_send_mail)
if (!suppressed_hdrs.cnt_type) {
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER2, sizeof(PHP_MBSTR_MAIL_MIME_HEADER2) - 1);
- p = (char *)mbfl_no2preferred_mime_name(tran_cs->no_encoding);
+ p = (char *)mbfl_encoding_preferred_mime_name(tran_cs);
if (p != NULL) {
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER3, sizeof(PHP_MBSTR_MAIL_MIME_HEADER3) - 1);
mbfl_memory_device_strcat(&device, p);
@@ -3658,7 +3654,7 @@ PHP_FUNCTION(mb_send_mail)
}
if (!suppressed_hdrs.cnt_trans_enc) {
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER4, sizeof(PHP_MBSTR_MAIL_MIME_HEADER4) - 1);
- p = (char *)mbfl_no2preferred_mime_name(body_enc->no_encoding);
+ p = (char *)mbfl_encoding_preferred_mime_name(body_enc);
if (p == NULL) {
p = "7bit";
}
@@ -3859,70 +3855,43 @@ PHP_FUNCTION(mb_get_info)
}
/* }}} */
-
-static inline mbfl_buffer_converter *php_mb_init_convd(const mbfl_encoding *encoding)
+static int mbfl_filt_check_errors(int c, void* data)
{
- mbfl_buffer_converter *convd;
-
- convd = mbfl_buffer_converter_new(encoding, encoding, 0);
- if (convd == NULL) {
- return NULL;
+ if (c & MBFL_WCSGROUP_THROUGH) {
+ (*((mbfl_convert_filter**)data))->num_illegalchar++;
}
- mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE);
- mbfl_buffer_converter_illegal_substchar(convd, 0);
- return convd;
+ return c;
}
+MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const mbfl_encoding *encoding)
+{
+ mbfl_convert_filter *filter = mbfl_convert_filter_new(encoding, &mbfl_encoding_wchar, mbfl_filt_check_errors, NULL, &filter);
-static inline int php_mb_check_encoding_impl(mbfl_buffer_converter *convd, const char *input, size_t length, const mbfl_encoding *encoding) {
- mbfl_string string, result;
-
- mbfl_string_init_set(&string, encoding);
- mbfl_string_init(&result);
-
- string.val = (unsigned char *) input;
- string.len = length;
-
- mbfl_string *ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
- size_t illegalchars = mbfl_buffer_illegalchars(convd);
-
- if (ret != NULL) {
- if (illegalchars == 0 && string.len == result.len && memcmp(string.val, result.val, string.len) == 0) {
- mbfl_string_clear(&result);
- return 1;
+ while (length--) {
+ unsigned char c = *input++;
+ (filter->filter_function)(c, filter);
+ if (filter->num_illegalchar) {
+ mbfl_convert_filter_delete(filter);
+ return 0;
}
- mbfl_string_clear(&result);
}
- return 0;
-}
-
-MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const mbfl_encoding *encoding)
-{
- mbfl_buffer_converter *convd = php_mb_init_convd(encoding);
- /* If this assertion fails this means some memory allocation failure which is a bug */
- ZEND_ASSERT(convd != NULL);
- int result = php_mb_check_encoding_impl(convd, input, length, encoding);
- mbfl_buffer_converter_delete(convd);
+ (filter->filter_flush)(filter);
+ int result = !filter->num_illegalchar;
+ mbfl_convert_filter_delete(filter);
return result;
}
static int php_mb_check_encoding_recursive(HashTable *vars, const mbfl_encoding *encoding)
{
- mbfl_buffer_converter *convd;
zend_long idx;
zend_string *key;
zval *entry;
int valid = 1;
- (void)(idx);
-
- convd = php_mb_init_convd(encoding);
- /* If this assertion fails this means some memory allocation failure which is a bug */
- ZEND_ASSERT(convd != NULL);
+ (void)(idx); /* Suppress spurious compiler warning that `idx` is not used */
if (GC_IS_RECURSIVE(vars)) {
- mbfl_buffer_converter_delete(convd);
php_error_docref(NULL, E_WARNING, "Cannot not handle circular references");
return 0;
}
@@ -3930,14 +3899,14 @@ static int php_mb_check_encoding_recursive(HashTable *vars, const mbfl_encoding
ZEND_HASH_FOREACH_KEY_VAL(vars, idx, key, entry) {
ZVAL_DEREF(entry);
if (key) {
- if (!php_mb_check_encoding_impl(convd, ZSTR_VAL(key), ZSTR_LEN(key), encoding)) {
+ if (!php_mb_check_encoding(ZSTR_VAL(key), ZSTR_LEN(key), encoding)) {
valid = 0;
break;
}
}
switch (Z_TYPE_P(entry)) {
case IS_STRING:
- if (!php_mb_check_encoding_impl(convd, Z_STRVAL_P(entry), Z_STRLEN_P(entry), encoding)) {
+ if (!php_mb_check_encoding(Z_STRVAL_P(entry), Z_STRLEN_P(entry), encoding)) {
valid = 0;
break;
}
@@ -3961,11 +3930,9 @@ static int php_mb_check_encoding_recursive(HashTable *vars, const mbfl_encoding
}
} ZEND_HASH_FOREACH_END();
GC_TRY_UNPROTECT_RECURSION(vars);
- mbfl_buffer_converter_delete(convd);
return valid;
}
-
/* {{{ Check if the string is valid for the specified encoding */
PHP_FUNCTION(mb_check_encoding)
{
diff --git a/ext/mbstring/tests/armscii8_encoding.phpt b/ext/mbstring/tests/armscii8_encoding.phpt
new file mode 100644
index 0000000000..b5bea077d0
--- /dev/null
+++ b/ext/mbstring/tests/armscii8_encoding.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Exhaustive test of verification and conversion of ARMSCII-8 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+srand(111); // Make results consistent
+mb_substitute_character(0x25); // '%'
+
+readConversionTable(__DIR__ . '/data/ARMSCII-8.txt', $toUnicode, $fromUnicode);
+$irreversible = ["\x28", "\x29", "\x2C", "\x2D", "\x2E"];
+
+findInvalidChars($toUnicode, $invalid, $truncated);
+testAllValidChars($toUnicode, 'ARMSCII-8', 'UTF-16BE', false);
+foreach ($irreversible as $char)
+ unset($toUnicode[$char]);
+testAllValidChars($toUnicode, 'ARMSCII-8', 'UTF-16BE');
+testAllInvalidChars($invalid, $toUnicode, 'ARMSCII-8', 'UTF-16BE', "\x00%");
+testTruncatedChars($truncated, 'ARMSCII-8', 'UTF-16BE', "\x00%");
+echo "Tested ARMSCII-8 -> UTF-16BE\n";
+
+findInvalidChars($fromUnicode, $invalid, $unused, array_fill_keys(range(0,0xFF), 2));
+convertAllInvalidChars($invalid, $fromUnicode, 'UTF-16BE', 'ARMSCII-8', '%');
+echo "Tested UTF-16BE -> ARMSCII-8\n";
+?>
+--EXPECT--
+Tested ARMSCII-8 -> UTF-16BE
+Tested UTF-16BE -> ARMSCII-8
diff --git a/ext/mbstring/tests/bug45722.phpt b/ext/mbstring/tests/bug45722.phpt
index 97f6fe5d97..f0649cbb2a 100644
--- a/ext/mbstring/tests/bug45722.phpt
+++ b/ext/mbstring/tests/bug45722.phpt
@@ -7,4 +7,4 @@ Bug #45722 (mb_check_encoding() crashes)
var_dump(mb_check_encoding("&\xc2\xb7 TEST TEST TEST TEST TEST TEST", "HTML-ENTITIES"));
?>
--EXPECT--
-bool(false)
+bool(true)
diff --git a/ext/mbstring/tests/bug47399.phpt b/ext/mbstring/tests/bug47399.phpt
deleted file mode 100644
index 3586e5cc72..0000000000
--- a/ext/mbstring/tests/bug47399.phpt
+++ /dev/null
@@ -1,525 +0,0 @@
---TEST--
-Bug #47399 (mb_check_encoding() returns true for some illegal SJIS characters)
---SKIPIF--
-<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
---FILE--
-<?php
-foreach (array("Shift_JIS", "CP932") as $enc) {
- for ($a = 0; $a < 256; $a++) {
- var_dump(mb_check_encoding("\x81".pack("c", $a), $enc));
- }
-}
-?>
---EXPECT--
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(false)
-bool(false)
-bool(false)
diff --git a/ext/mbstring/tests/bug62545.phpt b/ext/mbstring/tests/bug62545.phpt
deleted file mode 100644
index 49ecc559d8..0000000000
--- a/ext/mbstring/tests/bug62545.phpt
+++ /dev/null
@@ -1,16 +0,0 @@
---TEST--
-Bug #62545 (wrong unicode mapping in some charsets)
---SKIPIF--
-<?php
-if (!extension_loaded('mbstring')) die('skip mbstring extension not available');
-?>
---FILE--
-<?php
-var_dump(
- bin2hex(mb_convert_encoding("\x98", 'UTF-8', 'Windows-1251')),
- bin2hex(mb_convert_encoding("\x81\x8d\x8f\x90\x9d", 'UTF-8', 'Windows-1252'))
-);
-?>
---EXPECT--
-string(6) "efbfbd"
-string(30) "efbfbdefbfbdefbfbdefbfbdefbfbd"
diff --git a/ext/mbstring/tests/cp1251_encoding.phpt b/ext/mbstring/tests/cp1251_encoding.phpt
new file mode 100644
index 0000000000..c2fa370cf4
--- /dev/null
+++ b/ext/mbstring/tests/cp1251_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP1251 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP1251.txt', 'CP1251');
+?>
+--EXPECT--
+Tested CP1251 -> UTF-16BE
+Tested UTF-16BE -> CP1251
diff --git a/ext/mbstring/tests/cp1252_encoding.phpt b/ext/mbstring/tests/cp1252_encoding.phpt
new file mode 100644
index 0000000000..cc2d81fdcd
--- /dev/null
+++ b/ext/mbstring/tests/cp1252_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP1252 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP1252.txt', 'CP1252');
+?>
+--EXPECT--
+Tested CP1252 -> UTF-16BE
+Tested UTF-16BE -> CP1252
diff --git a/ext/mbstring/tests/cp1254_encoding.phpt b/ext/mbstring/tests/cp1254_encoding.phpt
new file mode 100644
index 0000000000..4d5bbf81ab
--- /dev/null
+++ b/ext/mbstring/tests/cp1254_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP1254 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP1254.txt', 'CP1254');
+?>
+--EXPECT--
+Tested CP1254 -> UTF-16BE
+Tested UTF-16BE -> CP1254
diff --git a/ext/mbstring/tests/cp850_encoding.phpt b/ext/mbstring/tests/cp850_encoding.phpt
new file mode 100644
index 0000000000..c736da1e14
--- /dev/null
+++ b/ext/mbstring/tests/cp850_encoding.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Exhaustive test of verification and conversion of CP850 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP850.txt', 'CP850');?>
+--EXPECT--
+Tested CP850 -> UTF-16BE
+Tested UTF-16BE -> CP850
diff --git a/ext/mbstring/tests/cp866_encoding.phpt b/ext/mbstring/tests/cp866_encoding.phpt
new file mode 100644
index 0000000000..774d9e4488
--- /dev/null
+++ b/ext/mbstring/tests/cp866_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of CP866 text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP866.txt', 'CP866');
+?>
+--EXPECT--
+Tested CP866 -> UTF-16BE
+Tested UTF-16BE -> CP866
diff --git a/ext/mbstring/tests/data/8859-1.txt b/ext/mbstring/tests/data/8859-1.txt
new file mode 100644
index 0000000000..3a55afefc4
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-1.txt
@@ -0,0 +1,292 @@
+# 8859-1.TXT
+# Date: 2015-12-02 20:19:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-1:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-1:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-1 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x00A1 # INVERTED EXCLAMATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00AA # FEMININE ORDINAL INDICATOR
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF # INVERTED QUESTION MARK
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic)
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic)
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German)
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic)
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic)
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-10.txt b/ext/mbstring/tests/data/8859-10.txt
new file mode 100644
index 0000000000..0ec67d72ee
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-10.txt
@@ -0,0 +1,292 @@
+# 8859-10.TXT
+# Date: 2015-12-02 21:53:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-10:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 October 11 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-10:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-10 order.
+#
+# Version history
+# 1.0 version new.
+# 1.1 corrected mistake in mapping of 0xA4
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xA3 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xA4 0x012A # LATIN CAPITAL LETTER I WITH MACRON
+0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE
+0xA6 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xA9 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xAA 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAB 0x0166 # LATIN CAPITAL LETTER T WITH STROKE
+0xAC 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x016A # LATIN CAPITAL LETTER U WITH MACRON
+0xAF 0x014A # LATIN CAPITAL LETTER ENG
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 0x0113 # LATIN SMALL LETTER E WITH MACRON
+0xB3 0x0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xB4 0x012B # LATIN SMALL LETTER I WITH MACRON
+0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE
+0xB6 0x0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x013C # LATIN SMALL LETTER L WITH CEDILLA
+0xB9 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xBA 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xBB 0x0167 # LATIN SMALL LETTER T WITH STROKE
+0xBC 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xBD 0x2015 # HORIZONTAL BAR
+0xBE 0x016B # LATIN SMALL LETTER U WITH MACRON
+0xBF 0x014B # LATIN SMALL LETTER ENG
+0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic)
+0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x0168 # LATIN CAPITAL LETTER U WITH TILDE
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic)
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German)
+0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic)
+0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x0169 # LATIN SMALL LETTER U WITH TILDE
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic)
+0xFF 0x0138 # LATIN SMALL LETTER KRA
diff --git a/ext/mbstring/tests/data/8859-11.txt b/ext/mbstring/tests/data/8859-11.txt
new file mode 100644
index 0000000000..5334e3c276
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-11.txt
@@ -0,0 +1,286 @@
+# 8859-11.TXT
+# Date: 2015-12-02 21:55:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-11:2001 to Unicode
+# Unicode version: 3.2
+# Table version: 2.0
+# Table format: Format A
+# Date: 2002 October 7 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-11:2001 characters map into Unicode.
+#
+# ISO/IEC 8859-11:2001 is equivalent to TIS 620-2533 (1990) with
+# the addition of 0xA0 NO-BREAK SPACE.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-11 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-11 order.
+#
+# Version history:
+# 2002 October 7 Created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0E01 # THAI CHARACTER KO KAI
+0xA2 0x0E02 # THAI CHARACTER KHO KHAI
+0xA3 0x0E03 # THAI CHARACTER KHO KHUAT
+0xA4 0x0E04 # THAI CHARACTER KHO KHWAI
+0xA5 0x0E05 # THAI CHARACTER KHO KHON
+0xA6 0x0E06 # THAI CHARACTER KHO RAKHANG
+0xA7 0x0E07 # THAI CHARACTER NGO NGU
+0xA8 0x0E08 # THAI CHARACTER CHO CHAN
+0xA9 0x0E09 # THAI CHARACTER CHO CHING
+0xAA 0x0E0A # THAI CHARACTER CHO CHANG
+0xAB 0x0E0B # THAI CHARACTER SO SO
+0xAC 0x0E0C # THAI CHARACTER CHO CHOE
+0xAD 0x0E0D # THAI CHARACTER YO YING
+0xAE 0x0E0E # THAI CHARACTER DO CHADA
+0xAF 0x0E0F # THAI CHARACTER TO PATAK
+0xB0 0x0E10 # THAI CHARACTER THO THAN
+0xB1 0x0E11 # THAI CHARACTER THO NANGMONTHO
+0xB2 0x0E12 # THAI CHARACTER THO PHUTHAO
+0xB3 0x0E13 # THAI CHARACTER NO NEN
+0xB4 0x0E14 # THAI CHARACTER DO DEK
+0xB5 0x0E15 # THAI CHARACTER TO TAO
+0xB6 0x0E16 # THAI CHARACTER THO THUNG
+0xB7 0x0E17 # THAI CHARACTER THO THAHAN
+0xB8 0x0E18 # THAI CHARACTER THO THONG
+0xB9 0x0E19 # THAI CHARACTER NO NU
+0xBA 0x0E1A # THAI CHARACTER BO BAIMAI
+0xBB 0x0E1B # THAI CHARACTER PO PLA
+0xBC 0x0E1C # THAI CHARACTER PHO PHUNG
+0xBD 0x0E1D # THAI CHARACTER FO FA
+0xBE 0x0E1E # THAI CHARACTER PHO PHAN
+0xBF 0x0E1F # THAI CHARACTER FO FAN
+0xC0 0x0E20 # THAI CHARACTER PHO SAMPHAO
+0xC1 0x0E21 # THAI CHARACTER MO MA
+0xC2 0x0E22 # THAI CHARACTER YO YAK
+0xC3 0x0E23 # THAI CHARACTER RO RUA
+0xC4 0x0E24 # THAI CHARACTER RU
+0xC5 0x0E25 # THAI CHARACTER LO LING
+0xC6 0x0E26 # THAI CHARACTER LU
+0xC7 0x0E27 # THAI CHARACTER WO WAEN
+0xC8 0x0E28 # THAI CHARACTER SO SALA
+0xC9 0x0E29 # THAI CHARACTER SO RUSI
+0xCA 0x0E2A # THAI CHARACTER SO SUA
+0xCB 0x0E2B # THAI CHARACTER HO HIP
+0xCC 0x0E2C # THAI CHARACTER LO CHULA
+0xCD 0x0E2D # THAI CHARACTER O ANG
+0xCE 0x0E2E # THAI CHARACTER HO NOKHUK
+0xCF 0x0E2F # THAI CHARACTER PAIYANNOI
+0xD0 0x0E30 # THAI CHARACTER SARA A
+0xD1 0x0E31 # THAI CHARACTER MAI HAN-AKAT
+0xD2 0x0E32 # THAI CHARACTER SARA AA
+0xD3 0x0E33 # THAI CHARACTER SARA AM
+0xD4 0x0E34 # THAI CHARACTER SARA I
+0xD5 0x0E35 # THAI CHARACTER SARA II
+0xD6 0x0E36 # THAI CHARACTER SARA UE
+0xD7 0x0E37 # THAI CHARACTER SARA UEE
+0xD8 0x0E38 # THAI CHARACTER SARA U
+0xD9 0x0E39 # THAI CHARACTER SARA UU
+0xDA 0x0E3A # THAI CHARACTER PHINTHU
+0xDF 0x0E3F # THAI CURRENCY SYMBOL BAHT
+0xE0 0x0E40 # THAI CHARACTER SARA E
+0xE1 0x0E41 # THAI CHARACTER SARA AE
+0xE2 0x0E42 # THAI CHARACTER SARA O
+0xE3 0x0E43 # THAI CHARACTER SARA AI MAIMUAN
+0xE4 0x0E44 # THAI CHARACTER SARA AI MAIMALAI
+0xE5 0x0E45 # THAI CHARACTER LAKKHANGYAO
+0xE6 0x0E46 # THAI CHARACTER MAIYAMOK
+0xE7 0x0E47 # THAI CHARACTER MAITAIKHU
+0xE8 0x0E48 # THAI CHARACTER MAI EK
+0xE9 0x0E49 # THAI CHARACTER MAI THO
+0xEA 0x0E4A # THAI CHARACTER MAI TRI
+0xEB 0x0E4B # THAI CHARACTER MAI CHATTAWA
+0xEC 0x0E4C # THAI CHARACTER THANTHAKHAT
+0xED 0x0E4D # THAI CHARACTER NIKHAHIT
+0xEE 0x0E4E # THAI CHARACTER YAMAKKAN
+0xEF 0x0E4F # THAI CHARACTER FONGMAN
+0xF0 0x0E50 # THAI DIGIT ZERO
+0xF1 0x0E51 # THAI DIGIT ONE
+0xF2 0x0E52 # THAI DIGIT TWO
+0xF3 0x0E53 # THAI DIGIT THREE
+0xF4 0x0E54 # THAI DIGIT FOUR
+0xF5 0x0E55 # THAI DIGIT FIVE
+0xF6 0x0E56 # THAI DIGIT SIX
+0xF7 0x0E57 # THAI DIGIT SEVEN
+0xF8 0x0E58 # THAI DIGIT EIGHT
+0xF9 0x0E59 # THAI DIGIT NINE
+0xFA 0x0E5A # THAI CHARACTER ANGKHANKHU
+0xFB 0x0E5B # THAI CHARACTER KHOMUT
diff --git a/ext/mbstring/tests/data/8859-13.txt b/ext/mbstring/tests/data/8859-13.txt
new file mode 100644
index 0000000000..b613dc00e1
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-13.txt
@@ -0,0 +1,291 @@
+# 8859-13.TXT
+# Date: 2015-12-02 22:03:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-13:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-13:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-13 order.
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x201D # RIGHT DOUBLE QUOTATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00C6 # LATIN CAPITAL LETTER AE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x201C # LEFT DOUBLE QUOTATION MARK
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x0157 # LATIN SMALL LETTER R WITH CEDILLA
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xBF 0x00E6 # LATIN SMALL LETTER AE
+0xC0 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xC1 0x012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC2 0x0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC3 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xC7 0x0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xCB 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCC 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xCD 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xCE 0x012A # LATIN CAPITAL LETTER I WITH MACRON
+0xCF 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xD0 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xD9 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xDA 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xDB 0x016A # LATIN CAPITAL LETTER U WITH MACRON
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xDE 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German)
+0xE0 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xE1 0x012F # LATIN SMALL LETTER I WITH OGONEK
+0xE2 0x0101 # LATIN SMALL LETTER A WITH MACRON
+0xE3 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xE7 0x0113 # LATIN SMALL LETTER E WITH MACRON
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0xEB 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xEC 0x0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xED 0x0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xEE 0x012B # LATIN SMALL LETTER I WITH MACRON
+0xEF 0x013C # LATIN SMALL LETTER L WITH CEDILLA
+0xF0 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 0x0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x014D # LATIN SMALL LETTER O WITH MACRON
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x0173 # LATIN SMALL LETTER U WITH OGONEK
+0xF9 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0xFA 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0xFB 0x016B # LATIN SMALL LETTER U WITH MACRON
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xFE 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xFF 0x2019 # RIGHT SINGLE QUOTATION MARK
diff --git a/ext/mbstring/tests/data/8859-14.txt b/ext/mbstring/tests/data/8859-14.txt
new file mode 100644
index 0000000000..3c3a02466b
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-14.txt
@@ -0,0 +1,292 @@
+# 8859-14.TXT
+# Date: 2015-12-02 22:05:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-14:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+# Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-14:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-14 order.
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+0xA2 0x1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xA5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE
+0xA6 0x1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x1E80 # LATIN CAPITAL LETTER W WITH GRAVE
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+0xAB 0x1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+0xAC 0x1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xB0 0x1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+0xB1 0x1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+0xB2 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xB3 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+0xB4 0x1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+0xB5 0x1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+0xB8 0x1E81 # LATIN SMALL LETTER W WITH GRAVE
+0xB9 0x1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+0xBA 0x1E83 # LATIN SMALL LETTER W WITH ACUTE
+0xBB 0x1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+0xBC 0x1EF3 # LATIN SMALL LETTER Y WITH GRAVE
+0xBD 0x1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS
+0xBE 0x1E85 # LATIN SMALL LETTER W WITH DIAERESIS
+0xBF 0x1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-15.txt b/ext/mbstring/tests/data/8859-15.txt
new file mode 100644
index 0000000000..f21a763600
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-15.txt
@@ -0,0 +1,294 @@
+# 8859-15.TXT
+# Date: 2015-12-02 22:06:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-15:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+# Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-15:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-15 order.
+#
+# Version history
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x00A1 # INVERTED EXCLAMATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x20AC # EURO SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00AA # FEMININE ORDINAL INDICATOR
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x0152 # LATIN CAPITAL LIGATURE OE
+0xBD 0x0153 # LATIN SMALL LIGATURE OE
+0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xBF 0x00BF # INVERTED QUESTION MARK
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 # LATIN CAPITAL LETTER ETH
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE # LATIN CAPITAL LETTER THORN
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 # LATIN SMALL LETTER ETH
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE # LATIN SMALL LETTER THORN
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-16.txt b/ext/mbstring/tests/data/8859-16.txt
new file mode 100644
index 0000000000..4a05225a78
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-16.txt
@@ -0,0 +1,293 @@
+# 8859-16.TXT
+# Date: 2015-12-02 22:08:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-16:2001 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 2001 July 26 (header updated: 2015 December 02)
+# Authors: Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>
+#
+# Copyright (c) 1999-2001 Unicode, Inc. All Rights reserved.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-16:2001 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-16 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-16 order.
+#
+# Version history
+# 1.0 version: created
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xA4 0x20AC # EURO SIGN
+0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK
+0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x0218 # LATIN CAPITAL LETTER S WITH COMMA BELOW
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xB5 0x201D # RIGHT DOUBLE QUOTATION MARK
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xB9 0x010D # LATIN SMALL LETTER C WITH CARON
+0xBA 0x0219 # LATIN SMALL LETTER S WITH COMMA BELOW
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x0152 # LATIN CAPITAL LIGATURE OE
+0xBD 0x0153 # LATIN SMALL LIGATURE OE
+0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xD8 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xDE 0x021A # LATIN CAPITAL LETTER T WITH COMMA BELOW
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0xF8 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xFE 0x021B # LATIN SMALL LETTER T WITH COMMA BELOW
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/8859-2.txt b/ext/mbstring/tests/data/8859-2.txt
new file mode 100644
index 0000000000..20da9ba993
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-2.txt
@@ -0,0 +1,292 @@
+# 8859-2.TXT
+# Date: 2015-12-02 21:34:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-2:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-2:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-2 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x02D8 # BREVE
+0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON
+0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON
+0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 0x02DB # OGONEK
+0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x013E # LATIN SMALL LETTER L WITH CARON
+0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0xB7 0x02C7 # CARON
+0xB8 0x00B8 # CEDILLA
+0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON
+0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0xBD 0x02DD # DOUBLE ACUTE ACCENT
+0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE
+0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON
+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON
+0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE
+0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x011B # LATIN SMALL LETTER E WITH CARON
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x010F # LATIN SMALL LETTER D WITH CARON
+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON
+0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA
+0xFF 0x02D9 # DOT ABOVE
diff --git a/ext/mbstring/tests/data/8859-3.txt b/ext/mbstring/tests/data/8859-3.txt
new file mode 100644
index 0000000000..5a6c5de547
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-3.txt
@@ -0,0 +1,285 @@
+# 8859-3.TXT
+# Date: 2015-12-02 21:39:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-3:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-3:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-3 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0126 # LATIN CAPITAL LETTER H WITH STROKE
+0xA2 0x02D8 # BREVE
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA6 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB 0x011E # LATIN CAPITAL LETTER G WITH BREVE
+0xAC 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0xAD 0x00AD # SOFT HYPHEN
+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0127 # LATIN SMALL LETTER H WITH STROKE
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x0131 # LATIN SMALL LETTER DOTLESS I
+0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0xBB 0x011F # LATIN SMALL LETTER G WITH BREVE
+0xBC 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+0xC6 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x016C # LATIN CAPITAL LETTER U WITH BREVE
+0xDE 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE
+0xE6 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x016D # LATIN SMALL LETTER U WITH BREVE
+0xFE 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+0xFF 0x02D9 # DOT ABOVE
diff --git a/ext/mbstring/tests/data/8859-4.txt b/ext/mbstring/tests/data/8859-4.txt
new file mode 100644
index 0000000000..e2f5e725fd
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-4.txt
@@ -0,0 +1,292 @@
+# 8859-4.TXT
+# Date: 2015-12-02 21:41:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-4:1998 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-4:1998 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-4 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x0138 # LATIN SMALL LETTER KRA
+0xA3 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE
+0xA6 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAA 0x0112 # LATIN CAPITAL LETTER E WITH MACRON
+0xAB 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+0xAC 0x0166 # LATIN CAPITAL LETTER T WITH STROKE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 0x02DB # OGONEK
+0xB3 0x0157 # LATIN SMALL LETTER R WITH CEDILLA
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE
+0xB6 0x013C # LATIN SMALL LETTER L WITH CEDILLA
+0xB7 0x02C7 # CARON
+0xB8 0x00B8 # CEDILLA
+0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xBA 0x0113 # LATIN SMALL LETTER E WITH MACRON
+0xBB 0x0123 # LATIN SMALL LETTER G WITH CEDILLA
+0xBC 0x0167 # LATIN SMALL LETTER T WITH STROKE
+0xBD 0x014A # LATIN CAPITAL LETTER ENG
+0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xBF 0x014B # LATIN SMALL LETTER ENG
+0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x012A # LATIN CAPITAL LETTER I WITH MACRON
+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON
+0xD3 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0168 # LATIN CAPITAL LETTER U WITH TILDE
+0xDE 0x016A # LATIN CAPITAL LETTER U WITH MACRON
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x012B # LATIN SMALL LETTER I WITH MACRON
+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA
+0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON
+0xF3 0x0137 # LATIN SMALL LETTER K WITH CEDILLA
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0169 # LATIN SMALL LETTER U WITH TILDE
+0xFE 0x016B # LATIN SMALL LETTER U WITH MACRON
+0xFF 0x02D9 # DOT ABOVE
diff --git a/ext/mbstring/tests/data/8859-5.txt b/ext/mbstring/tests/data/8859-5.txt
new file mode 100644
index 0000000000..a574c3feaf
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-5.txt
@@ -0,0 +1,292 @@
+# 8859-5.TXT
+# Date: 2015-12-02 21:43:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-5:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-5:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-5 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0401 # CYRILLIC CAPITAL LETTER IO
+0xA2 0x0402 # CYRILLIC CAPITAL LETTER DJE
+0xA3 0x0403 # CYRILLIC CAPITAL LETTER GJE
+0xA4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xA5 0x0405 # CYRILLIC CAPITAL LETTER DZE
+0xA6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xA7 0x0407 # CYRILLIC CAPITAL LETTER YI
+0xA8 0x0408 # CYRILLIC CAPITAL LETTER JE
+0xA9 0x0409 # CYRILLIC CAPITAL LETTER LJE
+0xAA 0x040A # CYRILLIC CAPITAL LETTER NJE
+0xAB 0x040B # CYRILLIC CAPITAL LETTER TSHE
+0xAC 0x040C # CYRILLIC CAPITAL LETTER KJE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x040E # CYRILLIC CAPITAL LETTER SHORT U
+0xAF 0x040F # CYRILLIC CAPITAL LETTER DZHE
+0xB0 0x0410 # CYRILLIC CAPITAL LETTER A
+0xB1 0x0411 # CYRILLIC CAPITAL LETTER BE
+0xB2 0x0412 # CYRILLIC CAPITAL LETTER VE
+0xB3 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0xB4 0x0414 # CYRILLIC CAPITAL LETTER DE
+0xB5 0x0415 # CYRILLIC CAPITAL LETTER IE
+0xB6 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0xB7 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0xB8 0x0418 # CYRILLIC CAPITAL LETTER I
+0xB9 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xBA 0x041A # CYRILLIC CAPITAL LETTER KA
+0xBB 0x041B # CYRILLIC CAPITAL LETTER EL
+0xBC 0x041C # CYRILLIC CAPITAL LETTER EM
+0xBD 0x041D # CYRILLIC CAPITAL LETTER EN
+0xBE 0x041E # CYRILLIC CAPITAL LETTER O
+0xBF 0x041F # CYRILLIC CAPITAL LETTER PE
+0xC0 0x0420 # CYRILLIC CAPITAL LETTER ER
+0xC1 0x0421 # CYRILLIC CAPITAL LETTER ES
+0xC2 0x0422 # CYRILLIC CAPITAL LETTER TE
+0xC3 0x0423 # CYRILLIC CAPITAL LETTER U
+0xC4 0x0424 # CYRILLIC CAPITAL LETTER EF
+0xC5 0x0425 # CYRILLIC CAPITAL LETTER HA
+0xC6 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0xC7 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0xC8 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0xC9 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xCA 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0xCB 0x042B # CYRILLIC CAPITAL LETTER YERU
+0xCC 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xCD 0x042D # CYRILLIC CAPITAL LETTER E
+0xCE 0x042E # CYRILLIC CAPITAL LETTER YU
+0xCF 0x042F # CYRILLIC CAPITAL LETTER YA
+0xD0 0x0430 # CYRILLIC SMALL LETTER A
+0xD1 0x0431 # CYRILLIC SMALL LETTER BE
+0xD2 0x0432 # CYRILLIC SMALL LETTER VE
+0xD3 0x0433 # CYRILLIC SMALL LETTER GHE
+0xD4 0x0434 # CYRILLIC SMALL LETTER DE
+0xD5 0x0435 # CYRILLIC SMALL LETTER IE
+0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE
+0xD7 0x0437 # CYRILLIC SMALL LETTER ZE
+0xD8 0x0438 # CYRILLIC SMALL LETTER I
+0xD9 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0xDA 0x043A # CYRILLIC SMALL LETTER KA
+0xDB 0x043B # CYRILLIC SMALL LETTER EL
+0xDC 0x043C # CYRILLIC SMALL LETTER EM
+0xDD 0x043D # CYRILLIC SMALL LETTER EN
+0xDE 0x043E # CYRILLIC SMALL LETTER O
+0xDF 0x043F # CYRILLIC SMALL LETTER PE
+0xE0 0x0440 # CYRILLIC SMALL LETTER ER
+0xE1 0x0441 # CYRILLIC SMALL LETTER ES
+0xE2 0x0442 # CYRILLIC SMALL LETTER TE
+0xE3 0x0443 # CYRILLIC SMALL LETTER U
+0xE4 0x0444 # CYRILLIC SMALL LETTER EF
+0xE5 0x0445 # CYRILLIC SMALL LETTER HA
+0xE6 0x0446 # CYRILLIC SMALL LETTER TSE
+0xE7 0x0447 # CYRILLIC SMALL LETTER CHE
+0xE8 0x0448 # CYRILLIC SMALL LETTER SHA
+0xE9 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0xEA 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0xEB 0x044B # CYRILLIC SMALL LETTER YERU
+0xEC 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xED 0x044D # CYRILLIC SMALL LETTER E
+0xEE 0x044E # CYRILLIC SMALL LETTER YU
+0xEF 0x044F # CYRILLIC SMALL LETTER YA
+0xF0 0x2116 # NUMERO SIGN
+0xF1 0x0451 # CYRILLIC SMALL LETTER IO
+0xF2 0x0452 # CYRILLIC SMALL LETTER DJE
+0xF3 0x0453 # CYRILLIC SMALL LETTER GJE
+0xF4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0xF5 0x0455 # CYRILLIC SMALL LETTER DZE
+0xF6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xF7 0x0457 # CYRILLIC SMALL LETTER YI
+0xF8 0x0458 # CYRILLIC SMALL LETTER JE
+0xF9 0x0459 # CYRILLIC SMALL LETTER LJE
+0xFA 0x045A # CYRILLIC SMALL LETTER NJE
+0xFB 0x045B # CYRILLIC SMALL LETTER TSHE
+0xFC 0x045C # CYRILLIC SMALL LETTER KJE
+0xFD 0x00A7 # SECTION SIGN
+0xFE 0x045E # CYRILLIC SMALL LETTER SHORT U
+0xFF 0x045F # CYRILLIC SMALL LETTER DZHE
diff --git a/ext/mbstring/tests/data/8859-6.txt b/ext/mbstring/tests/data/8859-6.txt
new file mode 100644
index 0000000000..fed0af3631
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-6.txt
@@ -0,0 +1,249 @@
+# 8859-6.TXT
+# Date: 2015-12-02 21:44:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-6:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-6:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-6 order.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead
+# of the Arabic digits (U+0660..U+0669).
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA4 0x00A4 # CURRENCY SIGN
+0xAC 0x060C # ARABIC COMMA
+0xAD 0x00AD # SOFT HYPHEN
+0xBB 0x061B # ARABIC SEMICOLON
+0xBF 0x061F # ARABIC QUESTION MARK
+0xC1 0x0621 # ARABIC LETTER HAMZA
+0xC2 0x0622 # ARABIC LETTER ALEF WITH MADDA ABOVE
+0xC3 0x0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE
+0xC4 0x0624 # ARABIC LETTER WAW WITH HAMZA ABOVE
+0xC5 0x0625 # ARABIC LETTER ALEF WITH HAMZA BELOW
+0xC6 0x0626 # ARABIC LETTER YEH WITH HAMZA ABOVE
+0xC7 0x0627 # ARABIC LETTER ALEF
+0xC8 0x0628 # ARABIC LETTER BEH
+0xC9 0x0629 # ARABIC LETTER TEH MARBUTA
+0xCA 0x062A # ARABIC LETTER TEH
+0xCB 0x062B # ARABIC LETTER THEH
+0xCC 0x062C # ARABIC LETTER JEEM
+0xCD 0x062D # ARABIC LETTER HAH
+0xCE 0x062E # ARABIC LETTER KHAH
+0xCF 0x062F # ARABIC LETTER DAL
+0xD0 0x0630 # ARABIC LETTER THAL
+0xD1 0x0631 # ARABIC LETTER REH
+0xD2 0x0632 # ARABIC LETTER ZAIN
+0xD3 0x0633 # ARABIC LETTER SEEN
+0xD4 0x0634 # ARABIC LETTER SHEEN
+0xD5 0x0635 # ARABIC LETTER SAD
+0xD6 0x0636 # ARABIC LETTER DAD
+0xD7 0x0637 # ARABIC LETTER TAH
+0xD8 0x0638 # ARABIC LETTER ZAH
+0xD9 0x0639 # ARABIC LETTER AIN
+0xDA 0x063A # ARABIC LETTER GHAIN
+0xE0 0x0640 # ARABIC TATWEEL
+0xE1 0x0641 # ARABIC LETTER FEH
+0xE2 0x0642 # ARABIC LETTER QAF
+0xE3 0x0643 # ARABIC LETTER KAF
+0xE4 0x0644 # ARABIC LETTER LAM
+0xE5 0x0645 # ARABIC LETTER MEEM
+0xE6 0x0646 # ARABIC LETTER NOON
+0xE7 0x0647 # ARABIC LETTER HEH
+0xE8 0x0648 # ARABIC LETTER WAW
+0xE9 0x0649 # ARABIC LETTER ALEF MAKSURA
+0xEA 0x064A # ARABIC LETTER YEH
+0xEB 0x064B # ARABIC FATHATAN
+0xEC 0x064C # ARABIC DAMMATAN
+0xED 0x064D # ARABIC KASRATAN
+0xEE 0x064E # ARABIC FATHA
+0xEF 0x064F # ARABIC DAMMA
+0xF0 0x0650 # ARABIC KASRA
+0xF1 0x0651 # ARABIC SHADDA
+0xF2 0x0652 # ARABIC SUKUN
diff --git a/ext/mbstring/tests/data/8859-7.txt b/ext/mbstring/tests/data/8859-7.txt
new file mode 100644
index 0000000000..49131a4d94
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-7.txt
@@ -0,0 +1,299 @@
+# 8859-7.TXT
+# Date: 2015-12-02 21:47:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO 8859-7:2003 to Unicode
+# Unicode version: 4.0
+# Table version: 3.0
+# Table format: Format A
+# Date: 2003-Nov-12 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO 8859-7:2003 characters map into Unicode.
+#
+# ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928,
+# and ECMA 118. ISO 8859-7:2003 adds two currency signs
+# and one other character not in the earlier standard.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO 8859-7 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO 8859-7 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+# Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7
+# Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7
+#
+# 2.0 version updates 1.0 version by adding mappings for the
+# three newly added characters 0xA4, 0xA5, 0xAA.
+#
+# 3.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x2018 # LEFT SINGLE QUOTATION MARK
+0xA2 0x2019 # RIGHT SINGLE QUOTATION MARK
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x20AC # EURO SIGN
+0xA5 0x20AF # DRACHMA SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x037A # GREEK YPOGEGRAMMENI
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAF 0x2015 # HORIZONTAL BAR
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x0384 # GREEK TONOS
+0xB5 0x0385 # GREEK DIALYTIKA TONOS
+0xB6 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+0xB9 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+0xBA 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+0xBF 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+0xC0 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0xC1 0x0391 # GREEK CAPITAL LETTER ALPHA
+0xC2 0x0392 # GREEK CAPITAL LETTER BETA
+0xC3 0x0393 # GREEK CAPITAL LETTER GAMMA
+0xC4 0x0394 # GREEK CAPITAL LETTER DELTA
+0xC5 0x0395 # GREEK CAPITAL LETTER EPSILON
+0xC6 0x0396 # GREEK CAPITAL LETTER ZETA
+0xC7 0x0397 # GREEK CAPITAL LETTER ETA
+0xC8 0x0398 # GREEK CAPITAL LETTER THETA
+0xC9 0x0399 # GREEK CAPITAL LETTER IOTA
+0xCA 0x039A # GREEK CAPITAL LETTER KAPPA
+0xCB 0x039B # GREEK CAPITAL LETTER LAMDA
+0xCC 0x039C # GREEK CAPITAL LETTER MU
+0xCD 0x039D # GREEK CAPITAL LETTER NU
+0xCE 0x039E # GREEK CAPITAL LETTER XI
+0xCF 0x039F # GREEK CAPITAL LETTER OMICRON
+0xD0 0x03A0 # GREEK CAPITAL LETTER PI
+0xD1 0x03A1 # GREEK CAPITAL LETTER RHO
+0xD3 0x03A3 # GREEK CAPITAL LETTER SIGMA
+0xD4 0x03A4 # GREEK CAPITAL LETTER TAU
+0xD5 0x03A5 # GREEK CAPITAL LETTER UPSILON
+0xD6 0x03A6 # GREEK CAPITAL LETTER PHI
+0xD7 0x03A7 # GREEK CAPITAL LETTER CHI
+0xD8 0x03A8 # GREEK CAPITAL LETTER PSI
+0xD9 0x03A9 # GREEK CAPITAL LETTER OMEGA
+0xDA 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+0xDB 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+0xDC 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+0xDD 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+0xDE 0x03AE # GREEK SMALL LETTER ETA WITH TONOS
+0xDF 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS
+0xE0 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+0xE1 0x03B1 # GREEK SMALL LETTER ALPHA
+0xE2 0x03B2 # GREEK SMALL LETTER BETA
+0xE3 0x03B3 # GREEK SMALL LETTER GAMMA
+0xE4 0x03B4 # GREEK SMALL LETTER DELTA
+0xE5 0x03B5 # GREEK SMALL LETTER EPSILON
+0xE6 0x03B6 # GREEK SMALL LETTER ZETA
+0xE7 0x03B7 # GREEK SMALL LETTER ETA
+0xE8 0x03B8 # GREEK SMALL LETTER THETA
+0xE9 0x03B9 # GREEK SMALL LETTER IOTA
+0xEA 0x03BA # GREEK SMALL LETTER KAPPA
+0xEB 0x03BB # GREEK SMALL LETTER LAMDA
+0xEC 0x03BC # GREEK SMALL LETTER MU
+0xED 0x03BD # GREEK SMALL LETTER NU
+0xEE 0x03BE # GREEK SMALL LETTER XI
+0xEF 0x03BF # GREEK SMALL LETTER OMICRON
+0xF0 0x03C0 # GREEK SMALL LETTER PI
+0xF1 0x03C1 # GREEK SMALL LETTER RHO
+0xF2 0x03C2 # GREEK SMALL LETTER FINAL SIGMA
+0xF3 0x03C3 # GREEK SMALL LETTER SIGMA
+0xF4 0x03C4 # GREEK SMALL LETTER TAU
+0xF5 0x03C5 # GREEK SMALL LETTER UPSILON
+0xF6 0x03C6 # GREEK SMALL LETTER PHI
+0xF7 0x03C7 # GREEK SMALL LETTER CHI
+0xF8 0x03C8 # GREEK SMALL LETTER PSI
+0xF9 0x03C9 # GREEK SMALL LETTER OMEGA
+0xFA 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+0xFB 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+0xFC 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+0xFD 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+0xFE 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS
diff --git a/ext/mbstring/tests/data/8859-8.txt b/ext/mbstring/tests/data/8859-8.txt
new file mode 100644
index 0000000000..ff068f7083
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-8.txt
@@ -0,0 +1,258 @@
+# 8859-8.TXT
+# Date: 2015-12-02 21:50:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-8:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 2000-Jan-03 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-8:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-8 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+# 1.1 version updates to the published 8859-8:1999, correcting
+# the mapping of 0xAF and adding mappings for LRM and RLM.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00D7 # MULTIPLICATION SIGN
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00F7 # DIVISION SIGN
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xDF 0x2017 # DOUBLE LOW LINE
+0xE0 0x05D0 # HEBREW LETTER ALEF
+0xE1 0x05D1 # HEBREW LETTER BET
+0xE2 0x05D2 # HEBREW LETTER GIMEL
+0xE3 0x05D3 # HEBREW LETTER DALET
+0xE4 0x05D4 # HEBREW LETTER HE
+0xE5 0x05D5 # HEBREW LETTER VAV
+0xE6 0x05D6 # HEBREW LETTER ZAYIN
+0xE7 0x05D7 # HEBREW LETTER HET
+0xE8 0x05D8 # HEBREW LETTER TET
+0xE9 0x05D9 # HEBREW LETTER YOD
+0xEA 0x05DA # HEBREW LETTER FINAL KAF
+0xEB 0x05DB # HEBREW LETTER KAF
+0xEC 0x05DC # HEBREW LETTER LAMED
+0xED 0x05DD # HEBREW LETTER FINAL MEM
+0xEE 0x05DE # HEBREW LETTER MEM
+0xEF 0x05DF # HEBREW LETTER FINAL NUN
+0xF0 0x05E0 # HEBREW LETTER NUN
+0xF1 0x05E1 # HEBREW LETTER SAMEKH
+0xF2 0x05E2 # HEBREW LETTER AYIN
+0xF3 0x05E3 # HEBREW LETTER FINAL PE
+0xF4 0x05E4 # HEBREW LETTER PE
+0xF5 0x05E5 # HEBREW LETTER FINAL TSADI
+0xF6 0x05E6 # HEBREW LETTER TSADI
+0xF7 0x05E7 # HEBREW LETTER QOF
+0xF8 0x05E8 # HEBREW LETTER RESH
+0xF9 0x05E9 # HEBREW LETTER SHIN
+0xFA 0x05EA # HEBREW LETTER TAV
+0xFD 0x200E # LEFT-TO-RIGHT MARK
+0xFE 0x200F # RIGHT-TO-LEFT MARK
diff --git a/ext/mbstring/tests/data/8859-9.txt b/ext/mbstring/tests/data/8859-9.txt
new file mode 100644
index 0000000000..d0c9ff94e4
--- /dev/null
+++ b/ext/mbstring/tests/data/8859-9.txt
@@ -0,0 +1,294 @@
+# 8859-9.TXT
+# Date: 2015-12-02 21:51:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: ISO/IEC 8859-9:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 1999 July 27 (header updated: 2015 December 02)
+# Authors: Ken Whistler <ken@unicode.org>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-9:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-9 order.
+#
+# ISO/IEC 8859-9 is also equivalent to ISO-IR-148.
+#
+# Version history
+# 1.0 version: updates 0.1 version by adding mappings for all
+# control characters.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 # <control>
+0x81 0x0081 # <control>
+0x82 0x0082 # <control>
+0x83 0x0083 # <control>
+0x84 0x0084 # <control>
+0x85 0x0085 # <control>
+0x86 0x0086 # <control>
+0x87 0x0087 # <control>
+0x88 0x0088 # <control>
+0x89 0x0089 # <control>
+0x8A 0x008A # <control>
+0x8B 0x008B # <control>
+0x8C 0x008C # <control>
+0x8D 0x008D # <control>
+0x8E 0x008E # <control>
+0x8F 0x008F # <control>
+0x90 0x0090 # <control>
+0x91 0x0091 # <control>
+0x92 0x0092 # <control>
+0x93 0x0093 # <control>
+0x94 0x0094 # <control>
+0x95 0x0095 # <control>
+0x96 0x0096 # <control>
+0x97 0x0097 # <control>
+0x98 0x0098 # <control>
+0x99 0x0099 # <control>
+0x9A 0x009A # <control>
+0x9B 0x009B # <control>
+0x9C 0x009C # <control>
+0x9D 0x009D # <control>
+0x9E 0x009E # <control>
+0x9F 0x009F # <control>
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x00A1 # INVERTED EXCLAMATION MARK
+0xA2 0x00A2 # CENT SIGN
+0xA3 0x00A3 # POUND SIGN
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x00A5 # YEN SIGN
+0xA6 0x00A6 # BROKEN BAR
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x00A9 # COPYRIGHT SIGN
+0xAA 0x00AA # FEMININE ORDINAL INDICATOR
+0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC # NOT SIGN
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x00AE # REGISTERED SIGN
+0xAF 0x00AF # MACRON
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x00B1 # PLUS-MINUS SIGN
+0xB2 0x00B2 # SUPERSCRIPT TWO
+0xB3 0x00B3 # SUPERSCRIPT THREE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x00B5 # MICRO SIGN
+0xB6 0x00B6 # PILCROW SIGN
+0xB7 0x00B7 # MIDDLE DOT
+0xB8 0x00B8 # CEDILLA
+0xB9 0x00B9 # SUPERSCRIPT ONE
+0xBA 0x00BA # MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC # VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD # VULGAR FRACTION ONE HALF
+0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF # INVERTED QUESTION MARK
+0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 # LATIN CAPITAL LETTER AE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x011E # LATIN CAPITAL LETTER G WITH BREVE
+0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xDE 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 # LATIN SMALL LETTER AE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x011F # LATIN SMALL LETTER G WITH BREVE
+0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0131 # LATIN SMALL LETTER DOTLESS I
+0xFE 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/ARMSCII-8.txt b/ext/mbstring/tests/data/ARMSCII-8.txt
new file mode 100644
index 0000000000..1854fddc13
--- /dev/null
+++ b/ext/mbstring/tests/data/ARMSCII-8.txt
@@ -0,0 +1,255 @@
+# Derived from armscii-8(7) man page
+0x0 0x0
+0x1 0x1
+0x2 0x2
+0x3 0x3
+0x4 0x4
+0x5 0x5
+0x6 0x6
+0x7 0x7
+0x8 0x8
+0x9 0x9
+0xA 0xA
+0xB 0xB
+0xC 0xC
+0xD 0xD
+0xE 0xE
+0xF 0xF
+0x10 0x10
+0x11 0x11
+0x12 0x12
+0x13 0x13
+0x14 0x14
+0x15 0x15
+0x16 0x16
+0x17 0x17
+0x18 0x18
+0x19 0x19
+0x1A 0x1A
+0x1B 0x1B
+0x1C 0x1C
+0x1D 0x1D
+0x1E 0x1E
+0x1F 0x1F
+0x20 0x20
+0x21 0x21
+0x22 0x22
+0x23 0x23
+0x24 0x24
+0x25 0x25
+0x26 0x26
+0x27 0x27
+0x28 0x28
+0x29 0x29
+0x2A 0x2A
+0x2B 0x2B
+0x2C 0x2C
+0x2D 0x2D
+0x2E 0x2E
+0x2F 0x2F
+0x30 0x30
+0x31 0x31
+0x32 0x32
+0x33 0x33
+0x34 0x34
+0x35 0x35
+0x36 0x36
+0x37 0x37
+0x38 0x38
+0x39 0x39
+0x3A 0x3A
+0x3B 0x3B
+0x3C 0x3C
+0x3D 0x3D
+0x3E 0x3E
+0x3F 0x3F
+0x40 0x40
+0x41 0x41
+0x42 0x42
+0x43 0x43
+0x44 0x44
+0x45 0x45
+0x46 0x46
+0x47 0x47
+0x48 0x48
+0x49 0x49
+0x4A 0x4A
+0x4B 0x4B
+0x4C 0x4C
+0x4D 0x4D
+0x4E 0x4E
+0x4F 0x4F
+0x50 0x50
+0x51 0x51
+0x52 0x52
+0x53 0x53
+0x54 0x54
+0x55 0x55
+0x56 0x56
+0x57 0x57
+0x58 0x58
+0x59 0x59
+0x5A 0x5A
+0x5B 0x5B
+0x5C 0x5C
+0x5D 0x5D
+0x5E 0x5E
+0x5F 0x5F
+0x60 0x60
+0x61 0x61
+0x62 0x62
+0x63 0x63
+0x64 0x64
+0x65 0x65
+0x66 0x66
+0x67 0x67
+0x68 0x68
+0x69 0x69
+0x6A 0x6A
+0x6B 0x6B
+0x6C 0x6C
+0x6D 0x6D
+0x6E 0x6E
+0x6F 0x6F
+0x70 0x70
+0x71 0x71
+0x72 0x72
+0x73 0x73
+0x74 0x74
+0x75 0x75
+0x76 0x76
+0x77 0x77
+0x78 0x78
+0x79 0x79
+0x7A 0x7A
+0x7B 0x7B
+0x7C 0x7C
+0x7D 0x7D
+0x7E 0x7E
+0x7F 0x7F
+0x80 0x80
+0x81 0x81
+0x82 0x82
+0x83 0x83
+0x84 0x84
+0x85 0x85
+0x86 0x86
+0x87 0x87
+0x88 0x88
+0x89 0x89
+0x8A 0x8A
+0x8B 0x8B
+0x8C 0x8C
+0x8D 0x8D
+0x8E 0x8E
+0x8F 0x8F
+0x90 0x90
+0x91 0x91
+0x92 0x92
+0x93 0x93
+0x94 0x94
+0x95 0x95
+0x96 0x96
+0x97 0x97
+0x98 0x98
+0x99 0x99
+0x9A 0x9A
+0x9B 0x9B
+0x9C 0x9C
+0x9D 0x9D
+0x9E 0x9E
+0x9F 0x9F
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA2 0x0587 # SMALL LIGATURE ECH YIWN
+0xA3 0x0589 # ARMENIAN FULL STOP
+0xA4 0x0029 # RIGHT PARENTHESIS
+0xA5 0x0028 # LEFT PARENTHESIS
+0xA6 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xA7 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xA8 0x2014 # EM DASH
+0xA9 0x002E # FULL STOP
+0xAA 0x055D # ARMENIAN COMMA
+0xAB 0x002C # COMMA
+0xAC 0x002D # HYPHEN-MINUS
+0xAD 0x058A # ARMENIAN HYPHEN
+0xAE 0x2026 # HORIZONTAL ELLIPSIS
+0xAF 0x055C # ARMENIAN EXCLAMATION MARK
+0xB0 0x055B # ARMENIAN EMPHASIS MARK
+0xB1 0x055E # ARMENIAN QUESTION MARK
+0xB2 0x0531
+0xB3 0x0561
+0xB4 0x0532
+0xB5 0x0562
+0xB6 0x0533
+0xB7 0x0563
+0xB8 0x0534
+0xB9 0x0564
+0xBA 0x0535
+0xBB 0x0565
+0xBC 0x0536
+0xBD 0x0566
+0xBE 0x0537
+0xBF 0x0567
+0xC0 0x0538
+0xC1 0x0568
+0xC2 0x0539
+0xC3 0x0569
+0xC4 0x053A
+0xC5 0x056A
+0xC6 0x053B
+0xC7 0x056B
+0xC8 0x053C
+0xC9 0x056C
+0xCA 0x053D
+0xCB 0x056D
+0xCC 0x053E
+0xCD 0x056E
+0xCE 0x053F
+0xCF 0x056F
+0xD0 0x0540
+0xD1 0x0570
+0xD2 0x0541
+0xD3 0x0571
+0xD4 0x0542
+0xD5 0x0572
+0xD6 0x0543
+0xD7 0x0573
+0xD8 0x0544
+0xD9 0x0574
+0xDA 0x0545
+0xDB 0x0575
+0xDC 0x0546
+0xDD 0x0576
+0xDE 0x0547
+0xDF 0x0577
+0xE0 0x0548
+0xE1 0x0578
+0xE2 0x0549
+0xE3 0x0579
+0xE4 0x054A
+0xE5 0x057A
+0xE6 0x054B
+0xE7 0x057B
+0xE8 0x054C
+0xE9 0x057C
+0xEA 0x054D
+0xEB 0x057D
+0xEC 0x054E
+0xED 0x057E
+0xEE 0x054F
+0xEF 0x057F
+0xF0 0x0550
+0xF1 0x0580
+0xF2 0x0551
+0xF3 0x0581
+0xF4 0x0552
+0xF5 0x0582
+0xF6 0x0553
+0xF7 0x0583
+0xF8 0x0554
+0xF9 0x0584
+0xFA 0x0555
+0xFB 0x0585
+0xFC 0x0556
+0xFD 0x0586
+0xFE 0x055A
diff --git a/ext/mbstring/tests/data/CP1251.txt b/ext/mbstring/tests/data/CP1251.txt
new file mode 100644
index 0000000000..4d9b3558ac
--- /dev/null
+++ b/ext/mbstring/tests/data/CP1251.txt
@@ -0,0 +1,274 @@
+#
+# Name: cp1251 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1251 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1251 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0A 0x000A #LINE FEED
+0x0B 0x000B #VERTICAL TABULATION
+0x0C 0x000C #FORM FEED
+0x0D 0x000D #CARRIAGE RETURN
+0x0E 0x000E #SHIFT OUT
+0x0F 0x000F #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1A 0x001A #SUBSTITUTE
+0x1B 0x001B #ESCAPE
+0x1C 0x001C #FILE SEPARATOR
+0x1D 0x001D #GROUP SEPARATOR
+0x1E 0x001E #RECORD SEPARATOR
+0x1F 0x001F #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2A 0x002A #ASTERISK
+0x2B 0x002B #PLUS SIGN
+0x2C 0x002C #COMMA
+0x2D 0x002D #HYPHEN-MINUS
+0x2E 0x002E #FULL STOP
+0x2F 0x002F #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3A 0x003A #COLON
+0x3B 0x003B #SEMICOLON
+0x3C 0x003C #LESS-THAN SIGN
+0x3D 0x003D #EQUALS SIGN
+0x3E 0x003E #GREATER-THAN SIGN
+0x3F 0x003F #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4A 0x004A #LATIN CAPITAL LETTER J
+0x4B 0x004B #LATIN CAPITAL LETTER K
+0x4C 0x004C #LATIN CAPITAL LETTER L
+0x4D 0x004D #LATIN CAPITAL LETTER M
+0x4E 0x004E #LATIN CAPITAL LETTER N
+0x4F 0x004F #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5A 0x005A #LATIN CAPITAL LETTER Z
+0x5B 0x005B #LEFT SQUARE BRACKET
+0x5C 0x005C #REVERSE SOLIDUS
+0x5D 0x005D #RIGHT SQUARE BRACKET
+0x5E 0x005E #CIRCUMFLEX ACCENT
+0x5F 0x005F #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6A 0x006A #LATIN SMALL LETTER J
+0x6B 0x006B #LATIN SMALL LETTER K
+0x6C 0x006C #LATIN SMALL LETTER L
+0x6D 0x006D #LATIN SMALL LETTER M
+0x6E 0x006E #LATIN SMALL LETTER N
+0x6F 0x006F #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7A 0x007A #LATIN SMALL LETTER Z
+0x7B 0x007B #LEFT CURLY BRACKET
+0x7C 0x007C #VERTICAL LINE
+0x7D 0x007D #RIGHT CURLY BRACKET
+0x7E 0x007E #TILDE
+0x7F 0x007F #DELETE
+0x80 0x0402 #CYRILLIC CAPITAL LETTER DJE
+0x81 0x0403 #CYRILLIC CAPITAL LETTER GJE
+0x82 0x201A #SINGLE LOW-9 QUOTATION MARK
+0x83 0x0453 #CYRILLIC SMALL LETTER GJE
+0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 0x2026 #HORIZONTAL ELLIPSIS
+0x86 0x2020 #DAGGER
+0x87 0x2021 #DOUBLE DAGGER
+0x88 0x20AC #EURO SIGN
+0x89 0x2030 #PER MILLE SIGN
+0x8A 0x0409 #CYRILLIC CAPITAL LETTER LJE
+0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C 0x040A #CYRILLIC CAPITAL LETTER NJE
+0x8D 0x040C #CYRILLIC CAPITAL LETTER KJE
+0x8E 0x040B #CYRILLIC CAPITAL LETTER TSHE
+0x8F 0x040F #CYRILLIC CAPITAL LETTER DZHE
+0x90 0x0452 #CYRILLIC SMALL LETTER DJE
+0x91 0x2018 #LEFT SINGLE QUOTATION MARK
+0x92 0x2019 #RIGHT SINGLE QUOTATION MARK
+0x93 0x201C #LEFT DOUBLE QUOTATION MARK
+0x94 0x201D #RIGHT DOUBLE QUOTATION MARK
+0x95 0x2022 #BULLET
+0x96 0x2013 #EN DASH
+0x97 0x2014 #EM DASH
+0x98 #UNDEFINED
+0x99 0x2122 #TRADE MARK SIGN
+0x9A 0x0459 #CYRILLIC SMALL LETTER LJE
+0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C 0x045A #CYRILLIC SMALL LETTER NJE
+0x9D 0x045C #CYRILLIC SMALL LETTER KJE
+0x9E 0x045B #CYRILLIC SMALL LETTER TSHE
+0x9F 0x045F #CYRILLIC SMALL LETTER DZHE
+0xA0 0x00A0 #NO-BREAK SPACE
+0xA1 0x040E #CYRILLIC CAPITAL LETTER SHORT U
+0xA2 0x045E #CYRILLIC SMALL LETTER SHORT U
+0xA3 0x0408 #CYRILLIC CAPITAL LETTER JE
+0xA4 0x00A4 #CURRENCY SIGN
+0xA5 0x0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xA6 0x00A6 #BROKEN BAR
+0xA7 0x00A7 #SECTION SIGN
+0xA8 0x0401 #CYRILLIC CAPITAL LETTER IO
+0xA9 0x00A9 #COPYRIGHT SIGN
+0xAA 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC #NOT SIGN
+0xAD 0x00AD #SOFT HYPHEN
+0xAE 0x00AE #REGISTERED SIGN
+0xAF 0x0407 #CYRILLIC CAPITAL LETTER YI
+0xB0 0x00B0 #DEGREE SIGN
+0xB1 0x00B1 #PLUS-MINUS SIGN
+0xB2 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB3 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB4 0x0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xB5 0x00B5 #MICRO SIGN
+0xB6 0x00B6 #PILCROW SIGN
+0xB7 0x00B7 #MIDDLE DOT
+0xB8 0x0451 #CYRILLIC SMALL LETTER IO
+0xB9 0x2116 #NUMERO SIGN
+0xBA 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE
+0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x0458 #CYRILLIC SMALL LETTER JE
+0xBD 0x0405 #CYRILLIC CAPITAL LETTER DZE
+0xBE 0x0455 #CYRILLIC SMALL LETTER DZE
+0xBF 0x0457 #CYRILLIC SMALL LETTER YI
+0xC0 0x0410 #CYRILLIC CAPITAL LETTER A
+0xC1 0x0411 #CYRILLIC CAPITAL LETTER BE
+0xC2 0x0412 #CYRILLIC CAPITAL LETTER VE
+0xC3 0x0413 #CYRILLIC CAPITAL LETTER GHE
+0xC4 0x0414 #CYRILLIC CAPITAL LETTER DE
+0xC5 0x0415 #CYRILLIC CAPITAL LETTER IE
+0xC6 0x0416 #CYRILLIC CAPITAL LETTER ZHE
+0xC7 0x0417 #CYRILLIC CAPITAL LETTER ZE
+0xC8 0x0418 #CYRILLIC CAPITAL LETTER I
+0xC9 0x0419 #CYRILLIC CAPITAL LETTER SHORT I
+0xCA 0x041A #CYRILLIC CAPITAL LETTER KA
+0xCB 0x041B #CYRILLIC CAPITAL LETTER EL
+0xCC 0x041C #CYRILLIC CAPITAL LETTER EM
+0xCD 0x041D #CYRILLIC CAPITAL LETTER EN
+0xCE 0x041E #CYRILLIC CAPITAL LETTER O
+0xCF 0x041F #CYRILLIC CAPITAL LETTER PE
+0xD0 0x0420 #CYRILLIC CAPITAL LETTER ER
+0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES
+0xD2 0x0422 #CYRILLIC CAPITAL LETTER TE
+0xD3 0x0423 #CYRILLIC CAPITAL LETTER U
+0xD4 0x0424 #CYRILLIC CAPITAL LETTER EF
+0xD5 0x0425 #CYRILLIC CAPITAL LETTER HA
+0xD6 0x0426 #CYRILLIC CAPITAL LETTER TSE
+0xD7 0x0427 #CYRILLIC CAPITAL LETTER CHE
+0xD8 0x0428 #CYRILLIC CAPITAL LETTER SHA
+0xD9 0x0429 #CYRILLIC CAPITAL LETTER SHCHA
+0xDA 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN
+0xDB 0x042B #CYRILLIC CAPITAL LETTER YERU
+0xDC 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN
+0xDD 0x042D #CYRILLIC CAPITAL LETTER E
+0xDE 0x042E #CYRILLIC CAPITAL LETTER YU
+0xDF 0x042F #CYRILLIC CAPITAL LETTER YA
+0xE0 0x0430 #CYRILLIC SMALL LETTER A
+0xE1 0x0431 #CYRILLIC SMALL LETTER BE
+0xE2 0x0432 #CYRILLIC SMALL LETTER VE
+0xE3 0x0433 #CYRILLIC SMALL LETTER GHE
+0xE4 0x0434 #CYRILLIC SMALL LETTER DE
+0xE5 0x0435 #CYRILLIC SMALL LETTER IE
+0xE6 0x0436 #CYRILLIC SMALL LETTER ZHE
+0xE7 0x0437 #CYRILLIC SMALL LETTER ZE
+0xE8 0x0438 #CYRILLIC SMALL LETTER I
+0xE9 0x0439 #CYRILLIC SMALL LETTER SHORT I
+0xEA 0x043A #CYRILLIC SMALL LETTER KA
+0xEB 0x043B #CYRILLIC SMALL LETTER EL
+0xEC 0x043C #CYRILLIC SMALL LETTER EM
+0xED 0x043D #CYRILLIC SMALL LETTER EN
+0xEE 0x043E #CYRILLIC SMALL LETTER O
+0xEF 0x043F #CYRILLIC SMALL LETTER PE
+0xF0 0x0440 #CYRILLIC SMALL LETTER ER
+0xF1 0x0441 #CYRILLIC SMALL LETTER ES
+0xF2 0x0442 #CYRILLIC SMALL LETTER TE
+0xF3 0x0443 #CYRILLIC SMALL LETTER U
+0xF4 0x0444 #CYRILLIC SMALL LETTER EF
+0xF5 0x0445 #CYRILLIC SMALL LETTER HA
+0xF6 0x0446 #CYRILLIC SMALL LETTER TSE
+0xF7 0x0447 #CYRILLIC SMALL LETTER CHE
+0xF8 0x0448 #CYRILLIC SMALL LETTER SHA
+0xF9 0x0449 #CYRILLIC SMALL LETTER SHCHA
+0xFA 0x044A #CYRILLIC SMALL LETTER HARD SIGN
+0xFB 0x044B #CYRILLIC SMALL LETTER YERU
+0xFC 0x044C #CYRILLIC SMALL LETTER SOFT SIGN
+0xFD 0x044D #CYRILLIC SMALL LETTER E
+0xFE 0x044E #CYRILLIC SMALL LETTER YU
+0xFF 0x044F #CYRILLIC SMALL LETTER YA
diff --git a/ext/mbstring/tests/data/CP1252.txt b/ext/mbstring/tests/data/CP1252.txt
new file mode 100644
index 0000000000..8ff4b204b7
--- /dev/null
+++ b/ext/mbstring/tests/data/CP1252.txt
@@ -0,0 +1,274 @@
+#
+# Name: cp1252 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1252 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1252 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0A 0x000A #LINE FEED
+0x0B 0x000B #VERTICAL TABULATION
+0x0C 0x000C #FORM FEED
+0x0D 0x000D #CARRIAGE RETURN
+0x0E 0x000E #SHIFT OUT
+0x0F 0x000F #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1A 0x001A #SUBSTITUTE
+0x1B 0x001B #ESCAPE
+0x1C 0x001C #FILE SEPARATOR
+0x1D 0x001D #GROUP SEPARATOR
+0x1E 0x001E #RECORD SEPARATOR
+0x1F 0x001F #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2A 0x002A #ASTERISK
+0x2B 0x002B #PLUS SIGN
+0x2C 0x002C #COMMA
+0x2D 0x002D #HYPHEN-MINUS
+0x2E 0x002E #FULL STOP
+0x2F 0x002F #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3A 0x003A #COLON
+0x3B 0x003B #SEMICOLON
+0x3C 0x003C #LESS-THAN SIGN
+0x3D 0x003D #EQUALS SIGN
+0x3E 0x003E #GREATER-THAN SIGN
+0x3F 0x003F #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4A 0x004A #LATIN CAPITAL LETTER J
+0x4B 0x004B #LATIN CAPITAL LETTER K
+0x4C 0x004C #LATIN CAPITAL LETTER L
+0x4D 0x004D #LATIN CAPITAL LETTER M
+0x4E 0x004E #LATIN CAPITAL LETTER N
+0x4F 0x004F #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5A 0x005A #LATIN CAPITAL LETTER Z
+0x5B 0x005B #LEFT SQUARE BRACKET
+0x5C 0x005C #REVERSE SOLIDUS
+0x5D 0x005D #RIGHT SQUARE BRACKET
+0x5E 0x005E #CIRCUMFLEX ACCENT
+0x5F 0x005F #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6A 0x006A #LATIN SMALL LETTER J
+0x6B 0x006B #LATIN SMALL LETTER K
+0x6C 0x006C #LATIN SMALL LETTER L
+0x6D 0x006D #LATIN SMALL LETTER M
+0x6E 0x006E #LATIN SMALL LETTER N
+0x6F 0x006F #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7A 0x007A #LATIN SMALL LETTER Z
+0x7B 0x007B #LEFT CURLY BRACKET
+0x7C 0x007C #VERTICAL LINE
+0x7D 0x007D #RIGHT CURLY BRACKET
+0x7E 0x007E #TILDE
+0x7F 0x007F #DELETE
+0x80 0x20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 0x201A #SINGLE LOW-9 QUOTATION MARK
+0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 0x2026 #HORIZONTAL ELLIPSIS
+0x86 0x2020 #DAGGER
+0x87 0x2021 #DOUBLE DAGGER
+0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 0x2030 #PER MILLE SIGN
+0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON
+0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C 0x0152 #LATIN CAPITAL LIGATURE OE
+0x8D #UNDEFINED
+0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON
+0x8F #UNDEFINED
+0x90 #UNDEFINED
+0x91 0x2018 #LEFT SINGLE QUOTATION MARK
+0x92 0x2019 #RIGHT SINGLE QUOTATION MARK
+0x93 0x201C #LEFT DOUBLE QUOTATION MARK
+0x94 0x201D #RIGHT DOUBLE QUOTATION MARK
+0x95 0x2022 #BULLET
+0x96 0x2013 #EN DASH
+0x97 0x2014 #EM DASH
+0x98 0x02DC #SMALL TILDE
+0x99 0x2122 #TRADE MARK SIGN
+0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON
+0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C 0x0153 #LATIN SMALL LIGATURE OE
+0x9D #UNDEFINED
+0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON
+0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0 0x00A0 #NO-BREAK SPACE
+0xA1 0x00A1 #INVERTED EXCLAMATION MARK
+0xA2 0x00A2 #CENT SIGN
+0xA3 0x00A3 #POUND SIGN
+0xA4 0x00A4 #CURRENCY SIGN
+0xA5 0x00A5 #YEN SIGN
+0xA6 0x00A6 #BROKEN BAR
+0xA7 0x00A7 #SECTION SIGN
+0xA8 0x00A8 #DIAERESIS
+0xA9 0x00A9 #COPYRIGHT SIGN
+0xAA 0x00AA #FEMININE ORDINAL INDICATOR
+0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC #NOT SIGN
+0xAD 0x00AD #SOFT HYPHEN
+0xAE 0x00AE #REGISTERED SIGN
+0xAF 0x00AF #MACRON
+0xB0 0x00B0 #DEGREE SIGN
+0xB1 0x00B1 #PLUS-MINUS SIGN
+0xB2 0x00B2 #SUPERSCRIPT TWO
+0xB3 0x00B3 #SUPERSCRIPT THREE
+0xB4 0x00B4 #ACUTE ACCENT
+0xB5 0x00B5 #MICRO SIGN
+0xB6 0x00B6 #PILCROW SIGN
+0xB7 0x00B7 #MIDDLE DOT
+0xB8 0x00B8 #CEDILLA
+0xB9 0x00B9 #SUPERSCRIPT ONE
+0xBA 0x00BA #MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC #VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD #VULGAR FRACTION ONE HALF
+0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF #INVERTED QUESTION MARK
+0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 #LATIN CAPITAL LETTER AE
+0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x00D0 #LATIN CAPITAL LETTER ETH
+0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 #MULTIPLICATION SIGN
+0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x00DE #LATIN CAPITAL LETTER THORN
+0xDF 0x00DF #LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 #LATIN SMALL LETTER AE
+0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x00F0 #LATIN SMALL LETTER ETH
+0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 #DIVISION SIGN
+0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x00FE #LATIN SMALL LETTER THORN
+0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/CP1254.txt b/ext/mbstring/tests/data/CP1254.txt
new file mode 100644
index 0000000000..987ed98f75
--- /dev/null
+++ b/ext/mbstring/tests/data/CP1254.txt
@@ -0,0 +1,274 @@
+#
+# Name: cp1254 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.01
+# Table format: Format A
+# Date: 04/15/98
+#
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp1254 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp1254 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0A 0x000A #LINE FEED
+0x0B 0x000B #VERTICAL TABULATION
+0x0C 0x000C #FORM FEED
+0x0D 0x000D #CARRIAGE RETURN
+0x0E 0x000E #SHIFT OUT
+0x0F 0x000F #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1A 0x001A #SUBSTITUTE
+0x1B 0x001B #ESCAPE
+0x1C 0x001C #FILE SEPARATOR
+0x1D 0x001D #GROUP SEPARATOR
+0x1E 0x001E #RECORD SEPARATOR
+0x1F 0x001F #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2A 0x002A #ASTERISK
+0x2B 0x002B #PLUS SIGN
+0x2C 0x002C #COMMA
+0x2D 0x002D #HYPHEN-MINUS
+0x2E 0x002E #FULL STOP
+0x2F 0x002F #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3A 0x003A #COLON
+0x3B 0x003B #SEMICOLON
+0x3C 0x003C #LESS-THAN SIGN
+0x3D 0x003D #EQUALS SIGN
+0x3E 0x003E #GREATER-THAN SIGN
+0x3F 0x003F #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4A 0x004A #LATIN CAPITAL LETTER J
+0x4B 0x004B #LATIN CAPITAL LETTER K
+0x4C 0x004C #LATIN CAPITAL LETTER L
+0x4D 0x004D #LATIN CAPITAL LETTER M
+0x4E 0x004E #LATIN CAPITAL LETTER N
+0x4F 0x004F #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5A 0x005A #LATIN CAPITAL LETTER Z
+0x5B 0x005B #LEFT SQUARE BRACKET
+0x5C 0x005C #REVERSE SOLIDUS
+0x5D 0x005D #RIGHT SQUARE BRACKET
+0x5E 0x005E #CIRCUMFLEX ACCENT
+0x5F 0x005F #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6A 0x006A #LATIN SMALL LETTER J
+0x6B 0x006B #LATIN SMALL LETTER K
+0x6C 0x006C #LATIN SMALL LETTER L
+0x6D 0x006D #LATIN SMALL LETTER M
+0x6E 0x006E #LATIN SMALL LETTER N
+0x6F 0x006F #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7A 0x007A #LATIN SMALL LETTER Z
+0x7B 0x007B #LEFT CURLY BRACKET
+0x7C 0x007C #VERTICAL LINE
+0x7D 0x007D #RIGHT CURLY BRACKET
+0x7E 0x007E #TILDE
+0x7F 0x007F #DELETE
+0x80 0x20AC #EURO SIGN
+0x81 #UNDEFINED
+0x82 0x201A #SINGLE LOW-9 QUOTATION MARK
+0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK
+0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK
+0x85 0x2026 #HORIZONTAL ELLIPSIS
+0x86 0x2020 #DAGGER
+0x87 0x2021 #DOUBLE DAGGER
+0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT
+0x89 0x2030 #PER MILLE SIGN
+0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON
+0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+0x8C 0x0152 #LATIN CAPITAL LIGATURE OE
+0x8D #UNDEFINED
+0x8E #UNDEFINED
+0x8F #UNDEFINED
+0x90 #UNDEFINED
+0x91 0x2018 #LEFT SINGLE QUOTATION MARK
+0x92 0x2019 #RIGHT SINGLE QUOTATION MARK
+0x93 0x201C #LEFT DOUBLE QUOTATION MARK
+0x94 0x201D #RIGHT DOUBLE QUOTATION MARK
+0x95 0x2022 #BULLET
+0x96 0x2013 #EN DASH
+0x97 0x2014 #EM DASH
+0x98 0x02DC #SMALL TILDE
+0x99 0x2122 #TRADE MARK SIGN
+0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON
+0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+0x9C 0x0153 #LATIN SMALL LIGATURE OE
+0x9D #UNDEFINED
+0x9E #UNDEFINED
+0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS
+0xA0 0x00A0 #NO-BREAK SPACE
+0xA1 0x00A1 #INVERTED EXCLAMATION MARK
+0xA2 0x00A2 #CENT SIGN
+0xA3 0x00A3 #POUND SIGN
+0xA4 0x00A4 #CURRENCY SIGN
+0xA5 0x00A5 #YEN SIGN
+0xA6 0x00A6 #BROKEN BAR
+0xA7 0x00A7 #SECTION SIGN
+0xA8 0x00A8 #DIAERESIS
+0xA9 0x00A9 #COPYRIGHT SIGN
+0xAA 0x00AA #FEMININE ORDINAL INDICATOR
+0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xAC 0x00AC #NOT SIGN
+0xAD 0x00AD #SOFT HYPHEN
+0xAE 0x00AE #REGISTERED SIGN
+0xAF 0x00AF #MACRON
+0xB0 0x00B0 #DEGREE SIGN
+0xB1 0x00B1 #PLUS-MINUS SIGN
+0xB2 0x00B2 #SUPERSCRIPT TWO
+0xB3 0x00B3 #SUPERSCRIPT THREE
+0xB4 0x00B4 #ACUTE ACCENT
+0xB5 0x00B5 #MICRO SIGN
+0xB6 0x00B6 #PILCROW SIGN
+0xB7 0x00B7 #MIDDLE DOT
+0xB8 0x00B8 #CEDILLA
+0xB9 0x00B9 #SUPERSCRIPT ONE
+0xBA 0x00BA #MASCULINE ORDINAL INDICATOR
+0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xBC 0x00BC #VULGAR FRACTION ONE QUARTER
+0xBD 0x00BD #VULGAR FRACTION ONE HALF
+0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS
+0xBF 0x00BF #INVERTED QUESTION MARK
+0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE
+0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0xC6 0x00C6 #LATIN CAPITAL LETTER AE
+0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE
+0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xD0 0x011E #LATIN CAPITAL LETTER G WITH BREVE
+0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE
+0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE
+0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 #MULTIPLICATION SIGN
+0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE
+0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE
+0xDE 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA
+0xDF 0x00DF #LATIN SMALL LETTER SHARP S
+0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE
+0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE
+0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE
+0xE6 0x00E6 #LATIN SMALL LETTER AE
+0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE
+0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE
+0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS
+0xF0 0x011F #LATIN SMALL LETTER G WITH BREVE
+0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE
+0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE
+0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE
+0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 #DIVISION SIGN
+0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE
+0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE
+0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x0131 #LATIN SMALL LETTER DOTLESS I
+0xFE 0x015F #LATIN SMALL LETTER S WITH CEDILLA
+0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS
diff --git a/ext/mbstring/tests/data/CP850.txt b/ext/mbstring/tests/data/CP850.txt
new file mode 100644
index 0000000000..7f662c49c9
--- /dev/null
+++ b/ext/mbstring/tests/data/CP850.txt
@@ -0,0 +1,273 @@
+#
+# Name: cp850_DOSLatin1 to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp850_DOSLatin1 code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp850_DOSLatin1 order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0a 0x000a #LINE FEED
+0x0b 0x000b #VERTICAL TABULATION
+0x0c 0x000c #FORM FEED
+0x0d 0x000d #CARRIAGE RETURN
+0x0e 0x000e #SHIFT OUT
+0x0f 0x000f #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1a 0x001a #SUBSTITUTE
+0x1b 0x001b #ESCAPE
+0x1c 0x001c #FILE SEPARATOR
+0x1d 0x001d #GROUP SEPARATOR
+0x1e 0x001e #RECORD SEPARATOR
+0x1f 0x001f #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2a 0x002a #ASTERISK
+0x2b 0x002b #PLUS SIGN
+0x2c 0x002c #COMMA
+0x2d 0x002d #HYPHEN-MINUS
+0x2e 0x002e #FULL STOP
+0x2f 0x002f #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3a 0x003a #COLON
+0x3b 0x003b #SEMICOLON
+0x3c 0x003c #LESS-THAN SIGN
+0x3d 0x003d #EQUALS SIGN
+0x3e 0x003e #GREATER-THAN SIGN
+0x3f 0x003f #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4a 0x004a #LATIN CAPITAL LETTER J
+0x4b 0x004b #LATIN CAPITAL LETTER K
+0x4c 0x004c #LATIN CAPITAL LETTER L
+0x4d 0x004d #LATIN CAPITAL LETTER M
+0x4e 0x004e #LATIN CAPITAL LETTER N
+0x4f 0x004f #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5a 0x005a #LATIN CAPITAL LETTER Z
+0x5b 0x005b #LEFT SQUARE BRACKET
+0x5c 0x005c #REVERSE SOLIDUS
+0x5d 0x005d #RIGHT SQUARE BRACKET
+0x5e 0x005e #CIRCUMFLEX ACCENT
+0x5f 0x005f #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6a 0x006a #LATIN SMALL LETTER J
+0x6b 0x006b #LATIN SMALL LETTER K
+0x6c 0x006c #LATIN SMALL LETTER L
+0x6d 0x006d #LATIN SMALL LETTER M
+0x6e 0x006e #LATIN SMALL LETTER N
+0x6f 0x006f #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7a 0x007a #LATIN SMALL LETTER Z
+0x7b 0x007b #LEFT CURLY BRACKET
+0x7c 0x007c #VERTICAL LINE
+0x7d 0x007d #RIGHT CURLY BRACKET
+0x7e 0x007e #TILDE
+0x7f 0x007f #DELETE
+0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA
+0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS
+0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE
+0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS
+0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE
+0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE
+0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA
+0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS
+0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE
+0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS
+0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE
+0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS
+0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE
+0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE
+0x91 0x00e6 #LATIN SMALL LIGATURE AE
+0x92 0x00c6 #LATIN CAPITAL LIGATURE AE
+0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS
+0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE
+0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE
+0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS
+0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS
+0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS
+0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE
+0x9c 0x00a3 #POUND SIGN
+0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE
+0x9e 0x00d7 #MULTIPLICATION SIGN
+0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK
+0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE
+0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE
+0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE
+0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE
+0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE
+0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE
+0xa6 0x00aa #FEMININE ORDINAL INDICATOR
+0xa7 0x00ba #MASCULINE ORDINAL INDICATOR
+0xa8 0x00bf #INVERTED QUESTION MARK
+0xa9 0x00ae #REGISTERED SIGN
+0xaa 0x00ac #NOT SIGN
+0xab 0x00bd #VULGAR FRACTION ONE HALF
+0xac 0x00bc #VULGAR FRACTION ONE QUARTER
+0xad 0x00a1 #INVERTED EXCLAMATION MARK
+0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+0xb0 0x2591 #LIGHT SHADE
+0xb1 0x2592 #MEDIUM SHADE
+0xb2 0x2593 #DARK SHADE
+0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE
+0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xb7 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE
+0xb8 0x00a9 #COPYRIGHT SIGN
+0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd 0x00a2 #CENT SIGN
+0xbe 0x00a5 #YEN SIGN
+0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 0x00e3 #LATIN SMALL LETTER A WITH TILDE
+0xc7 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE
+0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf 0x00a4 #CURRENCY SIGN
+0xd0 0x00f0 #LATIN SMALL LETTER ETH
+0xd1 0x00d0 #LATIN CAPITAL LETTER ETH
+0xd2 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS
+0xd4 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE
+0xd5 0x0131 #LATIN SMALL LETTER DOTLESS I
+0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE
+0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xd8 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS
+0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb 0x2588 #FULL BLOCK
+0xdc 0x2584 #LOWER HALF BLOCK
+0xdd 0x00a6 #BROKEN BAR
+0xde 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE
+0xdf 0x2580 #UPPER HALF BLOCK
+0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE
+0xe1 0x00df #LATIN SMALL LETTER SHARP S
+0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xe3 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE
+0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE
+0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE
+0xe6 0x00b5 #MICRO SIGN
+0xe7 0x00fe #LATIN SMALL LETTER THORN
+0xe8 0x00de #LATIN CAPITAL LETTER THORN
+0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE
+0xea 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+0xeb 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE
+0xec 0x00fd #LATIN SMALL LETTER Y WITH ACUTE
+0xed 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE
+0xee 0x00af #MACRON
+0xef 0x00b4 #ACUTE ACCENT
+0xf0 0x00ad #SOFT HYPHEN
+0xf1 0x00b1 #PLUS-MINUS SIGN
+0xf2 0x2017 #DOUBLE LOW LINE
+0xf3 0x00be #VULGAR FRACTION THREE QUARTERS
+0xf4 0x00b6 #PILCROW SIGN
+0xf5 0x00a7 #SECTION SIGN
+0xf6 0x00f7 #DIVISION SIGN
+0xf7 0x00b8 #CEDILLA
+0xf8 0x00b0 #DEGREE SIGN
+0xf9 0x00a8 #DIAERESIS
+0xfa 0x00b7 #MIDDLE DOT
+0xfb 0x00b9 #SUPERSCRIPT ONE
+0xfc 0x00b3 #SUPERSCRIPT THREE
+0xfd 0x00b2 #SUPERSCRIPT TWO
+0xfe 0x25a0 #BLACK SQUARE
+0xff 0x00a0 #NO-BREAK SPACE
diff --git a/ext/mbstring/tests/data/CP866.txt b/ext/mbstring/tests/data/CP866.txt
new file mode 100644
index 0000000000..64d29ef1fb
--- /dev/null
+++ b/ext/mbstring/tests/data/CP866.txt
@@ -0,0 +1,273 @@
+#
+# Name: cp866_DOSCyrillicRussian to Unicode table
+# Unicode version: 2.0
+# Table version: 2.00
+# Table format: Format A
+# Date: 04/24/96
+# Contact: Shawn.Steele@microsoft.com
+#
+# General notes: none
+#
+# Format: Three tab-separated columns
+# Column #1 is the cp866_DOSCyrillicRussian code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 is the Unicode name (follows a comment sign, '#')
+#
+# The entries are in cp866_DOSCyrillicRussian order
+#
+0x00 0x0000 #NULL
+0x01 0x0001 #START OF HEADING
+0x02 0x0002 #START OF TEXT
+0x03 0x0003 #END OF TEXT
+0x04 0x0004 #END OF TRANSMISSION
+0x05 0x0005 #ENQUIRY
+0x06 0x0006 #ACKNOWLEDGE
+0x07 0x0007 #BELL
+0x08 0x0008 #BACKSPACE
+0x09 0x0009 #HORIZONTAL TABULATION
+0x0a 0x000a #LINE FEED
+0x0b 0x000b #VERTICAL TABULATION
+0x0c 0x000c #FORM FEED
+0x0d 0x000d #CARRIAGE RETURN
+0x0e 0x000e #SHIFT OUT
+0x0f 0x000f #SHIFT IN
+0x10 0x0010 #DATA LINK ESCAPE
+0x11 0x0011 #DEVICE CONTROL ONE
+0x12 0x0012 #DEVICE CONTROL TWO
+0x13 0x0013 #DEVICE CONTROL THREE
+0x14 0x0014 #DEVICE CONTROL FOUR
+0x15 0x0015 #NEGATIVE ACKNOWLEDGE
+0x16 0x0016 #SYNCHRONOUS IDLE
+0x17 0x0017 #END OF TRANSMISSION BLOCK
+0x18 0x0018 #CANCEL
+0x19 0x0019 #END OF MEDIUM
+0x1a 0x001a #SUBSTITUTE
+0x1b 0x001b #ESCAPE
+0x1c 0x001c #FILE SEPARATOR
+0x1d 0x001d #GROUP SEPARATOR
+0x1e 0x001e #RECORD SEPARATOR
+0x1f 0x001f #UNIT SEPARATOR
+0x20 0x0020 #SPACE
+0x21 0x0021 #EXCLAMATION MARK
+0x22 0x0022 #QUOTATION MARK
+0x23 0x0023 #NUMBER SIGN
+0x24 0x0024 #DOLLAR SIGN
+0x25 0x0025 #PERCENT SIGN
+0x26 0x0026 #AMPERSAND
+0x27 0x0027 #APOSTROPHE
+0x28 0x0028 #LEFT PARENTHESIS
+0x29 0x0029 #RIGHT PARENTHESIS
+0x2a 0x002a #ASTERISK
+0x2b 0x002b #PLUS SIGN
+0x2c 0x002c #COMMA
+0x2d 0x002d #HYPHEN-MINUS
+0x2e 0x002e #FULL STOP
+0x2f 0x002f #SOLIDUS
+0x30 0x0030 #DIGIT ZERO
+0x31 0x0031 #DIGIT ONE
+0x32 0x0032 #DIGIT TWO
+0x33 0x0033 #DIGIT THREE
+0x34 0x0034 #DIGIT FOUR
+0x35 0x0035 #DIGIT FIVE
+0x36 0x0036 #DIGIT SIX
+0x37 0x0037 #DIGIT SEVEN
+0x38 0x0038 #DIGIT EIGHT
+0x39 0x0039 #DIGIT NINE
+0x3a 0x003a #COLON
+0x3b 0x003b #SEMICOLON
+0x3c 0x003c #LESS-THAN SIGN
+0x3d 0x003d #EQUALS SIGN
+0x3e 0x003e #GREATER-THAN SIGN
+0x3f 0x003f #QUESTION MARK
+0x40 0x0040 #COMMERCIAL AT
+0x41 0x0041 #LATIN CAPITAL LETTER A
+0x42 0x0042 #LATIN CAPITAL LETTER B
+0x43 0x0043 #LATIN CAPITAL LETTER C
+0x44 0x0044 #LATIN CAPITAL LETTER D
+0x45 0x0045 #LATIN CAPITAL LETTER E
+0x46 0x0046 #LATIN CAPITAL LETTER F
+0x47 0x0047 #LATIN CAPITAL LETTER G
+0x48 0x0048 #LATIN CAPITAL LETTER H
+0x49 0x0049 #LATIN CAPITAL LETTER I
+0x4a 0x004a #LATIN CAPITAL LETTER J
+0x4b 0x004b #LATIN CAPITAL LETTER K
+0x4c 0x004c #LATIN CAPITAL LETTER L
+0x4d 0x004d #LATIN CAPITAL LETTER M
+0x4e 0x004e #LATIN CAPITAL LETTER N
+0x4f 0x004f #LATIN CAPITAL LETTER O
+0x50 0x0050 #LATIN CAPITAL LETTER P
+0x51 0x0051 #LATIN CAPITAL LETTER Q
+0x52 0x0052 #LATIN CAPITAL LETTER R
+0x53 0x0053 #LATIN CAPITAL LETTER S
+0x54 0x0054 #LATIN CAPITAL LETTER T
+0x55 0x0055 #LATIN CAPITAL LETTER U
+0x56 0x0056 #LATIN CAPITAL LETTER V
+0x57 0x0057 #LATIN CAPITAL LETTER W
+0x58 0x0058 #LATIN CAPITAL LETTER X
+0x59 0x0059 #LATIN CAPITAL LETTER Y
+0x5a 0x005a #LATIN CAPITAL LETTER Z
+0x5b 0x005b #LEFT SQUARE BRACKET
+0x5c 0x005c #REVERSE SOLIDUS
+0x5d 0x005d #RIGHT SQUARE BRACKET
+0x5e 0x005e #CIRCUMFLEX ACCENT
+0x5f 0x005f #LOW LINE
+0x60 0x0060 #GRAVE ACCENT
+0x61 0x0061 #LATIN SMALL LETTER A
+0x62 0x0062 #LATIN SMALL LETTER B
+0x63 0x0063 #LATIN SMALL LETTER C
+0x64 0x0064 #LATIN SMALL LETTER D
+0x65 0x0065 #LATIN SMALL LETTER E
+0x66 0x0066 #LATIN SMALL LETTER F
+0x67 0x0067 #LATIN SMALL LETTER G
+0x68 0x0068 #LATIN SMALL LETTER H
+0x69 0x0069 #LATIN SMALL LETTER I
+0x6a 0x006a #LATIN SMALL LETTER J
+0x6b 0x006b #LATIN SMALL LETTER K
+0x6c 0x006c #LATIN SMALL LETTER L
+0x6d 0x006d #LATIN SMALL LETTER M
+0x6e 0x006e #LATIN SMALL LETTER N
+0x6f 0x006f #LATIN SMALL LETTER O
+0x70 0x0070 #LATIN SMALL LETTER P
+0x71 0x0071 #LATIN SMALL LETTER Q
+0x72 0x0072 #LATIN SMALL LETTER R
+0x73 0x0073 #LATIN SMALL LETTER S
+0x74 0x0074 #LATIN SMALL LETTER T
+0x75 0x0075 #LATIN SMALL LETTER U
+0x76 0x0076 #LATIN SMALL LETTER V
+0x77 0x0077 #LATIN SMALL LETTER W
+0x78 0x0078 #LATIN SMALL LETTER X
+0x79 0x0079 #LATIN SMALL LETTER Y
+0x7a 0x007a #LATIN SMALL LETTER Z
+0x7b 0x007b #LEFT CURLY BRACKET
+0x7c 0x007c #VERTICAL LINE
+0x7d 0x007d #RIGHT CURLY BRACKET
+0x7e 0x007e #TILDE
+0x7f 0x007f #DELETE
+0x80 0x0410 #CYRILLIC CAPITAL LETTER A
+0x81 0x0411 #CYRILLIC CAPITAL LETTER BE
+0x82 0x0412 #CYRILLIC CAPITAL LETTER VE
+0x83 0x0413 #CYRILLIC CAPITAL LETTER GHE
+0x84 0x0414 #CYRILLIC CAPITAL LETTER DE
+0x85 0x0415 #CYRILLIC CAPITAL LETTER IE
+0x86 0x0416 #CYRILLIC CAPITAL LETTER ZHE
+0x87 0x0417 #CYRILLIC CAPITAL LETTER ZE
+0x88 0x0418 #CYRILLIC CAPITAL LETTER I
+0x89 0x0419 #CYRILLIC CAPITAL LETTER SHORT I
+0x8a 0x041a #CYRILLIC CAPITAL LETTER KA
+0x8b 0x041b #CYRILLIC CAPITAL LETTER EL
+0x8c 0x041c #CYRILLIC CAPITAL LETTER EM
+0x8d 0x041d #CYRILLIC CAPITAL LETTER EN
+0x8e 0x041e #CYRILLIC CAPITAL LETTER O
+0x8f 0x041f #CYRILLIC CAPITAL LETTER PE
+0x90 0x0420 #CYRILLIC CAPITAL LETTER ER
+0x91 0x0421 #CYRILLIC CAPITAL LETTER ES
+0x92 0x0422 #CYRILLIC CAPITAL LETTER TE
+0x93 0x0423 #CYRILLIC CAPITAL LETTER U
+0x94 0x0424 #CYRILLIC CAPITAL LETTER EF
+0x95 0x0425 #CYRILLIC CAPITAL LETTER HA
+0x96 0x0426 #CYRILLIC CAPITAL LETTER TSE
+0x97 0x0427 #CYRILLIC CAPITAL LETTER CHE
+0x98 0x0428 #CYRILLIC CAPITAL LETTER SHA
+0x99 0x0429 #CYRILLIC CAPITAL LETTER SHCHA
+0x9a 0x042a #CYRILLIC CAPITAL LETTER HARD SIGN
+0x9b 0x042b #CYRILLIC CAPITAL LETTER YERU
+0x9c 0x042c #CYRILLIC CAPITAL LETTER SOFT SIGN
+0x9d 0x042d #CYRILLIC CAPITAL LETTER E
+0x9e 0x042e #CYRILLIC CAPITAL LETTER YU
+0x9f 0x042f #CYRILLIC CAPITAL LETTER YA
+0xa0 0x0430 #CYRILLIC SMALL LETTER A
+0xa1 0x0431 #CYRILLIC SMALL LETTER BE
+0xa2 0x0432 #CYRILLIC SMALL LETTER VE
+0xa3 0x0433 #CYRILLIC SMALL LETTER GHE
+0xa4 0x0434 #CYRILLIC SMALL LETTER DE
+0xa5 0x0435 #CYRILLIC SMALL LETTER IE
+0xa6 0x0436 #CYRILLIC SMALL LETTER ZHE
+0xa7 0x0437 #CYRILLIC SMALL LETTER ZE
+0xa8 0x0438 #CYRILLIC SMALL LETTER I
+0xa9 0x0439 #CYRILLIC SMALL LETTER SHORT I
+0xaa 0x043a #CYRILLIC SMALL LETTER KA
+0xab 0x043b #CYRILLIC SMALL LETTER EL
+0xac 0x043c #CYRILLIC SMALL LETTER EM
+0xad 0x043d #CYRILLIC SMALL LETTER EN
+0xae 0x043e #CYRILLIC SMALL LETTER O
+0xaf 0x043f #CYRILLIC SMALL LETTER PE
+0xb0 0x2591 #LIGHT SHADE
+0xb1 0x2592 #MEDIUM SHADE
+0xb2 0x2593 #DARK SHADE
+0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL
+0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL
+0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT
+0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT
+0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT
+0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL
+0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT
+0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL
+0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT
+0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT
+0xdb 0x2588 #FULL BLOCK
+0xdc 0x2584 #LOWER HALF BLOCK
+0xdd 0x258c #LEFT HALF BLOCK
+0xde 0x2590 #RIGHT HALF BLOCK
+0xdf 0x2580 #UPPER HALF BLOCK
+0xe0 0x0440 #CYRILLIC SMALL LETTER ER
+0xe1 0x0441 #CYRILLIC SMALL LETTER ES
+0xe2 0x0442 #CYRILLIC SMALL LETTER TE
+0xe3 0x0443 #CYRILLIC SMALL LETTER U
+0xe4 0x0444 #CYRILLIC SMALL LETTER EF
+0xe5 0x0445 #CYRILLIC SMALL LETTER HA
+0xe6 0x0446 #CYRILLIC SMALL LETTER TSE
+0xe7 0x0447 #CYRILLIC SMALL LETTER CHE
+0xe8 0x0448 #CYRILLIC SMALL LETTER SHA
+0xe9 0x0449 #CYRILLIC SMALL LETTER SHCHA
+0xea 0x044a #CYRILLIC SMALL LETTER HARD SIGN
+0xeb 0x044b #CYRILLIC SMALL LETTER YERU
+0xec 0x044c #CYRILLIC SMALL LETTER SOFT SIGN
+0xed 0x044d #CYRILLIC SMALL LETTER E
+0xee 0x044e #CYRILLIC SMALL LETTER YU
+0xef 0x044f #CYRILLIC SMALL LETTER YA
+0xf0 0x0401 #CYRILLIC CAPITAL LETTER IO
+0xf1 0x0451 #CYRILLIC SMALL LETTER IO
+0xf2 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xf3 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE
+0xf4 0x0407 #CYRILLIC CAPITAL LETTER YI
+0xf5 0x0457 #CYRILLIC SMALL LETTER YI
+0xf6 0x040e #CYRILLIC CAPITAL LETTER SHORT U
+0xf7 0x045e #CYRILLIC SMALL LETTER SHORT U
+0xf8 0x00b0 #DEGREE SIGN
+0xf9 0x2219 #BULLET OPERATOR
+0xfa 0x00b7 #MIDDLE DOT
+0xfb 0x221a #SQUARE ROOT
+0xfc 0x2116 #NUMERO SIGN
+0xfd 0x00a4 #CURRENCY SIGN
+0xfe 0x25a0 #BLACK SQUARE
+0xff 0x00a0 #NO-BREAK SPACE
diff --git a/ext/mbstring/tests/data/EUC-JP.txt b/ext/mbstring/tests/data/EUC-JP.txt
new file mode 100644
index 0000000000..8a56f460b1
--- /dev/null
+++ b/ext/mbstring/tests/data/EUC-JP.txt
@@ -0,0 +1,13137 @@
+0x00 0x0000
+0x01 0x0001
+0x02 0x0002
+0x03 0x0003
+0x04 0x0004
+0x05 0x0005
+0x06 0x0006
+0x07 0x0007
+0x08 0x0008
+0x09 0x0009
+0x0A 0x000A
+0x0B 0x000B
+0x0C 0x000C
+0x0D 0x000D
+0x0E 0x000E
+0x0F 0x000F
+0x10 0x0010
+0x11 0x0011
+0x12 0x0012
+0x13 0x0013
+0x14 0x0014
+0x15 0x0015
+0x16 0x0016
+0x17 0x0017
+0x18 0x0018
+0x19 0x0019
+0x1A 0x001A
+0x1B 0x001B
+0x1C 0x001C
+0x1D 0x001D
+0x1E 0x001E
+0x1F 0x001F
+0x20 0x0020
+0x21 0x0021
+0x22 0x0022
+0x23 0x0023
+0x24 0x0024
+0x25 0x0025
+0x26 0x0026
+0x27 0x0027
+0x28 0x0028
+0x29 0x0029
+0x2A 0x002A
+0x2B 0x002B
+0x2C 0x002C
+0x2D 0x002D
+0x2E 0x002E
+0x2F 0x002F
+0x30 0x0030
+0x31 0x0031
+0x32 0x0032
+0x33 0x0033
+0x34 0x0034
+0x35 0x0035
+0x36 0x0036
+0x37 0x0037
+0x38 0x0038
+0x39 0x0039
+0x3A 0x003A
+0x3B 0x003B
+0x3C 0x003C
+0x3D 0x003D
+0x3E 0x003E
+0x3F 0x003F
+0x40 0x0040
+0x41 0x0041
+0x42 0x0042
+0x43 0x0043
+0x44 0x0044
+0x45 0x0045
+0x46 0x0046
+0x47 0x0047
+0x48 0x0048
+0x49 0x0049
+0x4A 0x004A
+0x4B 0x004B
+0x4C 0x004C
+0x4D 0x004D
+0x4E 0x004E
+0x4F 0x004F
+0x50 0x0050
+0x51 0x0051
+0x52 0x0052
+0x53 0x0053
+0x54 0x0054
+0x55 0x0055
+0x56 0x0056
+0x57 0x0057
+0x58 0x0058
+0x59 0x0059
+0x5A 0x005A
+0x5B 0x005B
+0x5C 0x005C
+0x5D 0x005D
+0x5E 0x005E
+0x5F 0x005F
+0x60 0x0060
+0x61 0x0061
+0x62 0x0062
+0x63 0x0063
+0x64 0x0064
+0x65 0x0065
+0x66 0x0066
+0x67 0x0067
+0x68 0x0068
+0x69 0x0069
+0x6A 0x006A
+0x6B 0x006B
+0x6C 0x006C
+0x6D 0x006D
+0x6E 0x006E
+0x6F 0x006F
+0x70 0x0070
+0x71 0x0071
+0x72 0x0072
+0x73 0x0073
+0x74 0x0074
+0x75 0x0075
+0x76 0x0076
+0x77 0x0077
+0x78 0x0078
+0x79 0x0079
+0x7A 0x007A
+0x7B 0x007B
+0x7C 0x007C
+0x7D 0x007D
+0x7E 0x007E
+0x7F 0x007F
+0x8EA1 0xFF61
+0x8EA2 0xFF62
+0x8EA3 0xFF63
+0x8EA4 0xFF64
+0x8EA5 0xFF65
+0x8EA6 0xFF66
+0x8EA7 0xFF67
+0x8EA8 0xFF68
+0x8EA9 0xFF69
+0x8EAA 0xFF6A
+0x8EAB 0xFF6B
+0x8EAC 0xFF6C
+0x8EAD 0xFF6D
+0x8EAE 0xFF6E
+0x8EAF 0xFF6F
+0x8EB0 0xFF70
+0x8EB1 0xFF71
+0x8EB2 0xFF72
+0x8EB3 0xFF73
+0x8EB4 0xFF74
+0x8EB5 0xFF75
+0x8EB6 0xFF76
+0x8EB7 0xFF77
+0x8EB8 0xFF78
+0x8EB9 0xFF79
+0x8EBA 0xFF7A
+0x8EBB 0xFF7B
+0x8EBC 0xFF7C
+0x8EBD 0xFF7D
+0x8EBE 0xFF7E
+0x8EBF 0xFF7F
+0x8EC0 0xFF80
+0x8EC1 0xFF81
+0x8EC2 0xFF82
+0x8EC3 0xFF83
+0x8EC4 0xFF84
+0x8EC5 0xFF85
+0x8EC6 0xFF86
+0x8EC7 0xFF87
+0x8EC8 0xFF88
+0x8EC9 0xFF89
+0x8ECA 0xFF8A
+0x8ECB 0xFF8B
+0x8ECC 0xFF8C
+0x8ECD 0xFF8D
+0x8ECE 0xFF8E
+0x8ECF 0xFF8F
+0x8ED0 0xFF90
+0x8ED1 0xFF91
+0x8ED2 0xFF92
+0x8ED3 0xFF93
+0x8ED4 0xFF94
+0x8ED5 0xFF95
+0x8ED6 0xFF96
+0x8ED7 0xFF97
+0x8ED8 0xFF98
+0x8ED9 0xFF99
+0x8EDA 0xFF9A
+0x8EDB 0xFF9B
+0x8EDC 0xFF9C
+0x8EDD 0xFF9D
+0x8EDE 0xFF9E
+0x8EDF 0xFF9F
+0x8FA2AF 0x02D8
+0x8FA2B0 0x02C7
+0x8FA2B1 0x00B8
+0x8FA2B2 0x02D9
+0x8FA2B3 0x02DD
+0x8FA2B4 0x00AF
+0x8FA2B5 0x02DB
+0x8FA2B6 0x02DA
+0x8FA2B7 0x007E
+0x8FA2B8 0x0384
+0x8FA2B9 0x0385
+0x8FA2C2 0x00A1
+0x8FA2C3 0x00A6
+0x8FA2C4 0x00BF
+0x8FA2EB 0x00BA
+0x8FA2EC 0x00AA
+0x8FA2ED 0x00A9
+0x8FA2EE 0x00AE
+0x8FA2EF 0x2122
+0x8FA2F0 0x00A4
+0x8FA2F1 0x2116
+0x8FA6E1 0x0386
+0x8FA6E2 0x0388
+0x8FA6E3 0x0389
+0x8FA6E4 0x038A
+0x8FA6E5 0x03AA
+0x8FA6E7 0x038C
+0x8FA6E9 0x038E
+0x8FA6EA 0x03AB
+0x8FA6EC 0x038F
+0x8FA6F1 0x03AC
+0x8FA6F2 0x03AD
+0x8FA6F3 0x03AE
+0x8FA6F4 0x03AF
+0x8FA6F5 0x03CA
+0x8FA6F6 0x0390
+0x8FA6F7 0x03CC
+0x8FA6F8 0x03C2
+0x8FA6F9 0x03CD
+0x8FA6FA 0x03CB
+0x8FA6FB 0x03B0
+0x8FA6FC 0x03CE
+0x8FA7C2 0x0402
+0x8FA7C3 0x0403
+0x8FA7C4 0x0404
+0x8FA7C5 0x0405
+0x8FA7C6 0x0406
+0x8FA7C7 0x0407
+0x8FA7C8 0x0408
+0x8FA7C9 0x0409
+0x8FA7CA 0x040A
+0x8FA7CB 0x040B
+0x8FA7CC 0x040C
+0x8FA7CD 0x040E
+0x8FA7CE 0x040F
+0x8FA7F2 0x0452
+0x8FA7F3 0x0453
+0x8FA7F4 0x0454
+0x8FA7F5 0x0455
+0x8FA7F6 0x0456
+0x8FA7F7 0x0457
+0x8FA7F8 0x0458
+0x8FA7F9 0x0459
+0x8FA7FA 0x045A
+0x8FA7FB 0x045B
+0x8FA7FC 0x045C
+0x8FA7FD 0x045E
+0x8FA7FE 0x045F
+0x8FA9A1 0x00C6
+0x8FA9A2 0x0110
+0x8FA9A4 0x0126
+0x8FA9A6 0x0132
+0x8FA9A8 0x0141
+0x8FA9A9 0x013F
+0x8FA9AB 0x014A
+0x8FA9AC 0x00D8
+0x8FA9AD 0x0152
+0x8FA9AF 0x0166
+0x8FA9B0 0x00DE
+0x8FA9C1 0x00E6
+0x8FA9C2 0x0111
+0x8FA9C3 0x00F0
+0x8FA9C4 0x0127
+0x8FA9C5 0x0131
+0x8FA9C6 0x0133
+0x8FA9C7 0x0138
+0x8FA9C8 0x0142
+0x8FA9C9 0x0140
+0x8FA9CA 0x0149
+0x8FA9CB 0x014B
+0x8FA9CC 0x00F8
+0x8FA9CD 0x0153
+0x8FA9CE 0x00DF
+0x8FA9CF 0x0167
+0x8FA9D0 0x00FE
+0x8FAAA1 0x00C1
+0x8FAAA2 0x00C0
+0x8FAAA3 0x00C4
+0x8FAAA4 0x00C2
+0x8FAAA5 0x0102
+0x8FAAA6 0x01CD
+0x8FAAA7 0x0100
+0x8FAAA8 0x0104
+0x8FAAA9 0x00C5
+0x8FAAAA 0x00C3
+0x8FAAAB 0x0106
+0x8FAAAC 0x0108
+0x8FAAAD 0x010C
+0x8FAAAE 0x00C7
+0x8FAAAF 0x010A
+0x8FAAB0 0x010E
+0x8FAAB1 0x00C9
+0x8FAAB2 0x00C8
+0x8FAAB3 0x00CB
+0x8FAAB4 0x00CA
+0x8FAAB5 0x011A
+0x8FAAB6 0x0116
+0x8FAAB7 0x0112
+0x8FAAB8 0x0118
+0x8FAABA 0x011C
+0x8FAABB 0x011E
+0x8FAABC 0x0122
+0x8FAABD 0x0120
+0x8FAABE 0x0124
+0x8FAABF 0x00CD
+0x8FAAC0 0x00CC
+0x8FAAC1 0x00CF
+0x8FAAC2 0x00CE
+0x8FAAC3 0x01CF
+0x8FAAC4 0x0130
+0x8FAAC5 0x012A
+0x8FAAC6 0x012E
+0x8FAAC7 0x0128
+0x8FAAC8 0x0134
+0x8FAAC9 0x0136
+0x8FAACA 0x0139
+0x8FAACB 0x013D
+0x8FAACC 0x013B
+0x8FAACD 0x0143
+0x8FAACE 0x0147
+0x8FAACF 0x0145
+0x8FAAD0 0x00D1
+0x8FAAD1 0x00D3
+0x8FAAD2 0x00D2
+0x8FAAD3 0x00D6
+0x8FAAD4 0x00D4
+0x8FAAD5 0x01D1
+0x8FAAD6 0x0150
+0x8FAAD7 0x014C
+0x8FAAD8 0x00D5
+0x8FAAD9 0x0154
+0x8FAADA 0x0158
+0x8FAADB 0x0156
+0x8FAADC 0x015A
+0x8FAADD 0x015C
+0x8FAADE 0x0160
+0x8FAADF 0x015E
+0x8FAAE0 0x0164
+0x8FAAE1 0x0162
+0x8FAAE2 0x00DA
+0x8FAAE3 0x00D9
+0x8FAAE4 0x00DC
+0x8FAAE5 0x00DB
+0x8FAAE6 0x016C
+0x8FAAE7 0x01D3
+0x8FAAE8 0x0170
+0x8FAAE9 0x016A
+0x8FAAEA 0x0172
+0x8FAAEB 0x016E
+0x8FAAEC 0x0168
+0x8FAAED 0x01D7
+0x8FAAEE 0x01DB
+0x8FAAEF 0x01D9
+0x8FAAF0 0x01D5
+0x8FAAF1 0x0174
+0x8FAAF2 0x00DD
+0x8FAAF3 0x0178
+0x8FAAF4 0x0176
+0x8FAAF5 0x0179
+0x8FAAF6 0x017D
+0x8FAAF7 0x017B
+0x8FABA1 0x00E1
+0x8FABA2 0x00E0
+0x8FABA3 0x00E4
+0x8FABA4 0x00E2
+0x8FABA5 0x0103
+0x8FABA6 0x01CE
+0x8FABA7 0x0101
+0x8FABA8 0x0105
+0x8FABA9 0x00E5
+0x8FABAA 0x00E3
+0x8FABAB 0x0107
+0x8FABAC 0x0109
+0x8FABAD 0x010D
+0x8FABAE 0x00E7
+0x8FABAF 0x010B
+0x8FABB0 0x010F
+0x8FABB1 0x00E9
+0x8FABB2 0x00E8
+0x8FABB3 0x00EB
+0x8FABB4 0x00EA
+0x8FABB5 0x011B
+0x8FABB6 0x0117
+0x8FABB7 0x0113
+0x8FABB8 0x0119
+0x8FABB9 0x01F5
+0x8FABBA 0x011D
+0x8FABBB 0x011F
+0x8FABBD 0x0121
+0x8FABBE 0x0125
+0x8FABBF 0x00ED
+0x8FABC0 0x00EC
+0x8FABC1 0x00EF
+0x8FABC2 0x00EE
+0x8FABC3 0x01D0
+0x8FABC5 0x012B
+0x8FABC6 0x012F
+0x8FABC7 0x0129
+0x8FABC8 0x0135
+0x8FABC9 0x0137
+0x8FABCA 0x013A
+0x8FABCB 0x013E
+0x8FABCC 0x013C
+0x8FABCD 0x0144
+0x8FABCE 0x0148
+0x8FABCF 0x0146
+0x8FABD0 0x00F1
+0x8FABD1 0x00F3
+0x8FABD2 0x00F2
+0x8FABD3 0x00F6
+0x8FABD4 0x00F4
+0x8FABD5 0x01D2
+0x8FABD6 0x0151
+0x8FABD7 0x014D
+0x8FABD8 0x00F5
+0x8FABD9 0x0155
+0x8FABDA 0x0159
+0x8FABDB 0x0157
+0x8FABDC 0x015B
+0x8FABDD 0x015D
+0x8FABDE 0x0161
+0x8FABDF 0x015F
+0x8FABE0 0x0165
+0x8FABE1 0x0163
+0x8FABE2 0x00FA
+0x8FABE3 0x00F9
+0x8FABE4 0x00FC
+0x8FABE5 0x00FB
+0x8FABE6 0x016D
+0x8FABE7 0x01D4
+0x8FABE8 0x0171
+0x8FABE9 0x016B
+0x8FABEA 0x0173
+0x8FABEB 0x016F
+0x8FABEC 0x0169
+0x8FABED 0x01D8
+0x8FABEE 0x01DC
+0x8FABEF 0x01DA
+0x8FABF0 0x01D6
+0x8FABF1 0x0175
+0x8FABF2 0x00FD
+0x8FABF3 0x00FF
+0x8FABF4 0x0177
+0x8FABF5 0x017A
+0x8FABF6 0x017E
+0x8FABF7 0x017C
+0x8FB0A1 0x4E02
+0x8FB0A2 0x4E04
+0x8FB0A3 0x4E05
+0x8FB0A4 0x4E0C
+0x8FB0A5 0x4E12
+0x8FB0A6 0x4E1F
+0x8FB0A7 0x4E23
+0x8FB0A8 0x4E24
+0x8FB0A9 0x4E28
+0x8FB0AA 0x4E2B
+0x8FB0AB 0x4E2E
+0x8FB0AC 0x4E2F
+0x8FB0AD 0x4E30
+0x8FB0AE 0x4E35
+0x8FB0AF 0x4E40
+0x8FB0B0 0x4E41
+0x8FB0B1 0x4E44
+0x8FB0B2 0x4E47
+0x8FB0B3 0x4E51
+0x8FB0B4 0x4E5A
+0x8FB0B5 0x4E5C
+0x8FB0B6 0x4E63
+0x8FB0B7 0x4E68
+0x8FB0B8 0x4E69
+0x8FB0B9 0x4E74
+0x8FB0BA 0x4E75
+0x8FB0BB 0x4E79
+0x8FB0BC 0x4E7F
+0x8FB0BD 0x4E8D
+0x8FB0BE 0x4E96
+0x8FB0BF 0x4E97
+0x8FB0C0 0x4E9D
+0x8FB0C1 0x4EAF
+0x8FB0C2 0x4EB9
+0x8FB0C3 0x4EC3
+0x8FB0C4 0x4ED0
+0x8FB0C5 0x4EDA
+0x8FB0C6 0x4EDB
+0x8FB0C7 0x4EE0
+0x8FB0C8 0x4EE1
+0x8FB0C9 0x4EE2
+0x8FB0CA 0x4EE8
+0x8FB0CB 0x4EEF
+0x8FB0CC 0x4EF1
+0x8FB0CD 0x4EF3
+0x8FB0CE 0x4EF5
+0x8FB0CF 0x4EFD
+0x8FB0D0 0x4EFE
+0x8FB0D1 0x4EFF
+0x8FB0D2 0x4F00
+0x8FB0D3 0x4F02
+0x8FB0D4 0x4F03
+0x8FB0D5 0x4F08
+0x8FB0D6 0x4F0B
+0x8FB0D7 0x4F0C
+0x8FB0D8 0x4F12
+0x8FB0D9 0x4F15
+0x8FB0DA 0x4F16
+0x8FB0DB 0x4F17
+0x8FB0DC 0x4F19
+0x8FB0DD 0x4F2E
+0x8FB0DE 0x4F31
+0x8FB0DF 0x4F60
+0x8FB0E0 0x4F33
+0x8FB0E1 0x4F35
+0x8FB0E2 0x4F37
+0x8FB0E3 0x4F39
+0x8FB0E4 0x4F3B
+0x8FB0E5 0x4F3E
+0x8FB0E6 0x4F40
+0x8FB0E7 0x4F42
+0x8FB0E8 0x4F48
+0x8FB0E9 0x4F49
+0x8FB0EA 0x4F4B
+0x8FB0EB 0x4F4C
+0x8FB0EC 0x4F52
+0x8FB0ED 0x4F54
+0x8FB0EE 0x4F56
+0x8FB0EF 0x4F58
+0x8FB0F0 0x4F5F
+0x8FB0F1 0x4F63
+0x8FB0F2 0x4F6A
+0x8FB0F3 0x4F6C
+0x8FB0F4 0x4F6E
+0x8FB0F5 0x4F71
+0x8FB0F6 0x4F77
+0x8FB0F7 0x4F78
+0x8FB0F8 0x4F79
+0x8FB0F9 0x4F7A
+0x8FB0FA 0x4F7D
+0x8FB0FB 0x4F7E
+0x8FB0FC 0x4F81
+0x8FB0FD 0x4F82
+0x8FB0FE 0x4F84
+0x8FB1A1 0x4F85
+0x8FB1A2 0x4F89
+0x8FB1A3 0x4F8A
+0x8FB1A4 0x4F8C
+0x8FB1A5 0x4F8E
+0x8FB1A6 0x4F90
+0x8FB1A7 0x4F92
+0x8FB1A8 0x4F93
+0x8FB1A9 0x4F94
+0x8FB1AA 0x4F97
+0x8FB1AB 0x4F99
+0x8FB1AC 0x4F9A
+0x8FB1AD 0x4F9E
+0x8FB1AE 0x4F9F
+0x8FB1AF 0x4FB2
+0x8FB1B0 0x4FB7
+0x8FB1B1 0x4FB9
+0x8FB1B2 0x4FBB
+0x8FB1B3 0x4FBC
+0x8FB1B4 0x4FBD
+0x8FB1B5 0x4FBE
+0x8FB1B6 0x4FC0
+0x8FB1B7 0x4FC1
+0x8FB1B8 0x4FC5
+0x8FB1B9 0x4FC6
+0x8FB1BA 0x4FC8
+0x8FB1BB 0x4FC9
+0x8FB1BC 0x4FCB
+0x8FB1BD 0x4FCC
+0x8FB1BE 0x4FCD
+0x8FB1BF 0x4FCF
+0x8FB1C0 0x4FD2
+0x8FB1C1 0x4FDC
+0x8FB1C2 0x4FE0
+0x8FB1C3 0x4FE2
+0x8FB1C4 0x4FF0
+0x8FB1C5 0x4FF2
+0x8FB1C6 0x4FFC
+0x8FB1C7 0x4FFD
+0x8FB1C8 0x4FFF
+0x8FB1C9 0x5000
+0x8FB1CA 0x5001
+0x8FB1CB 0x5004
+0x8FB1CC 0x5007
+0x8FB1CD 0x500A
+0x8FB1CE 0x500C
+0x8FB1CF 0x500E
+0x8FB1D0 0x5010
+0x8FB1D1 0x5013
+0x8FB1D2 0x5017
+0x8FB1D3 0x5018
+0x8FB1D4 0x501B
+0x8FB1D5 0x501C
+0x8FB1D6 0x501D
+0x8FB1D7 0x501E
+0x8FB1D8 0x5022
+0x8FB1D9 0x5027
+0x8FB1DA 0x502E
+0x8FB1DB 0x5030
+0x8FB1DC 0x5032
+0x8FB1DD 0x5033
+0x8FB1DE 0x5035
+0x8FB1DF 0x5040
+0x8FB1E0 0x5041
+0x8FB1E1 0x5042
+0x8FB1E2 0x5045
+0x8FB1E3 0x5046
+0x8FB1E4 0x504A
+0x8FB1E5 0x504C
+0x8FB1E6 0x504E
+0x8FB1E7 0x5051
+0x8FB1E8 0x5052
+0x8FB1E9 0x5053
+0x8FB1EA 0x5057
+0x8FB1EB 0x5059
+0x8FB1EC 0x505F
+0x8FB1ED 0x5060
+0x8FB1EE 0x5062
+0x8FB1EF 0x5063
+0x8FB1F0 0x5066
+0x8FB1F1 0x5067
+0x8FB1F2 0x506A
+0x8FB1F3 0x506D
+0x8FB1F4 0x5070
+0x8FB1F5 0x5071
+0x8FB1F6 0x503B
+0x8FB1F7 0x5081
+0x8FB1F8 0x5083
+0x8FB1F9 0x5084
+0x8FB1FA 0x5086
+0x8FB1FB 0x508A
+0x8FB1FC 0x508E
+0x8FB1FD 0x508F
+0x8FB1FE 0x5090
+0x8FB2A1 0x5092
+0x8FB2A2 0x5093
+0x8FB2A3 0x5094
+0x8FB2A4 0x5096
+0x8FB2A5 0x509B
+0x8FB2A6 0x509C
+0x8FB2A7 0x509E
+0x8FB2A8 0x509F
+0x8FB2A9 0x50A0
+0x8FB2AA 0x50A1
+0x8FB2AB 0x50A2
+0x8FB2AC 0x50AA
+0x8FB2AD 0x50AF
+0x8FB2AE 0x50B0
+0x8FB2AF 0x50B9
+0x8FB2B0 0x50BA
+0x8FB2B1 0x50BD
+0x8FB2B2 0x50C0
+0x8FB2B3 0x50C3
+0x8FB2B4 0x50C4
+0x8FB2B5 0x50C7
+0x8FB2B6 0x50CC
+0x8FB2B7 0x50CE
+0x8FB2B8 0x50D0
+0x8FB2B9 0x50D3
+0x8FB2BA 0x50D4
+0x8FB2BB 0x50D8
+0x8FB2BC 0x50DC
+0x8FB2BD 0x50DD
+0x8FB2BE 0x50DF
+0x8FB2BF 0x50E2
+0x8FB2C0 0x50E4
+0x8FB2C1 0x50E6
+0x8FB2C2 0x50E8
+0x8FB2C3 0x50E9
+0x8FB2C4 0x50EF
+0x8FB2C5 0x50F1
+0x8FB2C6 0x50F6
+0x8FB2C7 0x50FA
+0x8FB2C8 0x50FE
+0x8FB2C9 0x5103
+0x8FB2CA 0x5106
+0x8FB2CB 0x5107
+0x8FB2CC 0x5108
+0x8FB2CD 0x510B
+0x8FB2CE 0x510C
+0x8FB2CF 0x510D
+0x8FB2D0 0x510E
+0x8FB2D1 0x50F2
+0x8FB2D2 0x5110
+0x8FB2D3 0x5117
+0x8FB2D4 0x5119
+0x8FB2D5 0x511B
+0x8FB2D6 0x511C
+0x8FB2D7 0x511D
+0x8FB2D8 0x511E
+0x8FB2D9 0x5123
+0x8FB2DA 0x5127
+0x8FB2DB 0x5128
+0x8FB2DC 0x512C
+0x8FB2DD 0x512D
+0x8FB2DE 0x512F
+0x8FB2DF 0x5131
+0x8FB2E0 0x5133
+0x8FB2E1 0x5134
+0x8FB2E2 0x5135
+0x8FB2E3 0x5138
+0x8FB2E4 0x5139
+0x8FB2E5 0x5142
+0x8FB2E6 0x514A
+0x8FB2E7 0x514F
+0x8FB2E8 0x5153
+0x8FB2E9 0x5155
+0x8FB2EA 0x5157
+0x8FB2EB 0x5158
+0x8FB2EC 0x515F
+0x8FB2ED 0x5164
+0x8FB2EE 0x5166
+0x8FB2EF 0x517E
+0x8FB2F0 0x5183
+0x8FB2F1 0x5184
+0x8FB2F2 0x518B
+0x8FB2F3 0x518E
+0x8FB2F4 0x5198
+0x8FB2F5 0x519D
+0x8FB2F6 0x51A1
+0x8FB2F7 0x51A3
+0x8FB2F8 0x51AD
+0x8FB2F9 0x51B8
+0x8FB2FA 0x51BA
+0x8FB2FB 0x51BC
+0x8FB2FC 0x51BE
+0x8FB2FD 0x51BF
+0x8FB2FE 0x51C2
+0x8FB3A1 0x51C8
+0x8FB3A2 0x51CF
+0x8FB3A3 0x51D1
+0x8FB3A4 0x51D2
+0x8FB3A5 0x51D3
+0x8FB3A6 0x51D5
+0x8FB3A7 0x51D8
+0x8FB3A8 0x51DE
+0x8FB3A9 0x51E2
+0x8FB3AA 0x51E5
+0x8FB3AB 0x51EE
+0x8FB3AC 0x51F2
+0x8FB3AD 0x51F3
+0x8FB3AE 0x51F4
+0x8FB3AF 0x51F7
+0x8FB3B0 0x5201
+0x8FB3B1 0x5202
+0x8FB3B2 0x5205
+0x8FB3B3 0x5212
+0x8FB3B4 0x5213
+0x8FB3B5 0x5215
+0x8FB3B6 0x5216
+0x8FB3B7 0x5218
+0x8FB3B8 0x5222
+0x8FB3B9 0x5228
+0x8FB3BA 0x5231
+0x8FB3BB 0x5232
+0x8FB3BC 0x5235
+0x8FB3BD 0x523C
+0x8FB3BE 0x5245
+0x8FB3BF 0x5249
+0x8FB3C0 0x5255
+0x8FB3C1 0x5257
+0x8FB3C2 0x5258
+0x8FB3C3 0x525A
+0x8FB3C4 0x525C
+0x8FB3C5 0x525F
+0x8FB3C6 0x5260
+0x8FB3C7 0x5261
+0x8FB3C8 0x5266
+0x8FB3C9 0x526E
+0x8FB3CA 0x5277
+0x8FB3CB 0x5278
+0x8FB3CC 0x5279
+0x8FB3CD 0x5280
+0x8FB3CE 0x5282
+0x8FB3CF 0x5285
+0x8FB3D0 0x528A
+0x8FB3D1 0x528C
+0x8FB3D2 0x5293
+0x8FB3D3 0x5295
+0x8FB3D4 0x5296
+0x8FB3D5 0x5297
+0x8FB3D6 0x5298
+0x8FB3D7 0x529A
+0x8FB3D8 0x529C
+0x8FB3D9 0x52A4
+0x8FB3DA 0x52A5
+0x8FB3DB 0x52A6
+0x8FB3DC 0x52A7
+0x8FB3DD 0x52AF
+0x8FB3DE 0x52B0
+0x8FB3DF 0x52B6
+0x8FB3E0 0x52B7
+0x8FB3E1 0x52B8
+0x8FB3E2 0x52BA
+0x8FB3E3 0x52BB
+0x8FB3E4 0x52BD
+0x8FB3E5 0x52C0
+0x8FB3E6 0x52C4
+0x8FB3E7 0x52C6
+0x8FB3E8 0x52C8
+0x8FB3E9 0x52CC
+0x8FB3EA 0x52CF
+0x8FB3EB 0x52D1
+0x8FB3EC 0x52D4
+0x8FB3ED 0x52D6
+0x8FB3EE 0x52DB
+0x8FB3EF 0x52DC
+0x8FB3F0 0x52E1
+0x8FB3F1 0x52E5
+0x8FB3F2 0x52E8
+0x8FB3F3 0x52E9
+0x8FB3F4 0x52EA
+0x8FB3F5 0x52EC
+0x8FB3F6 0x52F0
+0x8FB3F7 0x52F1
+0x8FB3F8 0x52F4
+0x8FB3F9 0x52F6
+0x8FB3FA 0x52F7
+0x8FB3FB 0x5300
+0x8FB3FC 0x5303
+0x8FB3FD 0x530A
+0x8FB3FE 0x530B
+0x8FB4A1 0x530C
+0x8FB4A2 0x5311
+0x8FB4A3 0x5313
+0x8FB4A4 0x5318
+0x8FB4A5 0x531B
+0x8FB4A6 0x531C
+0x8FB4A7 0x531E
+0x8FB4A8 0x531F
+0x8FB4A9 0x5325
+0x8FB4AA 0x5327
+0x8FB4AB 0x5328
+0x8FB4AC 0x5329
+0x8FB4AD 0x532B
+0x8FB4AE 0x532C
+0x8FB4AF 0x532D
+0x8FB4B0 0x5330
+0x8FB4B1 0x5332
+0x8FB4B2 0x5335
+0x8FB4B3 0x533C
+0x8FB4B4 0x533D
+0x8FB4B5 0x533E
+0x8FB4B6 0x5342
+0x8FB4B7 0x534C
+0x8FB4B8 0x534B
+0x8FB4B9 0x5359
+0x8FB4BA 0x535B
+0x8FB4BB 0x5361
+0x8FB4BC 0x5363
+0x8FB4BD 0x5365
+0x8FB4BE 0x536C
+0x8FB4BF 0x536D
+0x8FB4C0 0x5372
+0x8FB4C1 0x5379
+0x8FB4C2 0x537E
+0x8FB4C3 0x5383
+0x8FB4C4 0x5387
+0x8FB4C5 0x5388
+0x8FB4C6 0x538E
+0x8FB4C7 0x5393
+0x8FB4C8 0x5394
+0x8FB4C9 0x5399
+0x8FB4CA 0x539D
+0x8FB4CB 0x53A1
+0x8FB4CC 0x53A4
+0x8FB4CD 0x53AA
+0x8FB4CE 0x53AB
+0x8FB4CF 0x53AF
+0x8FB4D0 0x53B2
+0x8FB4D1 0x53B4
+0x8FB4D2 0x53B5
+0x8FB4D3 0x53B7
+0x8FB4D4 0x53B8
+0x8FB4D5 0x53BA
+0x8FB4D6 0x53BD
+0x8FB4D7 0x53C0
+0x8FB4D8 0x53C5
+0x8FB4D9 0x53CF
+0x8FB4DA 0x53D2
+0x8FB4DB 0x53D3
+0x8FB4DC 0x53D5
+0x8FB4DD 0x53DA
+0x8FB4DE 0x53DD
+0x8FB4DF 0x53DE
+0x8FB4E0 0x53E0
+0x8FB4E1 0x53E6
+0x8FB4E2 0x53E7
+0x8FB4E3 0x53F5
+0x8FB4E4 0x5402
+0x8FB4E5 0x5413
+0x8FB4E6 0x541A
+0x8FB4E7 0x5421
+0x8FB4E8 0x5427
+0x8FB4E9 0x5428
+0x8FB4EA 0x542A
+0x8FB4EB 0x542F
+0x8FB4EC 0x5431
+0x8FB4ED 0x5434
+0x8FB4EE 0x5435
+0x8FB4EF 0x5443
+0x8FB4F0 0x5444
+0x8FB4F1 0x5447
+0x8FB4F2 0x544D
+0x8FB4F3 0x544F
+0x8FB4F4 0x545E
+0x8FB4F5 0x5462
+0x8FB4F6 0x5464
+0x8FB4F7 0x5466
+0x8FB4F8 0x5467
+0x8FB4F9 0x5469
+0x8FB4FA 0x546B
+0x8FB4FB 0x546D
+0x8FB4FC 0x546E
+0x8FB4FD 0x5474
+0x8FB4FE 0x547F
+0x8FB5A1 0x5481
+0x8FB5A2 0x5483
+0x8FB5A3 0x5485
+0x8FB5A4 0x5488
+0x8FB5A5 0x5489
+0x8FB5A6 0x548D
+0x8FB5A7 0x5491
+0x8FB5A8 0x5495
+0x8FB5A9 0x5496
+0x8FB5AA 0x549C
+0x8FB5AB 0x549F
+0x8FB5AC 0x54A1
+0x8FB5AD 0x54A6
+0x8FB5AE 0x54A7
+0x8FB5AF 0x54A9
+0x8FB5B0 0x54AA
+0x8FB5B1 0x54AD
+0x8FB5B2 0x54AE
+0x8FB5B3 0x54B1
+0x8FB5B4 0x54B7
+0x8FB5B5 0x54B9
+0x8FB5B6 0x54BA
+0x8FB5B7 0x54BB
+0x8FB5B8 0x54BF
+0x8FB5B9 0x54C6
+0x8FB5BA 0x54CA
+0x8FB5BB 0x54CD
+0x8FB5BC 0x54CE
+0x8FB5BD 0x54E0
+0x8FB5BE 0x54EA
+0x8FB5BF 0x54EC
+0x8FB5C0 0x54EF
+0x8FB5C1 0x54F6
+0x8FB5C2 0x54FC
+0x8FB5C3 0x54FE
+0x8FB5C4 0x54FF
+0x8FB5C5 0x5500
+0x8FB5C6 0x5501
+0x8FB5C7 0x5505
+0x8FB5C8 0x5508
+0x8FB5C9 0x5509
+0x8FB5CA 0x550C
+0x8FB5CB 0x550D
+0x8FB5CC 0x550E
+0x8FB5CD 0x5515
+0x8FB5CE 0x552A
+0x8FB5CF 0x552B
+0x8FB5D0 0x5532
+0x8FB5D1 0x5535
+0x8FB5D2 0x5536
+0x8FB5D3 0x553B
+0x8FB5D4 0x553C
+0x8FB5D5 0x553D
+0x8FB5D6 0x5541
+0x8FB5D7 0x5547
+0x8FB5D8 0x5549
+0x8FB5D9 0x554A
+0x8FB5DA 0x554D
+0x8FB5DB 0x5550
+0x8FB5DC 0x5551
+0x8FB5DD 0x5558
+0x8FB5DE 0x555A
+0x8FB5DF 0x555B
+0x8FB5E0 0x555E
+0x8FB5E1 0x5560
+0x8FB5E2 0x5561
+0x8FB5E3 0x5564
+0x8FB5E4 0x5566
+0x8FB5E5 0x557F
+0x8FB5E6 0x5581
+0x8FB5E7 0x5582
+0x8FB5E8 0x5586
+0x8FB5E9 0x5588
+0x8FB5EA 0x558E
+0x8FB5EB 0x558F
+0x8FB5EC 0x5591
+0x8FB5ED 0x5592
+0x8FB5EE 0x5593
+0x8FB5EF 0x5594
+0x8FB5F0 0x5597
+0x8FB5F1 0x55A3
+0x8FB5F2 0x55A4
+0x8FB5F3 0x55AD
+0x8FB5F4 0x55B2
+0x8FB5F5 0x55BF
+0x8FB5F6 0x55C1
+0x8FB5F7 0x55C3
+0x8FB5F8 0x55C6
+0x8FB5F9 0x55C9
+0x8FB5FA 0x55CB
+0x8FB5FB 0x55CC
+0x8FB5FC 0x55CE
+0x8FB5FD 0x55D1
+0x8FB5FE 0x55D2
+0x8FB6A1 0x55D3
+0x8FB6A2 0x55D7
+0x8FB6A3 0x55D8
+0x8FB6A4 0x55DB
+0x8FB6A5 0x55DE
+0x8FB6A6 0x55E2
+0x8FB6A7 0x55E9
+0x8FB6A8 0x55F6
+0x8FB6A9 0x55FF
+0x8FB6AA 0x5605
+0x8FB6AB 0x5608
+0x8FB6AC 0x560A
+0x8FB6AD 0x560D
+0x8FB6AE 0x560E
+0x8FB6AF 0x560F
+0x8FB6B0 0x5610
+0x8FB6B1 0x5611
+0x8FB6B2 0x5612
+0x8FB6B3 0x5619
+0x8FB6B4 0x562C
+0x8FB6B5 0x5630
+0x8FB6B6 0x5633
+0x8FB6B7 0x5635
+0x8FB6B8 0x5637
+0x8FB6B9 0x5639
+0x8FB6BA 0x563B
+0x8FB6BB 0x563C
+0x8FB6BC 0x563D
+0x8FB6BD 0x563F
+0x8FB6BE 0x5640
+0x8FB6BF 0x5641
+0x8FB6C0 0x5643
+0x8FB6C1 0x5644
+0x8FB6C2 0x5646
+0x8FB6C3 0x5649
+0x8FB6C4 0x564B
+0x8FB6C5 0x564D
+0x8FB6C6 0x564F
+0x8FB6C7 0x5654
+0x8FB6C8 0x565E
+0x8FB6C9 0x5660
+0x8FB6CA 0x5661
+0x8FB6CB 0x5662
+0x8FB6CC 0x5663
+0x8FB6CD 0x5666
+0x8FB6CE 0x5669
+0x8FB6CF 0x566D
+0x8FB6D0 0x566F
+0x8FB6D1 0x5671
+0x8FB6D2 0x5672
+0x8FB6D3 0x5675
+0x8FB6D4 0x5684
+0x8FB6D5 0x5685
+0x8FB6D6 0x5688
+0x8FB6D7 0x568B
+0x8FB6D8 0x568C
+0x8FB6D9 0x5695
+0x8FB6DA 0x5699
+0x8FB6DB 0x569A
+0x8FB6DC 0x569D
+0x8FB6DD 0x569E
+0x8FB6DE 0x569F
+0x8FB6DF 0x56A6
+0x8FB6E0 0x56A7
+0x8FB6E1 0x56A8
+0x8FB6E2 0x56A9
+0x8FB6E3 0x56AB
+0x8FB6E4 0x56AC
+0x8FB6E5 0x56AD
+0x8FB6E6 0x56B1
+0x8FB6E7 0x56B3
+0x8FB6E8 0x56B7
+0x8FB6E9 0x56BE
+0x8FB6EA 0x56C5
+0x8FB6EB 0x56C9
+0x8FB6EC 0x56CA
+0x8FB6ED 0x56CB
+0x8FB6EE 0x56CF
+0x8FB6EF 0x56D0
+0x8FB6F0 0x56CC
+0x8FB6F1 0x56CD
+0x8FB6F2 0x56D9
+0x8FB6F3 0x56DC
+0x8FB6F4 0x56DD
+0x8FB6F5 0x56DF
+0x8FB6F6 0x56E1
+0x8FB6F7 0x56E4
+0x8FB6F8 0x56E5
+0x8FB6F9 0x56E6
+0x8FB6FA 0x56E7
+0x8FB6FB 0x56E8
+0x8FB6FC 0x56F1
+0x8FB6FD 0x56EB
+0x8FB6FE 0x56ED
+0x8FB7A1 0x56F6
+0x8FB7A2 0x56F7
+0x8FB7A3 0x5701
+0x8FB7A4 0x5702
+0x8FB7A5 0x5707
+0x8FB7A6 0x570A
+0x8FB7A7 0x570C
+0x8FB7A8 0x5711
+0x8FB7A9 0x5715
+0x8FB7AA 0x571A
+0x8FB7AB 0x571B
+0x8FB7AC 0x571D
+0x8FB7AD 0x5720
+0x8FB7AE 0x5722
+0x8FB7AF 0x5723
+0x8FB7B0 0x5724
+0x8FB7B1 0x5725
+0x8FB7B2 0x5729
+0x8FB7B3 0x572A
+0x8FB7B4 0x572C
+0x8FB7B5 0x572E
+0x8FB7B6 0x572F
+0x8FB7B7 0x5733
+0x8FB7B8 0x5734
+0x8FB7B9 0x573D
+0x8FB7BA 0x573E
+0x8FB7BB 0x573F
+0x8FB7BC 0x5745
+0x8FB7BD 0x5746
+0x8FB7BE 0x574C
+0x8FB7BF 0x574D
+0x8FB7C0 0x5752
+0x8FB7C1 0x5762
+0x8FB7C2 0x5765
+0x8FB7C3 0x5767
+0x8FB7C4 0x5768
+0x8FB7C5 0x576B
+0x8FB7C6 0x576D
+0x8FB7C7 0x576E
+0x8FB7C8 0x576F
+0x8FB7C9 0x5770
+0x8FB7CA 0x5771
+0x8FB7CB 0x5773
+0x8FB7CC 0x5774
+0x8FB7CD 0x5775
+0x8FB7CE 0x5777
+0x8FB7CF 0x5779
+0x8FB7D0 0x577A
+0x8FB7D1 0x577B
+0x8FB7D2 0x577C
+0x8FB7D3 0x577E
+0x8FB7D4 0x5781
+0x8FB7D5 0x5783
+0x8FB7D6 0x578C
+0x8FB7D7 0x5794
+0x8FB7D8 0x5797
+0x8FB7D9 0x5799
+0x8FB7DA 0x579A
+0x8FB7DB 0x579C
+0x8FB7DC 0x579D
+0x8FB7DD 0x579E
+0x8FB7DE 0x579F
+0x8FB7DF 0x57A1
+0x8FB7E0 0x5795
+0x8FB7E1 0x57A7
+0x8FB7E2 0x57A8
+0x8FB7E3 0x57A9
+0x8FB7E4 0x57AC
+0x8FB7E5 0x57B8
+0x8FB7E6 0x57BD
+0x8FB7E7 0x57C7
+0x8FB7E8 0x57C8
+0x8FB7E9 0x57CC
+0x8FB7EA 0x57CF
+0x8FB7EB 0x57D5
+0x8FB7EC 0x57DD
+0x8FB7ED 0x57DE
+0x8FB7EE 0x57E4
+0x8FB7EF 0x57E6
+0x8FB7F0 0x57E7
+0x8FB7F1 0x57E9
+0x8FB7F2 0x57ED
+0x8FB7F3 0x57F0
+0x8FB7F4 0x57F5
+0x8FB7F5 0x57F6
+0x8FB7F6 0x57F8
+0x8FB7F7 0x57FD
+0x8FB7F8 0x57FE
+0x8FB7F9 0x57FF
+0x8FB7FA 0x5803
+0x8FB7FB 0x5804
+0x8FB7FC 0x5808
+0x8FB7FD 0x5809
+0x8FB7FE 0x57E1
+0x8FB8A1 0x580C
+0x8FB8A2 0x580D
+0x8FB8A3 0x581B
+0x8FB8A4 0x581E
+0x8FB8A5 0x581F
+0x8FB8A6 0x5820
+0x8FB8A7 0x5826
+0x8FB8A8 0x5827
+0x8FB8A9 0x582D
+0x8FB8AA 0x5832
+0x8FB8AB 0x5839
+0x8FB8AC 0x583F
+0x8FB8AD 0x5849
+0x8FB8AE 0x584C
+0x8FB8AF 0x584D
+0x8FB8B0 0x584F
+0x8FB8B1 0x5850
+0x8FB8B2 0x5855
+0x8FB8B3 0x585F
+0x8FB8B4 0x5861
+0x8FB8B5 0x5864
+0x8FB8B6 0x5867
+0x8FB8B7 0x5868
+0x8FB8B8 0x5878
+0x8FB8B9 0x587C
+0x8FB8BA 0x587F
+0x8FB8BB 0x5880
+0x8FB8BC 0x5881
+0x8FB8BD 0x5887
+0x8FB8BE 0x5888
+0x8FB8BF 0x5889
+0x8FB8C0 0x588A
+0x8FB8C1 0x588C
+0x8FB8C2 0x588D
+0x8FB8C3 0x588F
+0x8FB8C4 0x5890
+0x8FB8C5 0x5894
+0x8FB8C6 0x5896
+0x8FB8C7 0x589D
+0x8FB8C8 0x58A0
+0x8FB8C9 0x58A1
+0x8FB8CA 0x58A2
+0x8FB8CB 0x58A6
+0x8FB8CC 0x58A9
+0x8FB8CD 0x58B1
+0x8FB8CE 0x58B2
+0x8FB8CF 0x58C4
+0x8FB8D0 0x58BC
+0x8FB8D1 0x58C2
+0x8FB8D2 0x58C8
+0x8FB8D3 0x58CD
+0x8FB8D4 0x58CE
+0x8FB8D5 0x58D0
+0x8FB8D6 0x58D2
+0x8FB8D7 0x58D4
+0x8FB8D8 0x58D6
+0x8FB8D9 0x58DA
+0x8FB8DA 0x58DD
+0x8FB8DB 0x58E1
+0x8FB8DC 0x58E2
+0x8FB8DD 0x58E9
+0x8FB8DE 0x58F3
+0x8FB8DF 0x5905
+0x8FB8E0 0x5906
+0x8FB8E1 0x590B
+0x8FB8E2 0x590C
+0x8FB8E3 0x5912
+0x8FB8E4 0x5913
+0x8FB8E5 0x5914
+0x8FB8E6 0x8641
+0x8FB8E7 0x591D
+0x8FB8E8 0x5921
+0x8FB8E9 0x5923
+0x8FB8EA 0x5924
+0x8FB8EB 0x5928
+0x8FB8EC 0x592F
+0x8FB8ED 0x5930
+0x8FB8EE 0x5933
+0x8FB8EF 0x5935
+0x8FB8F0 0x5936
+0x8FB8F1 0x593F
+0x8FB8F2 0x5943
+0x8FB8F3 0x5946
+0x8FB8F4 0x5952
+0x8FB8F5 0x5953
+0x8FB8F6 0x5959
+0x8FB8F7 0x595B
+0x8FB8F8 0x595D
+0x8FB8F9 0x595E
+0x8FB8FA 0x595F
+0x8FB8FB 0x5961
+0x8FB8FC 0x5963
+0x8FB8FD 0x596B
+0x8FB8FE 0x596D
+0x8FB9A1 0x596F
+0x8FB9A2 0x5972
+0x8FB9A3 0x5975
+0x8FB9A4 0x5976
+0x8FB9A5 0x5979
+0x8FB9A6 0x597B
+0x8FB9A7 0x597C
+0x8FB9A8 0x598B
+0x8FB9A9 0x598C
+0x8FB9AA 0x598E
+0x8FB9AB 0x5992
+0x8FB9AC 0x5995
+0x8FB9AD 0x5997
+0x8FB9AE 0x599F
+0x8FB9AF 0x59A4
+0x8FB9B0 0x59A7
+0x8FB9B1 0x59AD
+0x8FB9B2 0x59AE
+0x8FB9B3 0x59AF
+0x8FB9B4 0x59B0
+0x8FB9B5 0x59B3
+0x8FB9B6 0x59B7
+0x8FB9B7 0x59BA
+0x8FB9B8 0x59BC
+0x8FB9B9 0x59C1
+0x8FB9BA 0x59C3
+0x8FB9BB 0x59C4
+0x8FB9BC 0x59C8
+0x8FB9BD 0x59CA
+0x8FB9BE 0x59CD
+0x8FB9BF 0x59D2
+0x8FB9C0 0x59DD
+0x8FB9C1 0x59DE
+0x8FB9C2 0x59DF
+0x8FB9C3 0x59E3
+0x8FB9C4 0x59E4
+0x8FB9C5 0x59E7
+0x8FB9C6 0x59EE
+0x8FB9C7 0x59EF
+0x8FB9C8 0x59F1
+0x8FB9C9 0x59F2
+0x8FB9CA 0x59F4
+0x8FB9CB 0x59F7
+0x8FB9CC 0x5A00
+0x8FB9CD 0x5A04
+0x8FB9CE 0x5A0C
+0x8FB9CF 0x5A0D
+0x8FB9D0 0x5A0E
+0x8FB9D1 0x5A12
+0x8FB9D2 0x5A13
+0x8FB9D3 0x5A1E
+0x8FB9D4 0x5A23
+0x8FB9D5 0x5A24
+0x8FB9D6 0x5A27
+0x8FB9D7 0x5A28
+0x8FB9D8 0x5A2A
+0x8FB9D9 0x5A2D
+0x8FB9DA 0x5A30
+0x8FB9DB 0x5A44
+0x8FB9DC 0x5A45
+0x8FB9DD 0x5A47
+0x8FB9DE 0x5A48
+0x8FB9DF 0x5A4C
+0x8FB9E0 0x5A50
+0x8FB9E1 0x5A55
+0x8FB9E2 0x5A5E
+0x8FB9E3 0x5A63
+0x8FB9E4 0x5A65
+0x8FB9E5 0x5A67
+0x8FB9E6 0x5A6D
+0x8FB9E7 0x5A77
+0x8FB9E8 0x5A7A
+0x8FB9E9 0x5A7B
+0x8FB9EA 0x5A7E
+0x8FB9EB 0x5A8B
+0x8FB9EC 0x5A90
+0x8FB9ED 0x5A93
+0x8FB9EE 0x5A96
+0x8FB9EF 0x5A99
+0x8FB9F0 0x5A9C
+0x8FB9F1 0x5A9E
+0x8FB9F2 0x5A9F
+0x8FB9F3 0x5AA0
+0x8FB9F4 0x5AA2
+0x8FB9F5 0x5AA7
+0x8FB9F6 0x5AAC
+0x8FB9F7 0x5AB1
+0x8FB9F8 0x5AB2
+0x8FB9F9 0x5AB3
+0x8FB9FA 0x5AB5
+0x8FB9FB 0x5AB8
+0x8FB9FC 0x5ABA
+0x8FB9FD 0x5ABB
+0x8FB9FE 0x5ABF
+0x8FBAA1 0x5AC4
+0x8FBAA2 0x5AC6
+0x8FBAA3 0x5AC8
+0x8FBAA4 0x5ACF
+0x8FBAA5 0x5ADA
+0x8FBAA6 0x5ADC
+0x8FBAA7 0x5AE0
+0x8FBAA8 0x5AE5
+0x8FBAA9 0x5AEA
+0x8FBAAA 0x5AEE
+0x8FBAAB 0x5AF5
+0x8FBAAC 0x5AF6
+0x8FBAAD 0x5AFD
+0x8FBAAE 0x5B00
+0x8FBAAF 0x5B01
+0x8FBAB0 0x5B08
+0x8FBAB1 0x5B17
+0x8FBAB2 0x5B34
+0x8FBAB3 0x5B19
+0x8FBAB4 0x5B1B
+0x8FBAB5 0x5B1D
+0x8FBAB6 0x5B21
+0x8FBAB7 0x5B25
+0x8FBAB8 0x5B2D
+0x8FBAB9 0x5B38
+0x8FBABA 0x5B41
+0x8FBABB 0x5B4B
+0x8FBABC 0x5B4C
+0x8FBABD 0x5B52
+0x8FBABE 0x5B56
+0x8FBABF 0x5B5E
+0x8FBAC0 0x5B68
+0x8FBAC1 0x5B6E
+0x8FBAC2 0x5B6F
+0x8FBAC3 0x5B7C
+0x8FBAC4 0x5B7D
+0x8FBAC5 0x5B7E
+0x8FBAC6 0x5B7F
+0x8FBAC7 0x5B81
+0x8FBAC8 0x5B84
+0x8FBAC9 0x5B86
+0x8FBACA 0x5B8A
+0x8FBACB 0x5B8E
+0x8FBACC 0x5B90
+0x8FBACD 0x5B91
+0x8FBACE 0x5B93
+0x8FBACF 0x5B94
+0x8FBAD0 0x5B96
+0x8FBAD1 0x5BA8
+0x8FBAD2 0x5BA9
+0x8FBAD3 0x5BAC
+0x8FBAD4 0x5BAD
+0x8FBAD5 0x5BAF
+0x8FBAD6 0x5BB1
+0x8FBAD7 0x5BB2
+0x8FBAD8 0x5BB7
+0x8FBAD9 0x5BBA
+0x8FBADA 0x5BBC
+0x8FBADB 0x5BC0
+0x8FBADC 0x5BC1
+0x8FBADD 0x5BCD
+0x8FBADE 0x5BCF
+0x8FBADF 0x5BD6
+0x8FBAE0 0x5BD7
+0x8FBAE1 0x5BD8
+0x8FBAE2 0x5BD9
+0x8FBAE3 0x5BDA
+0x8FBAE4 0x5BE0
+0x8FBAE5 0x5BEF
+0x8FBAE6 0x5BF1
+0x8FBAE7 0x5BF4
+0x8FBAE8 0x5BFD
+0x8FBAE9 0x5C0C
+0x8FBAEA 0x5C17
+0x8FBAEB 0x5C1E
+0x8FBAEC 0x5C1F
+0x8FBAED 0x5C23
+0x8FBAEE 0x5C26
+0x8FBAEF 0x5C29
+0x8FBAF0 0x5C2B
+0x8FBAF1 0x5C2C
+0x8FBAF2 0x5C2E
+0x8FBAF3 0x5C30
+0x8FBAF4 0x5C32
+0x8FBAF5 0x5C35
+0x8FBAF6 0x5C36
+0x8FBAF7 0x5C59
+0x8FBAF8 0x5C5A
+0x8FBAF9 0x5C5C
+0x8FBAFA 0x5C62
+0x8FBAFB 0x5C63
+0x8FBAFC 0x5C67
+0x8FBAFD 0x5C68
+0x8FBAFE 0x5C69
+0x8FBBA1 0x5C6D
+0x8FBBA2 0x5C70
+0x8FBBA3 0x5C74
+0x8FBBA4 0x5C75
+0x8FBBA5 0x5C7A
+0x8FBBA6 0x5C7B
+0x8FBBA7 0x5C7C
+0x8FBBA8 0x5C7D
+0x8FBBA9 0x5C87
+0x8FBBAA 0x5C88
+0x8FBBAB 0x5C8A
+0x8FBBAC 0x5C8F
+0x8FBBAD 0x5C92
+0x8FBBAE 0x5C9D
+0x8FBBAF 0x5C9F
+0x8FBBB0 0x5CA0
+0x8FBBB1 0x5CA2
+0x8FBBB2 0x5CA3
+0x8FBBB3 0x5CA6
+0x8FBBB4 0x5CAA
+0x8FBBB5 0x5CB2
+0x8FBBB6 0x5CB4
+0x8FBBB7 0x5CB5
+0x8FBBB8 0x5CBA
+0x8FBBB9 0x5CC9
+0x8FBBBA 0x5CCB
+0x8FBBBB 0x5CD2
+0x8FBBBC 0x5CDD
+0x8FBBBD 0x5CD7
+0x8FBBBE 0x5CEE
+0x8FBBBF 0x5CF1
+0x8FBBC0 0x5CF2
+0x8FBBC1 0x5CF4
+0x8FBBC2 0x5D01
+0x8FBBC3 0x5D06
+0x8FBBC4 0x5D0D
+0x8FBBC5 0x5D12
+0x8FBBC6 0x5D2B
+0x8FBBC7 0x5D23
+0x8FBBC8 0x5D24
+0x8FBBC9 0x5D26
+0x8FBBCA 0x5D27
+0x8FBBCB 0x5D31
+0x8FBBCC 0x5D34
+0x8FBBCD 0x5D39
+0x8FBBCE 0x5D3D
+0x8FBBCF 0x5D3F
+0x8FBBD0 0x5D42
+0x8FBBD1 0x5D43
+0x8FBBD2 0x5D46
+0x8FBBD3 0x5D48
+0x8FBBD4 0x5D55
+0x8FBBD5 0x5D51
+0x8FBBD6 0x5D59
+0x8FBBD7 0x5D4A
+0x8FBBD8 0x5D5F
+0x8FBBD9 0x5D60
+0x8FBBDA 0x5D61
+0x8FBBDB 0x5D62
+0x8FBBDC 0x5D64
+0x8FBBDD 0x5D6A
+0x8FBBDE 0x5D6D
+0x8FBBDF 0x5D70
+0x8FBBE0 0x5D79
+0x8FBBE1 0x5D7A
+0x8FBBE2 0x5D7E
+0x8FBBE3 0x5D7F
+0x8FBBE4 0x5D81
+0x8FBBE5 0x5D83
+0x8FBBE6 0x5D88
+0x8FBBE7 0x5D8A
+0x8FBBE8 0x5D92
+0x8FBBE9 0x5D93
+0x8FBBEA 0x5D94
+0x8FBBEB 0x5D95
+0x8FBBEC 0x5D99
+0x8FBBED 0x5D9B
+0x8FBBEE 0x5D9F
+0x8FBBEF 0x5DA0
+0x8FBBF0 0x5DA7
+0x8FBBF1 0x5DAB
+0x8FBBF2 0x5DB0
+0x8FBBF3 0x5DB4
+0x8FBBF4 0x5DB8
+0x8FBBF5 0x5DB9
+0x8FBBF6 0x5DC3
+0x8FBBF7 0x5DC7
+0x8FBBF8 0x5DCB
+0x8FBBF9 0x5DD0
+0x8FBBFA 0x5DCE
+0x8FBBFB 0x5DD8
+0x8FBBFC 0x5DD9
+0x8FBBFD 0x5DE0
+0x8FBBFE 0x5DE4
+0x8FBCA1 0x5DE9
+0x8FBCA2 0x5DF8
+0x8FBCA3 0x5DF9
+0x8FBCA4 0x5E00
+0x8FBCA5 0x5E07
+0x8FBCA6 0x5E0D
+0x8FBCA7 0x5E12
+0x8FBCA8 0x5E14
+0x8FBCA9 0x5E15
+0x8FBCAA 0x5E18
+0x8FBCAB 0x5E1F
+0x8FBCAC 0x5E20
+0x8FBCAD 0x5E2E
+0x8FBCAE 0x5E28
+0x8FBCAF 0x5E32
+0x8FBCB0 0x5E35
+0x8FBCB1 0x5E3E
+0x8FBCB2 0x5E4B
+0x8FBCB3 0x5E50
+0x8FBCB4 0x5E49
+0x8FBCB5 0x5E51
+0x8FBCB6 0x5E56
+0x8FBCB7 0x5E58
+0x8FBCB8 0x5E5B
+0x8FBCB9 0x5E5C
+0x8FBCBA 0x5E5E
+0x8FBCBB 0x5E68
+0x8FBCBC 0x5E6A
+0x8FBCBD 0x5E6B
+0x8FBCBE 0x5E6C
+0x8FBCBF 0x5E6D
+0x8FBCC0 0x5E6E
+0x8FBCC1 0x5E70
+0x8FBCC2 0x5E80
+0x8FBCC3 0x5E8B
+0x8FBCC4 0x5E8E
+0x8FBCC5 0x5EA2
+0x8FBCC6 0x5EA4
+0x8FBCC7 0x5EA5
+0x8FBCC8 0x5EA8
+0x8FBCC9 0x5EAA
+0x8FBCCA 0x5EAC
+0x8FBCCB 0x5EB1
+0x8FBCCC 0x5EB3
+0x8FBCCD 0x5EBD
+0x8FBCCE 0x5EBE
+0x8FBCCF 0x5EBF
+0x8FBCD0 0x5EC6
+0x8FBCD1 0x5ECC
+0x8FBCD2 0x5ECB
+0x8FBCD3 0x5ECE
+0x8FBCD4 0x5ED1
+0x8FBCD5 0x5ED2
+0x8FBCD6 0x5ED4
+0x8FBCD7 0x5ED5
+0x8FBCD8 0x5EDC
+0x8FBCD9 0x5EDE
+0x8FBCDA 0x5EE5
+0x8FBCDB 0x5EEB
+0x8FBCDC 0x5F02
+0x8FBCDD 0x5F06
+0x8FBCDE 0x5F07
+0x8FBCDF 0x5F08
+0x8FBCE0 0x5F0E
+0x8FBCE1 0x5F19
+0x8FBCE2 0x5F1C
+0x8FBCE3 0x5F1D
+0x8FBCE4 0x5F21
+0x8FBCE5 0x5F22
+0x8FBCE6 0x5F23
+0x8FBCE7 0x5F24
+0x8FBCE8 0x5F28
+0x8FBCE9 0x5F2B
+0x8FBCEA 0x5F2C
+0x8FBCEB 0x5F2E
+0x8FBCEC 0x5F30
+0x8FBCED 0x5F34
+0x8FBCEE 0x5F36
+0x8FBCEF 0x5F3B
+0x8FBCF0 0x5F3D
+0x8FBCF1 0x5F3F
+0x8FBCF2 0x5F40
+0x8FBCF3 0x5F44
+0x8FBCF4 0x5F45
+0x8FBCF5 0x5F47
+0x8FBCF6 0x5F4D
+0x8FBCF7 0x5F50
+0x8FBCF8 0x5F54
+0x8FBCF9 0x5F58
+0x8FBCFA 0x5F5B
+0x8FBCFB 0x5F60
+0x8FBCFC 0x5F63
+0x8FBCFD 0x5F64
+0x8FBCFE 0x5F67
+0x8FBDA1 0x5F6F
+0x8FBDA2 0x5F72
+0x8FBDA3 0x5F74
+0x8FBDA4 0x5F75
+0x8FBDA5 0x5F78
+0x8FBDA6 0x5F7A
+0x8FBDA7 0x5F7D
+0x8FBDA8 0x5F7E
+0x8FBDA9 0x5F89
+0x8FBDAA 0x5F8D
+0x8FBDAB 0x5F8F
+0x8FBDAC 0x5F96
+0x8FBDAD 0x5F9C
+0x8FBDAE 0x5F9D
+0x8FBDAF 0x5FA2
+0x8FBDB0 0x5FA7
+0x8FBDB1 0x5FAB
+0x8FBDB2 0x5FA4
+0x8FBDB3 0x5FAC
+0x8FBDB4 0x5FAF
+0x8FBDB5 0x5FB0
+0x8FBDB6 0x5FB1
+0x8FBDB7 0x5FB8
+0x8FBDB8 0x5FC4
+0x8FBDB9 0x5FC7
+0x8FBDBA 0x5FC8
+0x8FBDBB 0x5FC9
+0x8FBDBC 0x5FCB
+0x8FBDBD 0x5FD0
+0x8FBDBE 0x5FD1
+0x8FBDBF 0x5FD2
+0x8FBDC0 0x5FD3
+0x8FBDC1 0x5FD4
+0x8FBDC2 0x5FDE
+0x8FBDC3 0x5FE1
+0x8FBDC4 0x5FE2
+0x8FBDC5 0x5FE8
+0x8FBDC6 0x5FE9
+0x8FBDC7 0x5FEA
+0x8FBDC8 0x5FEC
+0x8FBDC9 0x5FED
+0x8FBDCA 0x5FEE
+0x8FBDCB 0x5FEF
+0x8FBDCC 0x5FF2
+0x8FBDCD 0x5FF3
+0x8FBDCE 0x5FF6
+0x8FBDCF 0x5FFA
+0x8FBDD0 0x5FFC
+0x8FBDD1 0x6007
+0x8FBDD2 0x600A
+0x8FBDD3 0x600D
+0x8FBDD4 0x6013
+0x8FBDD5 0x6014
+0x8FBDD6 0x6017
+0x8FBDD7 0x6018
+0x8FBDD8 0x601A
+0x8FBDD9 0x601F
+0x8FBDDA 0x6024
+0x8FBDDB 0x602D
+0x8FBDDC 0x6033
+0x8FBDDD 0x6035
+0x8FBDDE 0x6040
+0x8FBDDF 0x6047
+0x8FBDE0 0x6048
+0x8FBDE1 0x6049
+0x8FBDE2 0x604C
+0x8FBDE3 0x6051
+0x8FBDE4 0x6054
+0x8FBDE5 0x6056
+0x8FBDE6 0x6057
+0x8FBDE7 0x605D
+0x8FBDE8 0x6061
+0x8FBDE9 0x6067
+0x8FBDEA 0x6071
+0x8FBDEB 0x607E
+0x8FBDEC 0x607F
+0x8FBDED 0x6082
+0x8FBDEE 0x6086
+0x8FBDEF 0x6088
+0x8FBDF0 0x608A
+0x8FBDF1 0x608E
+0x8FBDF2 0x6091
+0x8FBDF3 0x6093
+0x8FBDF4 0x6095
+0x8FBDF5 0x6098
+0x8FBDF6 0x609D
+0x8FBDF7 0x609E
+0x8FBDF8 0x60A2
+0x8FBDF9 0x60A4
+0x8FBDFA 0x60A5
+0x8FBDFB 0x60A8
+0x8FBDFC 0x60B0
+0x8FBDFD 0x60B1
+0x8FBDFE 0x60B7
+0x8FBEA1 0x60BB
+0x8FBEA2 0x60BE
+0x8FBEA3 0x60C2
+0x8FBEA4 0x60C4
+0x8FBEA5 0x60C8
+0x8FBEA6 0x60C9
+0x8FBEA7 0x60CA
+0x8FBEA8 0x60CB
+0x8FBEA9 0x60CE
+0x8FBEAA 0x60CF
+0x8FBEAB 0x60D4
+0x8FBEAC 0x60D5
+0x8FBEAD 0x60D9
+0x8FBEAE 0x60DB
+0x8FBEAF 0x60DD
+0x8FBEB0 0x60DE
+0x8FBEB1 0x60E2
+0x8FBEB2 0x60E5
+0x8FBEB3 0x60F2
+0x8FBEB4 0x60F5
+0x8FBEB5 0x60F8
+0x8FBEB6 0x60FC
+0x8FBEB7 0x60FD
+0x8FBEB8 0x6102
+0x8FBEB9 0x6107
+0x8FBEBA 0x610A
+0x8FBEBB 0x610C
+0x8FBEBC 0x6110
+0x8FBEBD 0x6111
+0x8FBEBE 0x6112
+0x8FBEBF 0x6113
+0x8FBEC0 0x6114
+0x8FBEC1 0x6116
+0x8FBEC2 0x6117
+0x8FBEC3 0x6119
+0x8FBEC4 0x611C
+0x8FBEC5 0x611E
+0x8FBEC6 0x6122
+0x8FBEC7 0x612A
+0x8FBEC8 0x612B
+0x8FBEC9 0x6130
+0x8FBECA 0x6131
+0x8FBECB 0x6135
+0x8FBECC 0x6136
+0x8FBECD 0x6137
+0x8FBECE 0x6139
+0x8FBECF 0x6141
+0x8FBED0 0x6145
+0x8FBED1 0x6146
+0x8FBED2 0x6149
+0x8FBED3 0x615E
+0x8FBED4 0x6160
+0x8FBED5 0x616C
+0x8FBED6 0x6172
+0x8FBED7 0x6178
+0x8FBED8 0x617B
+0x8FBED9 0x617C
+0x8FBEDA 0x617F
+0x8FBEDB 0x6180
+0x8FBEDC 0x6181
+0x8FBEDD 0x6183
+0x8FBEDE 0x6184
+0x8FBEDF 0x618B
+0x8FBEE0 0x618D
+0x8FBEE1 0x6192
+0x8FBEE2 0x6193
+0x8FBEE3 0x6197
+0x8FBEE4 0x6198
+0x8FBEE5 0x619C
+0x8FBEE6 0x619D
+0x8FBEE7 0x619F
+0x8FBEE8 0x61A0
+0x8FBEE9 0x61A5
+0x8FBEEA 0x61A8
+0x8FBEEB 0x61AA
+0x8FBEEC 0x61AD
+0x8FBEED 0x61B8
+0x8FBEEE 0x61B9
+0x8FBEEF 0x61BC
+0x8FBEF0 0x61C0
+0x8FBEF1 0x61C1
+0x8FBEF2 0x61C2
+0x8FBEF3 0x61CE
+0x8FBEF4 0x61CF
+0x8FBEF5 0x61D5
+0x8FBEF6 0x61DC
+0x8FBEF7 0x61DD
+0x8FBEF8 0x61DE
+0x8FBEF9 0x61DF
+0x8FBEFA 0x61E1
+0x8FBEFB 0x61E2
+0x8FBEFC 0x61E7
+0x8FBEFD 0x61E9
+0x8FBEFE 0x61E5
+0x8FBFA1 0x61EC
+0x8FBFA2 0x61ED
+0x8FBFA3 0x61EF
+0x8FBFA4 0x6201
+0x8FBFA5 0x6203
+0x8FBFA6 0x6204
+0x8FBFA7 0x6207
+0x8FBFA8 0x6213
+0x8FBFA9 0x6215
+0x8FBFAA 0x621C
+0x8FBFAB 0x6220
+0x8FBFAC 0x6222
+0x8FBFAD 0x6223
+0x8FBFAE 0x6227
+0x8FBFAF 0x6229
+0x8FBFB0 0x622B
+0x8FBFB1 0x6239
+0x8FBFB2 0x623D
+0x8FBFB3 0x6242
+0x8FBFB4 0x6243
+0x8FBFB5 0x6244
+0x8FBFB6 0x6246
+0x8FBFB7 0x624C
+0x8FBFB8 0x6250
+0x8FBFB9 0x6251
+0x8FBFBA 0x6252
+0x8FBFBB 0x6254
+0x8FBFBC 0x6256
+0x8FBFBD 0x625A
+0x8FBFBE 0x625C
+0x8FBFBF 0x6264
+0x8FBFC0 0x626D
+0x8FBFC1 0x626F
+0x8FBFC2 0x6273
+0x8FBFC3 0x627A
+0x8FBFC4 0x627D
+0x8FBFC5 0x628D
+0x8FBFC6 0x628E
+0x8FBFC7 0x628F
+0x8FBFC8 0x6290
+0x8FBFC9 0x62A6
+0x8FBFCA 0x62A8
+0x8FBFCB 0x62B3
+0x8FBFCC 0x62B6
+0x8FBFCD 0x62B7
+0x8FBFCE 0x62BA
+0x8FBFCF 0x62BE
+0x8FBFD0 0x62BF
+0x8FBFD1 0x62C4
+0x8FBFD2 0x62CE
+0x8FBFD3 0x62D5
+0x8FBFD4 0x62D6
+0x8FBFD5 0x62DA
+0x8FBFD6 0x62EA
+0x8FBFD7 0x62F2
+0x8FBFD8 0x62F4
+0x8FBFD9 0x62FC
+0x8FBFDA 0x62FD
+0x8FBFDB 0x6303
+0x8FBFDC 0x6304
+0x8FBFDD 0x630A
+0x8FBFDE 0x630B
+0x8FBFDF 0x630D
+0x8FBFE0 0x6310
+0x8FBFE1 0x6313
+0x8FBFE2 0x6316
+0x8FBFE3 0x6318
+0x8FBFE4 0x6329
+0x8FBFE5 0x632A
+0x8FBFE6 0x632D
+0x8FBFE7 0x6335
+0x8FBFE8 0x6336
+0x8FBFE9 0x6339
+0x8FBFEA 0x633C
+0x8FBFEB 0x6341
+0x8FBFEC 0x6342
+0x8FBFED 0x6343
+0x8FBFEE 0x6344
+0x8FBFEF 0x6346
+0x8FBFF0 0x634A
+0x8FBFF1 0x634B
+0x8FBFF2 0x634E
+0x8FBFF3 0x6352
+0x8FBFF4 0x6353
+0x8FBFF5 0x6354
+0x8FBFF6 0x6358
+0x8FBFF7 0x635B
+0x8FBFF8 0x6365
+0x8FBFF9 0x6366
+0x8FBFFA 0x636C
+0x8FBFFB 0x636D
+0x8FBFFC 0x6371
+0x8FBFFD 0x6374
+0x8FBFFE 0x6375
+0x8FC0A1 0x6378
+0x8FC0A2 0x637C
+0x8FC0A3 0x637D
+0x8FC0A4 0x637F
+0x8FC0A5 0x6382
+0x8FC0A6 0x6384
+0x8FC0A7 0x6387
+0x8FC0A8 0x638A
+0x8FC0A9 0x6390
+0x8FC0AA 0x6394
+0x8FC0AB 0x6395
+0x8FC0AC 0x6399
+0x8FC0AD 0x639A
+0x8FC0AE 0x639E
+0x8FC0AF 0x63A4
+0x8FC0B0 0x63A6
+0x8FC0B1 0x63AD
+0x8FC0B2 0x63AE
+0x8FC0B3 0x63AF
+0x8FC0B4 0x63BD
+0x8FC0B5 0x63C1
+0x8FC0B6 0x63C5
+0x8FC0B7 0x63C8
+0x8FC0B8 0x63CE
+0x8FC0B9 0x63D1
+0x8FC0BA 0x63D3
+0x8FC0BB 0x63D4
+0x8FC0BC 0x63D5
+0x8FC0BD 0x63DC
+0x8FC0BE 0x63E0
+0x8FC0BF 0x63E5
+0x8FC0C0 0x63EA
+0x8FC0C1 0x63EC
+0x8FC0C2 0x63F2
+0x8FC0C3 0x63F3
+0x8FC0C4 0x63F5
+0x8FC0C5 0x63F8
+0x8FC0C6 0x63F9
+0x8FC0C7 0x6409
+0x8FC0C8 0x640A
+0x8FC0C9 0x6410
+0x8FC0CA 0x6412
+0x8FC0CB 0x6414
+0x8FC0CC 0x6418
+0x8FC0CD 0x641E
+0x8FC0CE 0x6420
+0x8FC0CF 0x6422
+0x8FC0D0 0x6424
+0x8FC0D1 0x6425
+0x8FC0D2 0x6429
+0x8FC0D3 0x642A
+0x8FC0D4 0x642F
+0x8FC0D5 0x6430
+0x8FC0D6 0x6435
+0x8FC0D7 0x643D
+0x8FC0D8 0x643F
+0x8FC0D9 0x644B
+0x8FC0DA 0x644F
+0x8FC0DB 0x6451
+0x8FC0DC 0x6452
+0x8FC0DD 0x6453
+0x8FC0DE 0x6454
+0x8FC0DF 0x645A
+0x8FC0E0 0x645B
+0x8FC0E1 0x645C
+0x8FC0E2 0x645D
+0x8FC0E3 0x645F
+0x8FC0E4 0x6460
+0x8FC0E5 0x6461
+0x8FC0E6 0x6463
+0x8FC0E7 0x646D
+0x8FC0E8 0x6473
+0x8FC0E9 0x6474
+0x8FC0EA 0x647B
+0x8FC0EB 0x647D
+0x8FC0EC 0x6485
+0x8FC0ED 0x6487
+0x8FC0EE 0x648F
+0x8FC0EF 0x6490
+0x8FC0F0 0x6491
+0x8FC0F1 0x6498
+0x8FC0F2 0x6499
+0x8FC0F3 0x649B
+0x8FC0F4 0x649D
+0x8FC0F5 0x649F
+0x8FC0F6 0x64A1
+0x8FC0F7 0x64A3
+0x8FC0F8 0x64A6
+0x8FC0F9 0x64A8
+0x8FC0FA 0x64AC
+0x8FC0FB 0x64B3
+0x8FC0FC 0x64BD
+0x8FC0FD 0x64BE
+0x8FC0FE 0x64BF
+0x8FC1A1 0x64C4
+0x8FC1A2 0x64C9
+0x8FC1A3 0x64CA
+0x8FC1A4 0x64CB
+0x8FC1A5 0x64CC
+0x8FC1A6 0x64CE
+0x8FC1A7 0x64D0
+0x8FC1A8 0x64D1
+0x8FC1A9 0x64D5
+0x8FC1AA 0x64D7
+0x8FC1AB 0x64E4
+0x8FC1AC 0x64E5
+0x8FC1AD 0x64E9
+0x8FC1AE 0x64EA
+0x8FC1AF 0x64ED
+0x8FC1B0 0x64F0
+0x8FC1B1 0x64F5
+0x8FC1B2 0x64F7
+0x8FC1B3 0x64FB
+0x8FC1B4 0x64FF
+0x8FC1B5 0x6501
+0x8FC1B6 0x6504
+0x8FC1B7 0x6508
+0x8FC1B8 0x6509
+0x8FC1B9 0x650A
+0x8FC1BA 0x650F
+0x8FC1BB 0x6513
+0x8FC1BC 0x6514
+0x8FC1BD 0x6516
+0x8FC1BE 0x6519
+0x8FC1BF 0x651B
+0x8FC1C0 0x651E
+0x8FC1C1 0x651F
+0x8FC1C2 0x6522
+0x8FC1C3 0x6526
+0x8FC1C4 0x6529
+0x8FC1C5 0x652E
+0x8FC1C6 0x6531
+0x8FC1C7 0x653A
+0x8FC1C8 0x653C
+0x8FC1C9 0x653D
+0x8FC1CA 0x6543
+0x8FC1CB 0x6547
+0x8FC1CC 0x6549
+0x8FC1CD 0x6550
+0x8FC1CE 0x6552
+0x8FC1CF 0x6554
+0x8FC1D0 0x655F
+0x8FC1D1 0x6560
+0x8FC1D2 0x6567
+0x8FC1D3 0x656B
+0x8FC1D4 0x657A
+0x8FC1D5 0x657D
+0x8FC1D6 0x6581
+0x8FC1D7 0x6585
+0x8FC1D8 0x658A
+0x8FC1D9 0x6592
+0x8FC1DA 0x6595
+0x8FC1DB 0x6598
+0x8FC1DC 0x659D
+0x8FC1DD 0x65A0
+0x8FC1DE 0x65A3
+0x8FC1DF 0x65A6
+0x8FC1E0 0x65AE
+0x8FC1E1 0x65B2
+0x8FC1E2 0x65B3
+0x8FC1E3 0x65B4
+0x8FC1E4 0x65BF
+0x8FC1E5 0x65C2
+0x8FC1E6 0x65C8
+0x8FC1E7 0x65C9
+0x8FC1E8 0x65CE
+0x8FC1E9 0x65D0
+0x8FC1EA 0x65D4
+0x8FC1EB 0x65D6
+0x8FC1EC 0x65D8
+0x8FC1ED 0x65DF
+0x8FC1EE 0x65F0
+0x8FC1EF 0x65F2
+0x8FC1F0 0x65F4
+0x8FC1F1 0x65F5
+0x8FC1F2 0x65F9
+0x8FC1F3 0x65FE
+0x8FC1F4 0x65FF
+0x8FC1F5 0x6600
+0x8FC1F6 0x6604
+0x8FC1F7 0x6608
+0x8FC1F8 0x6609
+0x8FC1F9 0x660D
+0x8FC1FA 0x6611
+0x8FC1FB 0x6612
+0x8FC1FC 0x6615
+0x8FC1FD 0x6616
+0x8FC1FE 0x661D
+0x8FC2A1 0x661E
+0x8FC2A2 0x6621
+0x8FC2A3 0x6622
+0x8FC2A4 0x6623
+0x8FC2A5 0x6624
+0x8FC2A6 0x6626
+0x8FC2A7 0x6629
+0x8FC2A8 0x662A
+0x8FC2A9 0x662B
+0x8FC2AA 0x662C
+0x8FC2AB 0x662E
+0x8FC2AC 0x6630
+0x8FC2AD 0x6631
+0x8FC2AE 0x6633
+0x8FC2AF 0x6639
+0x8FC2B0 0x6637
+0x8FC2B1 0x6640
+0x8FC2B2 0x6645
+0x8FC2B3 0x6646
+0x8FC2B4 0x664A
+0x8FC2B5 0x664C
+0x8FC2B6 0x6651
+0x8FC2B7 0x664E
+0x8FC2B8 0x6657
+0x8FC2B9 0x6658
+0x8FC2BA 0x6659
+0x8FC2BB 0x665B
+0x8FC2BC 0x665C
+0x8FC2BD 0x6660
+0x8FC2BE 0x6661
+0x8FC2BF 0x66FB
+0x8FC2C0 0x666A
+0x8FC2C1 0x666B
+0x8FC2C2 0x666C
+0x8FC2C3 0x667E
+0x8FC2C4 0x6673
+0x8FC2C5 0x6675
+0x8FC2C6 0x667F
+0x8FC2C7 0x6677
+0x8FC2C8 0x6678
+0x8FC2C9 0x6679
+0x8FC2CA 0x667B
+0x8FC2CB 0x6680
+0x8FC2CC 0x667C
+0x8FC2CD 0x668B
+0x8FC2CE 0x668C
+0x8FC2CF 0x668D
+0x8FC2D0 0x6690
+0x8FC2D1 0x6692
+0x8FC2D2 0x6699
+0x8FC2D3 0x669A
+0x8FC2D4 0x669B
+0x8FC2D5 0x669C
+0x8FC2D6 0x669F
+0x8FC2D7 0x66A0
+0x8FC2D8 0x66A4
+0x8FC2D9 0x66AD
+0x8FC2DA 0x66B1
+0x8FC2DB 0x66B2
+0x8FC2DC 0x66B5
+0x8FC2DD 0x66BB
+0x8FC2DE 0x66BF
+0x8FC2DF 0x66C0
+0x8FC2E0 0x66C2
+0x8FC2E1 0x66C3
+0x8FC2E2 0x66C8
+0x8FC2E3 0x66CC
+0x8FC2E4 0x66CE
+0x8FC2E5 0x66CF
+0x8FC2E6 0x66D4
+0x8FC2E7 0x66DB
+0x8FC2E8 0x66DF
+0x8FC2E9 0x66E8
+0x8FC2EA 0x66EB
+0x8FC2EB 0x66EC
+0x8FC2EC 0x66EE
+0x8FC2ED 0x66FA
+0x8FC2EE 0x6705
+0x8FC2EF 0x6707
+0x8FC2F0 0x670E
+0x8FC2F1 0x6713
+0x8FC2F2 0x6719
+0x8FC2F3 0x671C
+0x8FC2F4 0x6720
+0x8FC2F5 0x6722
+0x8FC2F6 0x6733
+0x8FC2F7 0x673E
+0x8FC2F8 0x6745
+0x8FC2F9 0x6747
+0x8FC2FA 0x6748
+0x8FC2FB 0x674C
+0x8FC2FC 0x6754
+0x8FC2FD 0x6755
+0x8FC2FE 0x675D
+0x8FC3A1 0x6766
+0x8FC3A2 0x676C
+0x8FC3A3 0x676E
+0x8FC3A4 0x6774
+0x8FC3A5 0x6776
+0x8FC3A6 0x677B
+0x8FC3A7 0x6781
+0x8FC3A8 0x6784
+0x8FC3A9 0x678E
+0x8FC3AA 0x678F
+0x8FC3AB 0x6791
+0x8FC3AC 0x6793
+0x8FC3AD 0x6796
+0x8FC3AE 0x6798
+0x8FC3AF 0x6799
+0x8FC3B0 0x679B
+0x8FC3B1 0x67B0
+0x8FC3B2 0x67B1
+0x8FC3B3 0x67B2
+0x8FC3B4 0x67B5
+0x8FC3B5 0x67BB
+0x8FC3B6 0x67BC
+0x8FC3B7 0x67BD
+0x8FC3B8 0x67F9
+0x8FC3B9 0x67C0
+0x8FC3BA 0x67C2
+0x8FC3BB 0x67C3
+0x8FC3BC 0x67C5
+0x8FC3BD 0x67C8
+0x8FC3BE 0x67C9
+0x8FC3BF 0x67D2
+0x8FC3C0 0x67D7
+0x8FC3C1 0x67D9
+0x8FC3C2 0x67DC
+0x8FC3C3 0x67E1
+0x8FC3C4 0x67E6
+0x8FC3C5 0x67F0
+0x8FC3C6 0x67F2
+0x8FC3C7 0x67F6
+0x8FC3C8 0x67F7
+0x8FC3C9 0x6852
+0x8FC3CA 0x6814
+0x8FC3CB 0x6819
+0x8FC3CC 0x681D
+0x8FC3CD 0x681F
+0x8FC3CE 0x6828
+0x8FC3CF 0x6827
+0x8FC3D0 0x682C
+0x8FC3D1 0x682D
+0x8FC3D2 0x682F
+0x8FC3D3 0x6830
+0x8FC3D4 0x6831
+0x8FC3D5 0x6833
+0x8FC3D6 0x683B
+0x8FC3D7 0x683F
+0x8FC3D8 0x6844
+0x8FC3D9 0x6845
+0x8FC3DA 0x684A
+0x8FC3DB 0x684C
+0x8FC3DC 0x6855
+0x8FC3DD 0x6857
+0x8FC3DE 0x6858
+0x8FC3DF 0x685B
+0x8FC3E0 0x686B
+0x8FC3E1 0x686E
+0x8FC3E2 0x686F
+0x8FC3E3 0x6870
+0x8FC3E4 0x6871
+0x8FC3E5 0x6872
+0x8FC3E6 0x6875
+0x8FC3E7 0x6879
+0x8FC3E8 0x687A
+0x8FC3E9 0x687B
+0x8FC3EA 0x687C
+0x8FC3EB 0x6882
+0x8FC3EC 0x6884
+0x8FC3ED 0x6886
+0x8FC3EE 0x6888
+0x8FC3EF 0x6896
+0x8FC3F0 0x6898
+0x8FC3F1 0x689A
+0x8FC3F2 0x689C
+0x8FC3F3 0x68A1
+0x8FC3F4 0x68A3
+0x8FC3F5 0x68A5
+0x8FC3F6 0x68A9
+0x8FC3F7 0x68AA
+0x8FC3F8 0x68AE
+0x8FC3F9 0x68B2
+0x8FC3FA 0x68BB
+0x8FC3FB 0x68C5
+0x8FC3FC 0x68C8
+0x8FC3FD 0x68CC
+0x8FC3FE 0x68CF
+0x8FC4A1 0x68D0
+0x8FC4A2 0x68D1
+0x8FC4A3 0x68D3
+0x8FC4A4 0x68D6
+0x8FC4A5 0x68D9
+0x8FC4A6 0x68DC
+0x8FC4A7 0x68DD
+0x8FC4A8 0x68E5
+0x8FC4A9 0x68E8
+0x8FC4AA 0x68EA
+0x8FC4AB 0x68EB
+0x8FC4AC 0x68EC
+0x8FC4AD 0x68ED
+0x8FC4AE 0x68F0
+0x8FC4AF 0x68F1
+0x8FC4B0 0x68F5
+0x8FC4B1 0x68F6
+0x8FC4B2 0x68FB
+0x8FC4B3 0x68FC
+0x8FC4B4 0x68FD
+0x8FC4B5 0x6906
+0x8FC4B6 0x6909
+0x8FC4B7 0x690A
+0x8FC4B8 0x6910
+0x8FC4B9 0x6911
+0x8FC4BA 0x6913
+0x8FC4BB 0x6916
+0x8FC4BC 0x6917
+0x8FC4BD 0x6931
+0x8FC4BE 0x6933
+0x8FC4BF 0x6935
+0x8FC4C0 0x6938
+0x8FC4C1 0x693B
+0x8FC4C2 0x6942
+0x8FC4C3 0x6945
+0x8FC4C4 0x6949
+0x8FC4C5 0x694E
+0x8FC4C6 0x6957
+0x8FC4C7 0x695B
+0x8FC4C8 0x6963
+0x8FC4C9 0x6964
+0x8FC4CA 0x6965
+0x8FC4CB 0x6966
+0x8FC4CC 0x6968
+0x8FC4CD 0x6969
+0x8FC4CE 0x696C
+0x8FC4CF 0x6970
+0x8FC4D0 0x6971
+0x8FC4D1 0x6972
+0x8FC4D2 0x697A
+0x8FC4D3 0x697B
+0x8FC4D4 0x697F
+0x8FC4D5 0x6980
+0x8FC4D6 0x698D
+0x8FC4D7 0x6992
+0x8FC4D8 0x6996
+0x8FC4D9 0x6998
+0x8FC4DA 0x69A1
+0x8FC4DB 0x69A5
+0x8FC4DC 0x69A6
+0x8FC4DD 0x69A8
+0x8FC4DE 0x69AB
+0x8FC4DF 0x69AD
+0x8FC4E0 0x69AF
+0x8FC4E1 0x69B7
+0x8FC4E2 0x69B8
+0x8FC4E3 0x69BA
+0x8FC4E4 0x69BC
+0x8FC4E5 0x69C5
+0x8FC4E6 0x69C8
+0x8FC4E7 0x69D1
+0x8FC4E8 0x69D6
+0x8FC4E9 0x69D7
+0x8FC4EA 0x69E2
+0x8FC4EB 0x69E5
+0x8FC4EC 0x69EE
+0x8FC4ED 0x69EF
+0x8FC4EE 0x69F1
+0x8FC4EF 0x69F3
+0x8FC4F0 0x69F5
+0x8FC4F1 0x69FE
+0x8FC4F2 0x6A00
+0x8FC4F3 0x6A01
+0x8FC4F4 0x6A03
+0x8FC4F5 0x6A0F
+0x8FC4F6 0x6A11
+0x8FC4F7 0x6A15
+0x8FC4F8 0x6A1A
+0x8FC4F9 0x6A1D
+0x8FC4FA 0x6A20
+0x8FC4FB 0x6A24
+0x8FC4FC 0x6A28
+0x8FC4FD 0x6A30
+0x8FC4FE 0x6A32
+0x8FC5A1 0x6A34
+0x8FC5A2 0x6A37
+0x8FC5A3 0x6A3B
+0x8FC5A4 0x6A3E
+0x8FC5A5 0x6A3F
+0x8FC5A6 0x6A45
+0x8FC5A7 0x6A46
+0x8FC5A8 0x6A49
+0x8FC5A9 0x6A4A
+0x8FC5AA 0x6A4E
+0x8FC5AB 0x6A50
+0x8FC5AC 0x6A51
+0x8FC5AD 0x6A52
+0x8FC5AE 0x6A55
+0x8FC5AF 0x6A56
+0x8FC5B0 0x6A5B
+0x8FC5B1 0x6A64
+0x8FC5B2 0x6A67
+0x8FC5B3 0x6A6A
+0x8FC5B4 0x6A71
+0x8FC5B5 0x6A73
+0x8FC5B6 0x6A7E
+0x8FC5B7 0x6A81
+0x8FC5B8 0x6A83
+0x8FC5B9 0x6A86
+0x8FC5BA 0x6A87
+0x8FC5BB 0x6A89
+0x8FC5BC 0x6A8B
+0x8FC5BD 0x6A91
+0x8FC5BE 0x6A9B
+0x8FC5BF 0x6A9D
+0x8FC5C0 0x6A9E
+0x8FC5C1 0x6A9F
+0x8FC5C2 0x6AA5
+0x8FC5C3 0x6AAB
+0x8FC5C4 0x6AAF
+0x8FC5C5 0x6AB0
+0x8FC5C6 0x6AB1
+0x8FC5C7 0x6AB4
+0x8FC5C8 0x6ABD
+0x8FC5C9 0x6ABE
+0x8FC5CA 0x6ABF
+0x8FC5CB 0x6AC6
+0x8FC5CC 0x6AC9
+0x8FC5CD 0x6AC8
+0x8FC5CE 0x6ACC
+0x8FC5CF 0x6AD0
+0x8FC5D0 0x6AD4
+0x8FC5D1 0x6AD5
+0x8FC5D2 0x6AD6
+0x8FC5D3 0x6ADC
+0x8FC5D4 0x6ADD
+0x8FC5D5 0x6AE4
+0x8FC5D6 0x6AE7
+0x8FC5D7 0x6AEC
+0x8FC5D8 0x6AF0
+0x8FC5D9 0x6AF1
+0x8FC5DA 0x6AF2
+0x8FC5DB 0x6AFC
+0x8FC5DC 0x6AFD
+0x8FC5DD 0x6B02
+0x8FC5DE 0x6B03
+0x8FC5DF 0x6B06
+0x8FC5E0 0x6B07
+0x8FC5E1 0x6B09
+0x8FC5E2 0x6B0F
+0x8FC5E3 0x6B10
+0x8FC5E4 0x6B11
+0x8FC5E5 0x6B17
+0x8FC5E6 0x6B1B
+0x8FC5E7 0x6B1E
+0x8FC5E8 0x6B24
+0x8FC5E9 0x6B28
+0x8FC5EA 0x6B2B
+0x8FC5EB 0x6B2C
+0x8FC5EC 0x6B2F
+0x8FC5ED 0x6B35
+0x8FC5EE 0x6B36
+0x8FC5EF 0x6B3B
+0x8FC5F0 0x6B3F
+0x8FC5F1 0x6B46
+0x8FC5F2 0x6B4A
+0x8FC5F3 0x6B4D
+0x8FC5F4 0x6B52
+0x8FC5F5 0x6B56
+0x8FC5F6 0x6B58
+0x8FC5F7 0x6B5D
+0x8FC5F8 0x6B60
+0x8FC5F9 0x6B67
+0x8FC5FA 0x6B6B
+0x8FC5FB 0x6B6E
+0x8FC5FC 0x6B70
+0x8FC5FD 0x6B75
+0x8FC5FE 0x6B7D
+0x8FC6A1 0x6B7E
+0x8FC6A2 0x6B82
+0x8FC6A3 0x6B85
+0x8FC6A4 0x6B97
+0x8FC6A5 0x6B9B
+0x8FC6A6 0x6B9F
+0x8FC6A7 0x6BA0
+0x8FC6A8 0x6BA2
+0x8FC6A9 0x6BA3
+0x8FC6AA 0x6BA8
+0x8FC6AB 0x6BA9
+0x8FC6AC 0x6BAC
+0x8FC6AD 0x6BAD
+0x8FC6AE 0x6BAE
+0x8FC6AF 0x6BB0
+0x8FC6B0 0x6BB8
+0x8FC6B1 0x6BB9
+0x8FC6B2 0x6BBD
+0x8FC6B3 0x6BBE
+0x8FC6B4 0x6BC3
+0x8FC6B5 0x6BC4
+0x8FC6B6 0x6BC9
+0x8FC6B7 0x6BCC
+0x8FC6B8 0x6BD6
+0x8FC6B9 0x6BDA
+0x8FC6BA 0x6BE1
+0x8FC6BB 0x6BE3
+0x8FC6BC 0x6BE6
+0x8FC6BD 0x6BE7
+0x8FC6BE 0x6BEE
+0x8FC6BF 0x6BF1
+0x8FC6C0 0x6BF7
+0x8FC6C1 0x6BF9
+0x8FC6C2 0x6BFF
+0x8FC6C3 0x6C02
+0x8FC6C4 0x6C04
+0x8FC6C5 0x6C05
+0x8FC6C6 0x6C09
+0x8FC6C7 0x6C0D
+0x8FC6C8 0x6C0E
+0x8FC6C9 0x6C10
+0x8FC6CA 0x6C12
+0x8FC6CB 0x6C19
+0x8FC6CC 0x6C1F
+0x8FC6CD 0x6C26
+0x8FC6CE 0x6C27
+0x8FC6CF 0x6C28
+0x8FC6D0 0x6C2C
+0x8FC6D1 0x6C2E
+0x8FC6D2 0x6C33
+0x8FC6D3 0x6C35
+0x8FC6D4 0x6C36
+0x8FC6D5 0x6C3A
+0x8FC6D6 0x6C3B
+0x8FC6D7 0x6C3F
+0x8FC6D8 0x6C4A
+0x8FC6D9 0x6C4B
+0x8FC6DA 0x6C4D
+0x8FC6DB 0x6C4F
+0x8FC6DC 0x6C52
+0x8FC6DD 0x6C54
+0x8FC6DE 0x6C59
+0x8FC6DF 0x6C5B
+0x8FC6E0 0x6C5C
+0x8FC6E1 0x6C6B
+0x8FC6E2 0x6C6D
+0x8FC6E3 0x6C6F
+0x8FC6E4 0x6C74
+0x8FC6E5 0x6C76
+0x8FC6E6 0x6C78
+0x8FC6E7 0x6C79
+0x8FC6E8 0x6C7B
+0x8FC6E9 0x6C85
+0x8FC6EA 0x6C86
+0x8FC6EB 0x6C87
+0x8FC6EC 0x6C89
+0x8FC6ED 0x6C94
+0x8FC6EE 0x6C95
+0x8FC6EF 0x6C97
+0x8FC6F0 0x6C98
+0x8FC6F1 0x6C9C
+0x8FC6F2 0x6C9F
+0x8FC6F3 0x6CB0
+0x8FC6F4 0x6CB2
+0x8FC6F5 0x6CB4
+0x8FC6F6 0x6CC2
+0x8FC6F7 0x6CC6
+0x8FC6F8 0x6CCD
+0x8FC6F9 0x6CCF
+0x8FC6FA 0x6CD0
+0x8FC6FB 0x6CD1
+0x8FC6FC 0x6CD2
+0x8FC6FD 0x6CD4
+0x8FC6FE 0x6CD6
+0x8FC7A1 0x6CDA
+0x8FC7A2 0x6CDC
+0x8FC7A3 0x6CE0
+0x8FC7A4 0x6CE7
+0x8FC7A5 0x6CE9
+0x8FC7A6 0x6CEB
+0x8FC7A7 0x6CEC
+0x8FC7A8 0x6CEE
+0x8FC7A9 0x6CF2
+0x8FC7AA 0x6CF4
+0x8FC7AB 0x6D04
+0x8FC7AC 0x6D07
+0x8FC7AD 0x6D0A
+0x8FC7AE 0x6D0E
+0x8FC7AF 0x6D0F
+0x8FC7B0 0x6D11
+0x8FC7B1 0x6D13
+0x8FC7B2 0x6D1A
+0x8FC7B3 0x6D26
+0x8FC7B4 0x6D27
+0x8FC7B5 0x6D28
+0x8FC7B6 0x6C67
+0x8FC7B7 0x6D2E
+0x8FC7B8 0x6D2F
+0x8FC7B9 0x6D31
+0x8FC7BA 0x6D39
+0x8FC7BB 0x6D3C
+0x8FC7BC 0x6D3F
+0x8FC7BD 0x6D57
+0x8FC7BE 0x6D5E
+0x8FC7BF 0x6D5F
+0x8FC7C0 0x6D61
+0x8FC7C1 0x6D65
+0x8FC7C2 0x6D67
+0x8FC7C3 0x6D6F
+0x8FC7C4 0x6D70
+0x8FC7C5 0x6D7C
+0x8FC7C6 0x6D82
+0x8FC7C7 0x6D87
+0x8FC7C8 0x6D91
+0x8FC7C9 0x6D92
+0x8FC7CA 0x6D94
+0x8FC7CB 0x6D96
+0x8FC7CC 0x6D97
+0x8FC7CD 0x6D98
+0x8FC7CE 0x6DAA
+0x8FC7CF 0x6DAC
+0x8FC7D0 0x6DB4
+0x8FC7D1 0x6DB7
+0x8FC7D2 0x6DB9
+0x8FC7D3 0x6DBD
+0x8FC7D4 0x6DBF
+0x8FC7D5 0x6DC4
+0x8FC7D6 0x6DC8
+0x8FC7D7 0x6DCA
+0x8FC7D8 0x6DCE
+0x8FC7D9 0x6DCF
+0x8FC7DA 0x6DD6
+0x8FC7DB 0x6DDB
+0x8FC7DC 0x6DDD
+0x8FC7DD 0x6DDF
+0x8FC7DE 0x6DE0
+0x8FC7DF 0x6DE2
+0x8FC7E0 0x6DE5
+0x8FC7E1 0x6DE9
+0x8FC7E2 0x6DEF
+0x8FC7E3 0x6DF0
+0x8FC7E4 0x6DF4
+0x8FC7E5 0x6DF6
+0x8FC7E6 0x6DFC
+0x8FC7E7 0x6E00
+0x8FC7E8 0x6E04
+0x8FC7E9 0x6E1E
+0x8FC7EA 0x6E22
+0x8FC7EB 0x6E27
+0x8FC7EC 0x6E32
+0x8FC7ED 0x6E36
+0x8FC7EE 0x6E39
+0x8FC7EF 0x6E3B
+0x8FC7F0 0x6E3C
+0x8FC7F1 0x6E44
+0x8FC7F2 0x6E45
+0x8FC7F3 0x6E48
+0x8FC7F4 0x6E49
+0x8FC7F5 0x6E4B
+0x8FC7F6 0x6E4F
+0x8FC7F7 0x6E51
+0x8FC7F8 0x6E52
+0x8FC7F9 0x6E53
+0x8FC7FA 0x6E54
+0x8FC7FB 0x6E57
+0x8FC7FC 0x6E5C
+0x8FC7FD 0x6E5D
+0x8FC7FE 0x6E5E
+0x8FC8A1 0x6E62
+0x8FC8A2 0x6E63
+0x8FC8A3 0x6E68
+0x8FC8A4 0x6E73
+0x8FC8A5 0x6E7B
+0x8FC8A6 0x6E7D
+0x8FC8A7 0x6E8D
+0x8FC8A8 0x6E93
+0x8FC8A9 0x6E99
+0x8FC8AA 0x6EA0
+0x8FC8AB 0x6EA7
+0x8FC8AC 0x6EAD
+0x8FC8AD 0x6EAE
+0x8FC8AE 0x6EB1
+0x8FC8AF 0x6EB3
+0x8FC8B0 0x6EBB
+0x8FC8B1 0x6EBF
+0x8FC8B2 0x6EC0
+0x8FC8B3 0x6EC1
+0x8FC8B4 0x6EC3
+0x8FC8B5 0x6EC7
+0x8FC8B6 0x6EC8
+0x8FC8B7 0x6ECA
+0x8FC8B8 0x6ECD
+0x8FC8B9 0x6ECE
+0x8FC8BA 0x6ECF
+0x8FC8BB 0x6EEB
+0x8FC8BC 0x6EED
+0x8FC8BD 0x6EEE
+0x8FC8BE 0x6EF9
+0x8FC8BF 0x6EFB
+0x8FC8C0 0x6EFD
+0x8FC8C1 0x6F04
+0x8FC8C2 0x6F08
+0x8FC8C3 0x6F0A
+0x8FC8C4 0x6F0C
+0x8FC8C5 0x6F0D
+0x8FC8C6 0x6F16
+0x8FC8C7 0x6F18
+0x8FC8C8 0x6F1A
+0x8FC8C9 0x6F1B
+0x8FC8CA 0x6F26
+0x8FC8CB 0x6F29
+0x8FC8CC 0x6F2A
+0x8FC8CD 0x6F2F
+0x8FC8CE 0x6F30
+0x8FC8CF 0x6F33
+0x8FC8D0 0x6F36
+0x8FC8D1 0x6F3B
+0x8FC8D2 0x6F3C
+0x8FC8D3 0x6F2D
+0x8FC8D4 0x6F4F
+0x8FC8D5 0x6F51
+0x8FC8D6 0x6F52
+0x8FC8D7 0x6F53
+0x8FC8D8 0x6F57
+0x8FC8D9 0x6F59
+0x8FC8DA 0x6F5A
+0x8FC8DB 0x6F5D
+0x8FC8DC 0x6F5E
+0x8FC8DD 0x6F61
+0x8FC8DE 0x6F62
+0x8FC8DF 0x6F68
+0x8FC8E0 0x6F6C
+0x8FC8E1 0x6F7D
+0x8FC8E2 0x6F7E
+0x8FC8E3 0x6F83
+0x8FC8E4 0x6F87
+0x8FC8E5 0x6F88
+0x8FC8E6 0x6F8B
+0x8FC8E7 0x6F8C
+0x8FC8E8 0x6F8D
+0x8FC8E9 0x6F90
+0x8FC8EA 0x6F92
+0x8FC8EB 0x6F93
+0x8FC8EC 0x6F94
+0x8FC8ED 0x6F96
+0x8FC8EE 0x6F9A
+0x8FC8EF 0x6F9F
+0x8FC8F0 0x6FA0
+0x8FC8F1 0x6FA5
+0x8FC8F2 0x6FA6
+0x8FC8F3 0x6FA7
+0x8FC8F4 0x6FA8
+0x8FC8F5 0x6FAE
+0x8FC8F6 0x6FAF
+0x8FC8F7 0x6FB0
+0x8FC8F8 0x6FB5
+0x8FC8F9 0x6FB6
+0x8FC8FA 0x6FBC
+0x8FC8FB 0x6FC5
+0x8FC8FC 0x6FC7
+0x8FC8FD 0x6FC8
+0x8FC8FE 0x6FCA
+0x8FC9A1 0x6FDA
+0x8FC9A2 0x6FDE
+0x8FC9A3 0x6FE8
+0x8FC9A4 0x6FE9
+0x8FC9A5 0x6FF0
+0x8FC9A6 0x6FF5
+0x8FC9A7 0x6FF9
+0x8FC9A8 0x6FFC
+0x8FC9A9 0x6FFD
+0x8FC9AA 0x7000
+0x8FC9AB 0x7005
+0x8FC9AC 0x7006
+0x8FC9AD 0x7007
+0x8FC9AE 0x700D
+0x8FC9AF 0x7017
+0x8FC9B0 0x7020
+0x8FC9B1 0x7023
+0x8FC9B2 0x702F
+0x8FC9B3 0x7034
+0x8FC9B4 0x7037
+0x8FC9B5 0x7039
+0x8FC9B6 0x703C
+0x8FC9B7 0x7043
+0x8FC9B8 0x7044
+0x8FC9B9 0x7048
+0x8FC9BA 0x7049
+0x8FC9BB 0x704A
+0x8FC9BC 0x704B
+0x8FC9BD 0x7054
+0x8FC9BE 0x7055
+0x8FC9BF 0x705D
+0x8FC9C0 0x705E
+0x8FC9C1 0x704E
+0x8FC9C2 0x7064
+0x8FC9C3 0x7065
+0x8FC9C4 0x706C
+0x8FC9C5 0x706E
+0x8FC9C6 0x7075
+0x8FC9C7 0x7076
+0x8FC9C8 0x707E
+0x8FC9C9 0x7081
+0x8FC9CA 0x7085
+0x8FC9CB 0x7086
+0x8FC9CC 0x7094
+0x8FC9CD 0x7095
+0x8FC9CE 0x7096
+0x8FC9CF 0x7097
+0x8FC9D0 0x7098
+0x8FC9D1 0x709B
+0x8FC9D2 0x70A4
+0x8FC9D3 0x70AB
+0x8FC9D4 0x70B0
+0x8FC9D5 0x70B1
+0x8FC9D6 0x70B4
+0x8FC9D7 0x70B7
+0x8FC9D8 0x70CA
+0x8FC9D9 0x70D1
+0x8FC9DA 0x70D3
+0x8FC9DB 0x70D4
+0x8FC9DC 0x70D5
+0x8FC9DD 0x70D6
+0x8FC9DE 0x70D8
+0x8FC9DF 0x70DC
+0x8FC9E0 0x70E4
+0x8FC9E1 0x70FA
+0x8FC9E2 0x7103
+0x8FC9E3 0x7104
+0x8FC9E4 0x7105
+0x8FC9E5 0x7106
+0x8FC9E6 0x7107
+0x8FC9E7 0x710B
+0x8FC9E8 0x710C
+0x8FC9E9 0x710F
+0x8FC9EA 0x711E
+0x8FC9EB 0x7120
+0x8FC9EC 0x712B
+0x8FC9ED 0x712D
+0x8FC9EE 0x712F
+0x8FC9EF 0x7130
+0x8FC9F0 0x7131
+0x8FC9F1 0x7138
+0x8FC9F2 0x7141
+0x8FC9F3 0x7145
+0x8FC9F4 0x7146
+0x8FC9F5 0x7147
+0x8FC9F6 0x714A
+0x8FC9F7 0x714B
+0x8FC9F8 0x7150
+0x8FC9F9 0x7152
+0x8FC9FA 0x7157
+0x8FC9FB 0x715A
+0x8FC9FC 0x715C
+0x8FC9FD 0x715E
+0x8FC9FE 0x7160
+0x8FCAA1 0x7168
+0x8FCAA2 0x7179
+0x8FCAA3 0x7180
+0x8FCAA4 0x7185
+0x8FCAA5 0x7187
+0x8FCAA6 0x718C
+0x8FCAA7 0x7192
+0x8FCAA8 0x719A
+0x8FCAA9 0x719B
+0x8FCAAA 0x71A0
+0x8FCAAB 0x71A2
+0x8FCAAC 0x71AF
+0x8FCAAD 0x71B0
+0x8FCAAE 0x71B2
+0x8FCAAF 0x71B3
+0x8FCAB0 0x71BA
+0x8FCAB1 0x71BF
+0x8FCAB2 0x71C0
+0x8FCAB3 0x71C1
+0x8FCAB4 0x71C4
+0x8FCAB5 0x71CB
+0x8FCAB6 0x71CC
+0x8FCAB7 0x71D3
+0x8FCAB8 0x71D6
+0x8FCAB9 0x71D9
+0x8FCABA 0x71DA
+0x8FCABB 0x71DC
+0x8FCABC 0x71F8
+0x8FCABD 0x71FE
+0x8FCABE 0x7200
+0x8FCABF 0x7207
+0x8FCAC0 0x7208
+0x8FCAC1 0x7209
+0x8FCAC2 0x7213
+0x8FCAC3 0x7217
+0x8FCAC4 0x721A
+0x8FCAC5 0x721D
+0x8FCAC6 0x721F
+0x8FCAC7 0x7224
+0x8FCAC8 0x722B
+0x8FCAC9 0x722F
+0x8FCACA 0x7234
+0x8FCACB 0x7238
+0x8FCACC 0x7239
+0x8FCACD 0x7241
+0x8FCACE 0x7242
+0x8FCACF 0x7243
+0x8FCAD0 0x7245
+0x8FCAD1 0x724E
+0x8FCAD2 0x724F
+0x8FCAD3 0x7250
+0x8FCAD4 0x7253
+0x8FCAD5 0x7255
+0x8FCAD6 0x7256
+0x8FCAD7 0x725A
+0x8FCAD8 0x725C
+0x8FCAD9 0x725E
+0x8FCADA 0x7260
+0x8FCADB 0x7263
+0x8FCADC 0x7268
+0x8FCADD 0x726B
+0x8FCADE 0x726E
+0x8FCADF 0x726F
+0x8FCAE0 0x7271
+0x8FCAE1 0x7277
+0x8FCAE2 0x7278
+0x8FCAE3 0x727B
+0x8FCAE4 0x727C
+0x8FCAE5 0x727F
+0x8FCAE6 0x7284
+0x8FCAE7 0x7289
+0x8FCAE8 0x728D
+0x8FCAE9 0x728E
+0x8FCAEA 0x7293
+0x8FCAEB 0x729B
+0x8FCAEC 0x72A8
+0x8FCAED 0x72AD
+0x8FCAEE 0x72AE
+0x8FCAEF 0x72B1
+0x8FCAF0 0x72B4
+0x8FCAF1 0x72BE
+0x8FCAF2 0x72C1
+0x8FCAF3 0x72C7
+0x8FCAF4 0x72C9
+0x8FCAF5 0x72CC
+0x8FCAF6 0x72D5
+0x8FCAF7 0x72D6
+0x8FCAF8 0x72D8
+0x8FCAF9 0x72DF
+0x8FCAFA 0x72E5
+0x8FCAFB 0x72F3
+0x8FCAFC 0x72F4
+0x8FCAFD 0x72FA
+0x8FCAFE 0x72FB
+0x8FCBA1 0x72FE
+0x8FCBA2 0x7302
+0x8FCBA3 0x7304
+0x8FCBA4 0x7305
+0x8FCBA5 0x7307
+0x8FCBA6 0x730B
+0x8FCBA7 0x730D
+0x8FCBA8 0x7312
+0x8FCBA9 0x7313
+0x8FCBAA 0x7318
+0x8FCBAB 0x7319
+0x8FCBAC 0x731E
+0x8FCBAD 0x7322
+0x8FCBAE 0x7324
+0x8FCBAF 0x7327
+0x8FCBB0 0x7328
+0x8FCBB1 0x732C
+0x8FCBB2 0x7331
+0x8FCBB3 0x7332
+0x8FCBB4 0x7335
+0x8FCBB5 0x733A
+0x8FCBB6 0x733B
+0x8FCBB7 0x733D
+0x8FCBB8 0x7343
+0x8FCBB9 0x734D
+0x8FCBBA 0x7350
+0x8FCBBB 0x7352
+0x8FCBBC 0x7356
+0x8FCBBD 0x7358
+0x8FCBBE 0x735D
+0x8FCBBF 0x735E
+0x8FCBC0 0x735F
+0x8FCBC1 0x7360
+0x8FCBC2 0x7366
+0x8FCBC3 0x7367
+0x8FCBC4 0x7369
+0x8FCBC5 0x736B
+0x8FCBC6 0x736C
+0x8FCBC7 0x736E
+0x8FCBC8 0x736F
+0x8FCBC9 0x7371
+0x8FCBCA 0x7377
+0x8FCBCB 0x7379
+0x8FCBCC 0x737C
+0x8FCBCD 0x7380
+0x8FCBCE 0x7381
+0x8FCBCF 0x7383
+0x8FCBD0 0x7385
+0x8FCBD1 0x7386
+0x8FCBD2 0x738E
+0x8FCBD3 0x7390
+0x8FCBD4 0x7393
+0x8FCBD5 0x7395
+0x8FCBD6 0x7397
+0x8FCBD7 0x7398
+0x8FCBD8 0x739C
+0x8FCBD9 0x739E
+0x8FCBDA 0x739F
+0x8FCBDB 0x73A0
+0x8FCBDC 0x73A2
+0x8FCBDD 0x73A5
+0x8FCBDE 0x73A6
+0x8FCBDF 0x73AA
+0x8FCBE0 0x73AB
+0x8FCBE1 0x73AD
+0x8FCBE2 0x73B5
+0x8FCBE3 0x73B7
+0x8FCBE4 0x73B9
+0x8FCBE5 0x73BC
+0x8FCBE6 0x73BD
+0x8FCBE7 0x73BF
+0x8FCBE8 0x73C5
+0x8FCBE9 0x73C6
+0x8FCBEA 0x73C9
+0x8FCBEB 0x73CB
+0x8FCBEC 0x73CC
+0x8FCBED 0x73CF
+0x8FCBEE 0x73D2
+0x8FCBEF 0x73D3
+0x8FCBF0 0x73D6
+0x8FCBF1 0x73D9
+0x8FCBF2 0x73DD
+0x8FCBF3 0x73E1
+0x8FCBF4 0x73E3
+0x8FCBF5 0x73E6
+0x8FCBF6 0x73E7
+0x8FCBF7 0x73E9
+0x8FCBF8 0x73F4
+0x8FCBF9 0x73F5
+0x8FCBFA 0x73F7
+0x8FCBFB 0x73F9
+0x8FCBFC 0x73FA
+0x8FCBFD 0x73FB
+0x8FCBFE 0x73FD
+0x8FCCA1 0x73FF
+0x8FCCA2 0x7400
+0x8FCCA3 0x7401
+0x8FCCA4 0x7404
+0x8FCCA5 0x7407
+0x8FCCA6 0x740A
+0x8FCCA7 0x7411
+0x8FCCA8 0x741A
+0x8FCCA9 0x741B
+0x8FCCAA 0x7424
+0x8FCCAB 0x7426
+0x8FCCAC 0x7428
+0x8FCCAD 0x7429
+0x8FCCAE 0x742A
+0x8FCCAF 0x742B
+0x8FCCB0 0x742C
+0x8FCCB1 0x742D
+0x8FCCB2 0x742E
+0x8FCCB3 0x742F
+0x8FCCB4 0x7430
+0x8FCCB5 0x7431
+0x8FCCB6 0x7439
+0x8FCCB7 0x7440
+0x8FCCB8 0x7443
+0x8FCCB9 0x7444
+0x8FCCBA 0x7446
+0x8FCCBB 0x7447
+0x8FCCBC 0x744B
+0x8FCCBD 0x744D
+0x8FCCBE 0x7451
+0x8FCCBF 0x7452
+0x8FCCC0 0x7457
+0x8FCCC1 0x745D
+0x8FCCC2 0x7462
+0x8FCCC3 0x7466
+0x8FCCC4 0x7467
+0x8FCCC5 0x7468
+0x8FCCC6 0x746B
+0x8FCCC7 0x746D
+0x8FCCC8 0x746E
+0x8FCCC9 0x7471
+0x8FCCCA 0x7472
+0x8FCCCB 0x7480
+0x8FCCCC 0x7481
+0x8FCCCD 0x7485
+0x8FCCCE 0x7486
+0x8FCCCF 0x7487
+0x8FCCD0 0x7489
+0x8FCCD1 0x748F
+0x8FCCD2 0x7490
+0x8FCCD3 0x7491
+0x8FCCD4 0x7492
+0x8FCCD5 0x7498
+0x8FCCD6 0x7499
+0x8FCCD7 0x749A
+0x8FCCD8 0x749C
+0x8FCCD9 0x749F
+0x8FCCDA 0x74A0
+0x8FCCDB 0x74A1
+0x8FCCDC 0x74A3
+0x8FCCDD 0x74A6
+0x8FCCDE 0x74A8
+0x8FCCDF 0x74A9
+0x8FCCE0 0x74AA
+0x8FCCE1 0x74AB
+0x8FCCE2 0x74AE
+0x8FCCE3 0x74AF
+0x8FCCE4 0x74B1
+0x8FCCE5 0x74B2
+0x8FCCE6 0x74B5
+0x8FCCE7 0x74B9
+0x8FCCE8 0x74BB
+0x8FCCE9 0x74BF
+0x8FCCEA 0x74C8
+0x8FCCEB 0x74C9
+0x8FCCEC 0x74CC
+0x8FCCED 0x74D0
+0x8FCCEE 0x74D3
+0x8FCCEF 0x74D8
+0x8FCCF0 0x74DA
+0x8FCCF1 0x74DB
+0x8FCCF2 0x74DE
+0x8FCCF3 0x74DF
+0x8FCCF4 0x74E4
+0x8FCCF5 0x74E8
+0x8FCCF6 0x74EA
+0x8FCCF7 0x74EB
+0x8FCCF8 0x74EF
+0x8FCCF9 0x74F4
+0x8FCCFA 0x74FA
+0x8FCCFB 0x74FB
+0x8FCCFC 0x74FC
+0x8FCCFD 0x74FF
+0x8FCCFE 0x7506
+0x8FCDA1 0x7512
+0x8FCDA2 0x7516
+0x8FCDA3 0x7517
+0x8FCDA4 0x7520
+0x8FCDA5 0x7521
+0x8FCDA6 0x7524
+0x8FCDA7 0x7527
+0x8FCDA8 0x7529
+0x8FCDA9 0x752A
+0x8FCDAA 0x752F
+0x8FCDAB 0x7536
+0x8FCDAC 0x7539
+0x8FCDAD 0x753D
+0x8FCDAE 0x753E
+0x8FCDAF 0x753F
+0x8FCDB0 0x7540
+0x8FCDB1 0x7543
+0x8FCDB2 0x7547
+0x8FCDB3 0x7548
+0x8FCDB4 0x754E
+0x8FCDB5 0x7550
+0x8FCDB6 0x7552
+0x8FCDB7 0x7557
+0x8FCDB8 0x755E
+0x8FCDB9 0x755F
+0x8FCDBA 0x7561
+0x8FCDBB 0x756F
+0x8FCDBC 0x7571
+0x8FCDBD 0x7579
+0x8FCDBE 0x757A
+0x8FCDBF 0x757B
+0x8FCDC0 0x757C
+0x8FCDC1 0x757D
+0x8FCDC2 0x757E
+0x8FCDC3 0x7581
+0x8FCDC4 0x7585
+0x8FCDC5 0x7590
+0x8FCDC6 0x7592
+0x8FCDC7 0x7593
+0x8FCDC8 0x7595
+0x8FCDC9 0x7599
+0x8FCDCA 0x759C
+0x8FCDCB 0x75A2
+0x8FCDCC 0x75A4
+0x8FCDCD 0x75B4
+0x8FCDCE 0x75BA
+0x8FCDCF 0x75BF
+0x8FCDD0 0x75C0
+0x8FCDD1 0x75C1
+0x8FCDD2 0x75C4
+0x8FCDD3 0x75C6
+0x8FCDD4 0x75CC
+0x8FCDD5 0x75CE
+0x8FCDD6 0x75CF
+0x8FCDD7 0x75D7
+0x8FCDD8 0x75DC
+0x8FCDD9 0x75DF
+0x8FCDDA 0x75E0
+0x8FCDDB 0x75E1
+0x8FCDDC 0x75E4
+0x8FCDDD 0x75E7
+0x8FCDDE 0x75EC
+0x8FCDDF 0x75EE
+0x8FCDE0 0x75EF
+0x8FCDE1 0x75F1
+0x8FCDE2 0x75F9
+0x8FCDE3 0x7600
+0x8FCDE4 0x7602
+0x8FCDE5 0x7603
+0x8FCDE6 0x7604
+0x8FCDE7 0x7607
+0x8FCDE8 0x7608
+0x8FCDE9 0x760A
+0x8FCDEA 0x760C
+0x8FCDEB 0x760F
+0x8FCDEC 0x7612
+0x8FCDED 0x7613
+0x8FCDEE 0x7615
+0x8FCDEF 0x7616
+0x8FCDF0 0x7619
+0x8FCDF1 0x761B
+0x8FCDF2 0x761C
+0x8FCDF3 0x761D
+0x8FCDF4 0x761E
+0x8FCDF5 0x7623
+0x8FCDF6 0x7625
+0x8FCDF7 0x7626
+0x8FCDF8 0x7629
+0x8FCDF9 0x762D
+0x8FCDFA 0x7632
+0x8FCDFB 0x7633
+0x8FCDFC 0x7635
+0x8FCDFD 0x7638
+0x8FCDFE 0x7639
+0x8FCEA1 0x763A
+0x8FCEA2 0x763C
+0x8FCEA3 0x764A
+0x8FCEA4 0x7640
+0x8FCEA5 0x7641
+0x8FCEA6 0x7643
+0x8FCEA7 0x7644
+0x8FCEA8 0x7645
+0x8FCEA9 0x7649
+0x8FCEAA 0x764B
+0x8FCEAB 0x7655
+0x8FCEAC 0x7659
+0x8FCEAD 0x765F
+0x8FCEAE 0x7664
+0x8FCEAF 0x7665
+0x8FCEB0 0x766D
+0x8FCEB1 0x766E
+0x8FCEB2 0x766F
+0x8FCEB3 0x7671
+0x8FCEB4 0x7674
+0x8FCEB5 0x7681
+0x8FCEB6 0x7685
+0x8FCEB7 0x768C
+0x8FCEB8 0x768D
+0x8FCEB9 0x7695
+0x8FCEBA 0x769B
+0x8FCEBB 0x769C
+0x8FCEBC 0x769D
+0x8FCEBD 0x769F
+0x8FCEBE 0x76A0
+0x8FCEBF 0x76A2
+0x8FCEC0 0x76A3
+0x8FCEC1 0x76A4
+0x8FCEC2 0x76A5
+0x8FCEC3 0x76A6
+0x8FCEC4 0x76A7
+0x8FCEC5 0x76A8
+0x8FCEC6 0x76AA
+0x8FCEC7 0x76AD
+0x8FCEC8 0x76BD
+0x8FCEC9 0x76C1
+0x8FCECA 0x76C5
+0x8FCECB 0x76C9
+0x8FCECC 0x76CB
+0x8FCECD 0x76CC
+0x8FCECE 0x76CE
+0x8FCECF 0x76D4
+0x8FCED0 0x76D9
+0x8FCED1 0x76E0
+0x8FCED2 0x76E6
+0x8FCED3 0x76E8
+0x8FCED4 0x76EC
+0x8FCED5 0x76F0
+0x8FCED6 0x76F1
+0x8FCED7 0x76F6
+0x8FCED8 0x76F9
+0x8FCED9 0x76FC
+0x8FCEDA 0x7700
+0x8FCEDB 0x7706
+0x8FCEDC 0x770A
+0x8FCEDD 0x770E
+0x8FCEDE 0x7712
+0x8FCEDF 0x7714
+0x8FCEE0 0x7715
+0x8FCEE1 0x7717
+0x8FCEE2 0x7719
+0x8FCEE3 0x771A
+0x8FCEE4 0x771C
+0x8FCEE5 0x7722
+0x8FCEE6 0x7728
+0x8FCEE7 0x772D
+0x8FCEE8 0x772E
+0x8FCEE9 0x772F
+0x8FCEEA 0x7734
+0x8FCEEB 0x7735
+0x8FCEEC 0x7736
+0x8FCEED 0x7739
+0x8FCEEE 0x773D
+0x8FCEEF 0x773E
+0x8FCEF0 0x7742
+0x8FCEF1 0x7745
+0x8FCEF2 0x7746
+0x8FCEF3 0x774A
+0x8FCEF4 0x774D
+0x8FCEF5 0x774E
+0x8FCEF6 0x774F
+0x8FCEF7 0x7752
+0x8FCEF8 0x7756
+0x8FCEF9 0x7757
+0x8FCEFA 0x775C
+0x8FCEFB 0x775E
+0x8FCEFC 0x775F
+0x8FCEFD 0x7760
+0x8FCEFE 0x7762
+0x8FCFA1 0x7764
+0x8FCFA2 0x7767
+0x8FCFA3 0x776A
+0x8FCFA4 0x776C
+0x8FCFA5 0x7770
+0x8FCFA6 0x7772
+0x8FCFA7 0x7773
+0x8FCFA8 0x7774
+0x8FCFA9 0x777A
+0x8FCFAA 0x777D
+0x8FCFAB 0x7780
+0x8FCFAC 0x7784
+0x8FCFAD 0x778C
+0x8FCFAE 0x778D
+0x8FCFAF 0x7794
+0x8FCFB0 0x7795
+0x8FCFB1 0x7796
+0x8FCFB2 0x779A
+0x8FCFB3 0x779F
+0x8FCFB4 0x77A2
+0x8FCFB5 0x77A7
+0x8FCFB6 0x77AA
+0x8FCFB7 0x77AE
+0x8FCFB8 0x77AF
+0x8FCFB9 0x77B1
+0x8FCFBA 0x77B5
+0x8FCFBB 0x77BE
+0x8FCFBC 0x77C3
+0x8FCFBD 0x77C9
+0x8FCFBE 0x77D1
+0x8FCFBF 0x77D2
+0x8FCFC0 0x77D5
+0x8FCFC1 0x77D9
+0x8FCFC2 0x77DE
+0x8FCFC3 0x77DF
+0x8FCFC4 0x77E0
+0x8FCFC5 0x77E4
+0x8FCFC6 0x77E6
+0x8FCFC7 0x77EA
+0x8FCFC8 0x77EC
+0x8FCFC9 0x77F0
+0x8FCFCA 0x77F1
+0x8FCFCB 0x77F4
+0x8FCFCC 0x77F8
+0x8FCFCD 0x77FB
+0x8FCFCE 0x7805
+0x8FCFCF 0x7806
+0x8FCFD0 0x7809
+0x8FCFD1 0x780D
+0x8FCFD2 0x780E
+0x8FCFD3 0x7811
+0x8FCFD4 0x781D
+0x8FCFD5 0x7821
+0x8FCFD6 0x7822
+0x8FCFD7 0x7823
+0x8FCFD8 0x782D
+0x8FCFD9 0x782E
+0x8FCFDA 0x7830
+0x8FCFDB 0x7835
+0x8FCFDC 0x7837
+0x8FCFDD 0x7843
+0x8FCFDE 0x7844
+0x8FCFDF 0x7847
+0x8FCFE0 0x7848
+0x8FCFE1 0x784C
+0x8FCFE2 0x784E
+0x8FCFE3 0x7852
+0x8FCFE4 0x785C
+0x8FCFE5 0x785E
+0x8FCFE6 0x7860
+0x8FCFE7 0x7861
+0x8FCFE8 0x7863
+0x8FCFE9 0x7864
+0x8FCFEA 0x7868
+0x8FCFEB 0x786A
+0x8FCFEC 0x786E
+0x8FCFED 0x787A
+0x8FCFEE 0x787E
+0x8FCFEF 0x788A
+0x8FCFF0 0x788F
+0x8FCFF1 0x7894
+0x8FCFF2 0x7898
+0x8FCFF3 0x78A1
+0x8FCFF4 0x789D
+0x8FCFF5 0x789E
+0x8FCFF6 0x789F
+0x8FCFF7 0x78A4
+0x8FCFF8 0x78A8
+0x8FCFF9 0x78AC
+0x8FCFFA 0x78AD
+0x8FCFFB 0x78B0
+0x8FCFFC 0x78B1
+0x8FCFFD 0x78B2
+0x8FCFFE 0x78B3
+0x8FD0A1 0x78BB
+0x8FD0A2 0x78BD
+0x8FD0A3 0x78BF
+0x8FD0A4 0x78C7
+0x8FD0A5 0x78C8
+0x8FD0A6 0x78C9
+0x8FD0A7 0x78CC
+0x8FD0A8 0x78CE
+0x8FD0A9 0x78D2
+0x8FD0AA 0x78D3
+0x8FD0AB 0x78D5
+0x8FD0AC 0x78D6
+0x8FD0AD 0x78E4
+0x8FD0AE 0x78DB
+0x8FD0AF 0x78DF
+0x8FD0B0 0x78E0
+0x8FD0B1 0x78E1
+0x8FD0B2 0x78E6
+0x8FD0B3 0x78EA
+0x8FD0B4 0x78F2
+0x8FD0B5 0x78F3
+0x8FD0B6 0x7900
+0x8FD0B7 0x78F6
+0x8FD0B8 0x78F7
+0x8FD0B9 0x78FA
+0x8FD0BA 0x78FB
+0x8FD0BB 0x78FF
+0x8FD0BC 0x7906
+0x8FD0BD 0x790C
+0x8FD0BE 0x7910
+0x8FD0BF 0x791A
+0x8FD0C0 0x791C
+0x8FD0C1 0x791E
+0x8FD0C2 0x791F
+0x8FD0C3 0x7920
+0x8FD0C4 0x7925
+0x8FD0C5 0x7927
+0x8FD0C6 0x7929
+0x8FD0C7 0x792D
+0x8FD0C8 0x7931
+0x8FD0C9 0x7934
+0x8FD0CA 0x7935
+0x8FD0CB 0x793B
+0x8FD0CC 0x793D
+0x8FD0CD 0x793F
+0x8FD0CE 0x7944
+0x8FD0CF 0x7945
+0x8FD0D0 0x7946
+0x8FD0D1 0x794A
+0x8FD0D2 0x794B
+0x8FD0D3 0x794F
+0x8FD0D4 0x7951
+0x8FD0D5 0x7954
+0x8FD0D6 0x7958
+0x8FD0D7 0x795B
+0x8FD0D8 0x795C
+0x8FD0D9 0x7967
+0x8FD0DA 0x7969
+0x8FD0DB 0x796B
+0x8FD0DC 0x7972
+0x8FD0DD 0x7979
+0x8FD0DE 0x797B
+0x8FD0DF 0x797C
+0x8FD0E0 0x797E
+0x8FD0E1 0x798B
+0x8FD0E2 0x798C
+0x8FD0E3 0x7991
+0x8FD0E4 0x7993
+0x8FD0E5 0x7994
+0x8FD0E6 0x7995
+0x8FD0E7 0x7996
+0x8FD0E8 0x7998
+0x8FD0E9 0x799B
+0x8FD0EA 0x799C
+0x8FD0EB 0x79A1
+0x8FD0EC 0x79A8
+0x8FD0ED 0x79A9
+0x8FD0EE 0x79AB
+0x8FD0EF 0x79AF
+0x8FD0F0 0x79B1
+0x8FD0F1 0x79B4
+0x8FD0F2 0x79B8
+0x8FD0F3 0x79BB
+0x8FD0F4 0x79C2
+0x8FD0F5 0x79C4
+0x8FD0F6 0x79C7
+0x8FD0F7 0x79C8
+0x8FD0F8 0x79CA
+0x8FD0F9 0x79CF
+0x8FD0FA 0x79D4
+0x8FD0FB 0x79D6
+0x8FD0FC 0x79DA
+0x8FD0FD 0x79DD
+0x8FD0FE 0x79DE
+0x8FD1A1 0x79E0
+0x8FD1A2 0x79E2
+0x8FD1A3 0x79E5
+0x8FD1A4 0x79EA
+0x8FD1A5 0x79EB
+0x8FD1A6 0x79ED
+0x8FD1A7 0x79F1
+0x8FD1A8 0x79F8
+0x8FD1A9 0x79FC
+0x8FD1AA 0x7A02
+0x8FD1AB 0x7A03
+0x8FD1AC 0x7A07
+0x8FD1AD 0x7A09
+0x8FD1AE 0x7A0A
+0x8FD1AF 0x7A0C
+0x8FD1B0 0x7A11
+0x8FD1B1 0x7A15
+0x8FD1B2 0x7A1B
+0x8FD1B3 0x7A1E
+0x8FD1B4 0x7A21
+0x8FD1B5 0x7A27
+0x8FD1B6 0x7A2B
+0x8FD1B7 0x7A2D
+0x8FD1B8 0x7A2F
+0x8FD1B9 0x7A30
+0x8FD1BA 0x7A34
+0x8FD1BB 0x7A35
+0x8FD1BC 0x7A38
+0x8FD1BD 0x7A39
+0x8FD1BE 0x7A3A
+0x8FD1BF 0x7A44
+0x8FD1C0 0x7A45
+0x8FD1C1 0x7A47
+0x8FD1C2 0x7A48
+0x8FD1C3 0x7A4C
+0x8FD1C4 0x7A55
+0x8FD1C5 0x7A56
+0x8FD1C6 0x7A59
+0x8FD1C7 0x7A5C
+0x8FD1C8 0x7A5D
+0x8FD1C9 0x7A5F
+0x8FD1CA 0x7A60
+0x8FD1CB 0x7A65
+0x8FD1CC 0x7A67
+0x8FD1CD 0x7A6A
+0x8FD1CE 0x7A6D
+0x8FD1CF 0x7A75
+0x8FD1D0 0x7A78
+0x8FD1D1 0x7A7E
+0x8FD1D2 0x7A80
+0x8FD1D3 0x7A82
+0x8FD1D4 0x7A85
+0x8FD1D5 0x7A86
+0x8FD1D6 0x7A8A
+0x8FD1D7 0x7A8B
+0x8FD1D8 0x7A90
+0x8FD1D9 0x7A91
+0x8FD1DA 0x7A94
+0x8FD1DB 0x7A9E
+0x8FD1DC 0x7AA0
+0x8FD1DD 0x7AA3
+0x8FD1DE 0x7AAC
+0x8FD1DF 0x7AB3
+0x8FD1E0 0x7AB5
+0x8FD1E1 0x7AB9
+0x8FD1E2 0x7ABB
+0x8FD1E3 0x7ABC
+0x8FD1E4 0x7AC6
+0x8FD1E5 0x7AC9
+0x8FD1E6 0x7ACC
+0x8FD1E7 0x7ACE
+0x8FD1E8 0x7AD1
+0x8FD1E9 0x7ADB
+0x8FD1EA 0x7AE8
+0x8FD1EB 0x7AE9
+0x8FD1EC 0x7AEB
+0x8FD1ED 0x7AEC
+0x8FD1EE 0x7AF1
+0x8FD1EF 0x7AF4
+0x8FD1F0 0x7AFB
+0x8FD1F1 0x7AFD
+0x8FD1F2 0x7AFE
+0x8FD1F3 0x7B07
+0x8FD1F4 0x7B14
+0x8FD1F5 0x7B1F
+0x8FD1F6 0x7B23
+0x8FD1F7 0x7B27
+0x8FD1F8 0x7B29
+0x8FD1F9 0x7B2A
+0x8FD1FA 0x7B2B
+0x8FD1FB 0x7B2D
+0x8FD1FC 0x7B2E
+0x8FD1FD 0x7B2F
+0x8FD1FE 0x7B30
+0x8FD2A1 0x7B31
+0x8FD2A2 0x7B34
+0x8FD2A3 0x7B3D
+0x8FD2A4 0x7B3F
+0x8FD2A5 0x7B40
+0x8FD2A6 0x7B41
+0x8FD2A7 0x7B47
+0x8FD2A8 0x7B4E
+0x8FD2A9 0x7B55
+0x8FD2AA 0x7B60
+0x8FD2AB 0x7B64
+0x8FD2AC 0x7B66
+0x8FD2AD 0x7B69
+0x8FD2AE 0x7B6A
+0x8FD2AF 0x7B6D
+0x8FD2B0 0x7B6F
+0x8FD2B1 0x7B72
+0x8FD2B2 0x7B73
+0x8FD2B3 0x7B77
+0x8FD2B4 0x7B84
+0x8FD2B5 0x7B89
+0x8FD2B6 0x7B8E
+0x8FD2B7 0x7B90
+0x8FD2B8 0x7B91
+0x8FD2B9 0x7B96
+0x8FD2BA 0x7B9B
+0x8FD2BB 0x7B9E
+0x8FD2BC 0x7BA0
+0x8FD2BD 0x7BA5
+0x8FD2BE 0x7BAC
+0x8FD2BF 0x7BAF
+0x8FD2C0 0x7BB0
+0x8FD2C1 0x7BB2
+0x8FD2C2 0x7BB5
+0x8FD2C3 0x7BB6
+0x8FD2C4 0x7BBA
+0x8FD2C5 0x7BBB
+0x8FD2C6 0x7BBC
+0x8FD2C7 0x7BBD
+0x8FD2C8 0x7BC2
+0x8FD2C9 0x7BC5
+0x8FD2CA 0x7BC8
+0x8FD2CB 0x7BCA
+0x8FD2CC 0x7BD4
+0x8FD2CD 0x7BD6
+0x8FD2CE 0x7BD7
+0x8FD2CF 0x7BD9
+0x8FD2D0 0x7BDA
+0x8FD2D1 0x7BDB
+0x8FD2D2 0x7BE8
+0x8FD2D3 0x7BEA
+0x8FD2D4 0x7BF2
+0x8FD2D5 0x7BF4
+0x8FD2D6 0x7BF5
+0x8FD2D7 0x7BF8
+0x8FD2D8 0x7BF9
+0x8FD2D9 0x7BFA
+0x8FD2DA 0x7BFC
+0x8FD2DB 0x7BFE
+0x8FD2DC 0x7C01
+0x8FD2DD 0x7C02
+0x8FD2DE 0x7C03
+0x8FD2DF 0x7C04
+0x8FD2E0 0x7C06
+0x8FD2E1 0x7C09
+0x8FD2E2 0x7C0B
+0x8FD2E3 0x7C0C
+0x8FD2E4 0x7C0E
+0x8FD2E5 0x7C0F
+0x8FD2E6 0x7C19
+0x8FD2E7 0x7C1B
+0x8FD2E8 0x7C20
+0x8FD2E9 0x7C25
+0x8FD2EA 0x7C26
+0x8FD2EB 0x7C28
+0x8FD2EC 0x7C2C
+0x8FD2ED 0x7C31
+0x8FD2EE 0x7C33
+0x8FD2EF 0x7C34
+0x8FD2F0 0x7C36
+0x8FD2F1 0x7C39
+0x8FD2F2 0x7C3A
+0x8FD2F3 0x7C46
+0x8FD2F4 0x7C4A
+0x8FD2F5 0x7C55
+0x8FD2F6 0x7C51
+0x8FD2F7 0x7C52
+0x8FD2F8 0x7C53
+0x8FD2F9 0x7C59
+0x8FD2FA 0x7C5A
+0x8FD2FB 0x7C5B
+0x8FD2FC 0x7C5C
+0x8FD2FD 0x7C5D
+0x8FD2FE 0x7C5E
+0x8FD3A1 0x7C61
+0x8FD3A2 0x7C63
+0x8FD3A3 0x7C67
+0x8FD3A4 0x7C69
+0x8FD3A5 0x7C6D
+0x8FD3A6 0x7C6E
+0x8FD3A7 0x7C70
+0x8FD3A8 0x7C72
+0x8FD3A9 0x7C79
+0x8FD3AA 0x7C7C
+0x8FD3AB 0x7C7D
+0x8FD3AC 0x7C86
+0x8FD3AD 0x7C87
+0x8FD3AE 0x7C8F
+0x8FD3AF 0x7C94
+0x8FD3B0 0x7C9E
+0x8FD3B1 0x7CA0
+0x8FD3B2 0x7CA6
+0x8FD3B3 0x7CB0
+0x8FD3B4 0x7CB6
+0x8FD3B5 0x7CB7
+0x8FD3B6 0x7CBA
+0x8FD3B7 0x7CBB
+0x8FD3B8 0x7CBC
+0x8FD3B9 0x7CBF
+0x8FD3BA 0x7CC4
+0x8FD3BB 0x7CC7
+0x8FD3BC 0x7CC8
+0x8FD3BD 0x7CC9
+0x8FD3BE 0x7CCD
+0x8FD3BF 0x7CCF
+0x8FD3C0 0x7CD3
+0x8FD3C1 0x7CD4
+0x8FD3C2 0x7CD5
+0x8FD3C3 0x7CD7
+0x8FD3C4 0x7CD9
+0x8FD3C5 0x7CDA
+0x8FD3C6 0x7CDD
+0x8FD3C7 0x7CE6
+0x8FD3C8 0x7CE9
+0x8FD3C9 0x7CEB
+0x8FD3CA 0x7CF5
+0x8FD3CB 0x7D03
+0x8FD3CC 0x7D07
+0x8FD3CD 0x7D08
+0x8FD3CE 0x7D09
+0x8FD3CF 0x7D0F
+0x8FD3D0 0x7D11
+0x8FD3D1 0x7D12
+0x8FD3D2 0x7D13
+0x8FD3D3 0x7D16
+0x8FD3D4 0x7D1D
+0x8FD3D5 0x7D1E
+0x8FD3D6 0x7D23
+0x8FD3D7 0x7D26
+0x8FD3D8 0x7D2A
+0x8FD3D9 0x7D2D
+0x8FD3DA 0x7D31
+0x8FD3DB 0x7D3C
+0x8FD3DC 0x7D3D
+0x8FD3DD 0x7D3E
+0x8FD3DE 0x7D40
+0x8FD3DF 0x7D41
+0x8FD3E0 0x7D47
+0x8FD3E1 0x7D48
+0x8FD3E2 0x7D4D
+0x8FD3E3 0x7D51
+0x8FD3E4 0x7D53
+0x8FD3E5 0x7D57
+0x8FD3E6 0x7D59
+0x8FD3E7 0x7D5A
+0x8FD3E8 0x7D5C
+0x8FD3E9 0x7D5D
+0x8FD3EA 0x7D65
+0x8FD3EB 0x7D67
+0x8FD3EC 0x7D6A
+0x8FD3ED 0x7D70
+0x8FD3EE 0x7D78
+0x8FD3EF 0x7D7A
+0x8FD3F0 0x7D7B
+0x8FD3F1 0x7D7F
+0x8FD3F2 0x7D81
+0x8FD3F3 0x7D82
+0x8FD3F4 0x7D83
+0x8FD3F5 0x7D85
+0x8FD3F6 0x7D86
+0x8FD3F7 0x7D88
+0x8FD3F8 0x7D8B
+0x8FD3F9 0x7D8C
+0x8FD3FA 0x7D8D
+0x8FD3FB 0x7D91
+0x8FD3FC 0x7D96
+0x8FD3FD 0x7D97
+0x8FD3FE 0x7D9D
+0x8FD4A1 0x7D9E
+0x8FD4A2 0x7DA6
+0x8FD4A3 0x7DA7
+0x8FD4A4 0x7DAA
+0x8FD4A5 0x7DB3
+0x8FD4A6 0x7DB6
+0x8FD4A7 0x7DB7
+0x8FD4A8 0x7DB9
+0x8FD4A9 0x7DC2
+0x8FD4AA 0x7DC3
+0x8FD4AB 0x7DC4
+0x8FD4AC 0x7DC5
+0x8FD4AD 0x7DC6
+0x8FD4AE 0x7DCC
+0x8FD4AF 0x7DCD
+0x8FD4B0 0x7DCE
+0x8FD4B1 0x7DD7
+0x8FD4B2 0x7DD9
+0x8FD4B3 0x7E00
+0x8FD4B4 0x7DE2
+0x8FD4B5 0x7DE5
+0x8FD4B6 0x7DE6
+0x8FD4B7 0x7DEA
+0x8FD4B8 0x7DEB
+0x8FD4B9 0x7DED
+0x8FD4BA 0x7DF1
+0x8FD4BB 0x7DF5
+0x8FD4BC 0x7DF6
+0x8FD4BD 0x7DF9
+0x8FD4BE 0x7DFA
+0x8FD4BF 0x7E08
+0x8FD4C0 0x7E10
+0x8FD4C1 0x7E11
+0x8FD4C2 0x7E15
+0x8FD4C3 0x7E17
+0x8FD4C4 0x7E1C
+0x8FD4C5 0x7E1D
+0x8FD4C6 0x7E20
+0x8FD4C7 0x7E27
+0x8FD4C8 0x7E28
+0x8FD4C9 0x7E2C
+0x8FD4CA 0x7E2D
+0x8FD4CB 0x7E2F
+0x8FD4CC 0x7E33
+0x8FD4CD 0x7E36
+0x8FD4CE 0x7E3F
+0x8FD4CF 0x7E44
+0x8FD4D0 0x7E45
+0x8FD4D1 0x7E47
+0x8FD4D2 0x7E4E
+0x8FD4D3 0x7E50
+0x8FD4D4 0x7E52
+0x8FD4D5 0x7E58
+0x8FD4D6 0x7E5F
+0x8FD4D7 0x7E61
+0x8FD4D8 0x7E62
+0x8FD4D9 0x7E65
+0x8FD4DA 0x7E6B
+0x8FD4DB 0x7E6E
+0x8FD4DC 0x7E6F
+0x8FD4DD 0x7E73
+0x8FD4DE 0x7E78
+0x8FD4DF 0x7E7E
+0x8FD4E0 0x7E81
+0x8FD4E1 0x7E86
+0x8FD4E2 0x7E87
+0x8FD4E3 0x7E8A
+0x8FD4E4 0x7E8D
+0x8FD4E5 0x7E91
+0x8FD4E6 0x7E95
+0x8FD4E7 0x7E98
+0x8FD4E8 0x7E9A
+0x8FD4E9 0x7E9D
+0x8FD4EA 0x7E9E
+0x8FD4EB 0x7F3C
+0x8FD4EC 0x7F3B
+0x8FD4ED 0x7F3D
+0x8FD4EE 0x7F3E
+0x8FD4EF 0x7F3F
+0x8FD4F0 0x7F43
+0x8FD4F1 0x7F44
+0x8FD4F2 0x7F47
+0x8FD4F3 0x7F4F
+0x8FD4F4 0x7F52
+0x8FD4F5 0x7F53
+0x8FD4F6 0x7F5B
+0x8FD4F7 0x7F5C
+0x8FD4F8 0x7F5D
+0x8FD4F9 0x7F61
+0x8FD4FA 0x7F63
+0x8FD4FB 0x7F64
+0x8FD4FC 0x7F65
+0x8FD4FD 0x7F66
+0x8FD4FE 0x7F6D
+0x8FD5A1 0x7F71
+0x8FD5A2 0x7F7D
+0x8FD5A3 0x7F7E
+0x8FD5A4 0x7F7F
+0x8FD5A5 0x7F80
+0x8FD5A6 0x7F8B
+0x8FD5A7 0x7F8D
+0x8FD5A8 0x7F8F
+0x8FD5A9 0x7F90
+0x8FD5AA 0x7F91
+0x8FD5AB 0x7F96
+0x8FD5AC 0x7F97
+0x8FD5AD 0x7F9C
+0x8FD5AE 0x7FA1
+0x8FD5AF 0x7FA2
+0x8FD5B0 0x7FA6
+0x8FD5B1 0x7FAA
+0x8FD5B2 0x7FAD
+0x8FD5B3 0x7FB4
+0x8FD5B4 0x7FBC
+0x8FD5B5 0x7FBF
+0x8FD5B6 0x7FC0
+0x8FD5B7 0x7FC3
+0x8FD5B8 0x7FC8
+0x8FD5B9 0x7FCE
+0x8FD5BA 0x7FCF
+0x8FD5BB 0x7FDB
+0x8FD5BC 0x7FDF
+0x8FD5BD 0x7FE3
+0x8FD5BE 0x7FE5
+0x8FD5BF 0x7FE8
+0x8FD5C0 0x7FEC
+0x8FD5C1 0x7FEE
+0x8FD5C2 0x7FEF
+0x8FD5C3 0x7FF2
+0x8FD5C4 0x7FFA
+0x8FD5C5 0x7FFD
+0x8FD5C6 0x7FFE
+0x8FD5C7 0x7FFF
+0x8FD5C8 0x8007
+0x8FD5C9 0x8008
+0x8FD5CA 0x800A
+0x8FD5CB 0x800D
+0x8FD5CC 0x800E
+0x8FD5CD 0x800F
+0x8FD5CE 0x8011
+0x8FD5CF 0x8013
+0x8FD5D0 0x8014
+0x8FD5D1 0x8016
+0x8FD5D2 0x801D
+0x8FD5D3 0x801E
+0x8FD5D4 0x801F
+0x8FD5D5 0x8020
+0x8FD5D6 0x8024
+0x8FD5D7 0x8026
+0x8FD5D8 0x802C
+0x8FD5D9 0x802E
+0x8FD5DA 0x8030
+0x8FD5DB 0x8034
+0x8FD5DC 0x8035
+0x8FD5DD 0x8037
+0x8FD5DE 0x8039
+0x8FD5DF 0x803A
+0x8FD5E0 0x803C
+0x8FD5E1 0x803E
+0x8FD5E2 0x8040
+0x8FD5E3 0x8044
+0x8FD5E4 0x8060
+0x8FD5E5 0x8064
+0x8FD5E6 0x8066
+0x8FD5E7 0x806D
+0x8FD5E8 0x8071
+0x8FD5E9 0x8075
+0x8FD5EA 0x8081
+0x8FD5EB 0x8088
+0x8FD5EC 0x808E
+0x8FD5ED 0x809C
+0x8FD5EE 0x809E
+0x8FD5EF 0x80A6
+0x8FD5F0 0x80A7
+0x8FD5F1 0x80AB
+0x8FD5F2 0x80B8
+0x8FD5F3 0x80B9
+0x8FD5F4 0x80C8
+0x8FD5F5 0x80CD
+0x8FD5F6 0x80CF
+0x8FD5F7 0x80D2
+0x8FD5F8 0x80D4
+0x8FD5F9 0x80D5
+0x8FD5FA 0x80D7
+0x8FD5FB 0x80D8
+0x8FD5FC 0x80E0
+0x8FD5FD 0x80ED
+0x8FD5FE 0x80EE
+0x8FD6A1 0x80F0
+0x8FD6A2 0x80F2
+0x8FD6A3 0x80F3
+0x8FD6A4 0x80F6
+0x8FD6A5 0x80F9
+0x8FD6A6 0x80FA
+0x8FD6A7 0x80FE
+0x8FD6A8 0x8103
+0x8FD6A9 0x810B
+0x8FD6AA 0x8116
+0x8FD6AB 0x8117
+0x8FD6AC 0x8118
+0x8FD6AD 0x811C
+0x8FD6AE 0x811E
+0x8FD6AF 0x8120
+0x8FD6B0 0x8124
+0x8FD6B1 0x8127
+0x8FD6B2 0x812C
+0x8FD6B3 0x8130
+0x8FD6B4 0x8135
+0x8FD6B5 0x813A
+0x8FD6B6 0x813C
+0x8FD6B7 0x8145
+0x8FD6B8 0x8147
+0x8FD6B9 0x814A
+0x8FD6BA 0x814C
+0x8FD6BB 0x8152
+0x8FD6BC 0x8157
+0x8FD6BD 0x8160
+0x8FD6BE 0x8161
+0x8FD6BF 0x8167
+0x8FD6C0 0x8168
+0x8FD6C1 0x8169
+0x8FD6C2 0x816D
+0x8FD6C3 0x816F
+0x8FD6C4 0x8177
+0x8FD6C5 0x8181
+0x8FD6C6 0x8190
+0x8FD6C7 0x8184
+0x8FD6C8 0x8185
+0x8FD6C9 0x8186
+0x8FD6CA 0x818B
+0x8FD6CB 0x818E
+0x8FD6CC 0x8196
+0x8FD6CD 0x8198
+0x8FD6CE 0x819B
+0x8FD6CF 0x819E
+0x8FD6D0 0x81A2
+0x8FD6D1 0x81AE
+0x8FD6D2 0x81B2
+0x8FD6D3 0x81B4
+0x8FD6D4 0x81BB
+0x8FD6D5 0x81CB
+0x8FD6D6 0x81C3
+0x8FD6D7 0x81C5
+0x8FD6D8 0x81CA
+0x8FD6D9 0x81CE
+0x8FD6DA 0x81CF
+0x8FD6DB 0x81D5
+0x8FD6DC 0x81D7
+0x8FD6DD 0x81DB
+0x8FD6DE 0x81DD
+0x8FD6DF 0x81DE
+0x8FD6E0 0x81E1
+0x8FD6E1 0x81E4
+0x8FD6E2 0x81EB
+0x8FD6E3 0x81EC
+0x8FD6E4 0x81F0
+0x8FD6E5 0x81F1
+0x8FD6E6 0x81F2
+0x8FD6E7 0x81F5
+0x8FD6E8 0x81F6
+0x8FD6E9 0x81F8
+0x8FD6EA 0x81F9
+0x8FD6EB 0x81FD
+0x8FD6EC 0x81FF
+0x8FD6ED 0x8200
+0x8FD6EE 0x8203
+0x8FD6EF 0x820F
+0x8FD6F0 0x8213
+0x8FD6F1 0x8214
+0x8FD6F2 0x8219
+0x8FD6F3 0x821A
+0x8FD6F4 0x821D
+0x8FD6F5 0x8221
+0x8FD6F6 0x8222
+0x8FD6F7 0x8228
+0x8FD6F8 0x8232
+0x8FD6F9 0x8234
+0x8FD6FA 0x823A
+0x8FD6FB 0x8243
+0x8FD6FC 0x8244
+0x8FD6FD 0x8245
+0x8FD6FE 0x8246
+0x8FD7A1 0x824B
+0x8FD7A2 0x824E
+0x8FD7A3 0x824F
+0x8FD7A4 0x8251
+0x8FD7A5 0x8256
+0x8FD7A6 0x825C
+0x8FD7A7 0x8260
+0x8FD7A8 0x8263
+0x8FD7A9 0x8267
+0x8FD7AA 0x826D
+0x8FD7AB 0x8274
+0x8FD7AC 0x827B
+0x8FD7AD 0x827D
+0x8FD7AE 0x827F
+0x8FD7AF 0x8280
+0x8FD7B0 0x8281
+0x8FD7B1 0x8283
+0x8FD7B2 0x8284
+0x8FD7B3 0x8287
+0x8FD7B4 0x8289
+0x8FD7B5 0x828A
+0x8FD7B6 0x828E
+0x8FD7B7 0x8291
+0x8FD7B8 0x8294
+0x8FD7B9 0x8296
+0x8FD7BA 0x8298
+0x8FD7BB 0x829A
+0x8FD7BC 0x829B
+0x8FD7BD 0x82A0
+0x8FD7BE 0x82A1
+0x8FD7BF 0x82A3
+0x8FD7C0 0x82A4
+0x8FD7C1 0x82A7
+0x8FD7C2 0x82A8
+0x8FD7C3 0x82A9
+0x8FD7C4 0x82AA
+0x8FD7C5 0x82AE
+0x8FD7C6 0x82B0
+0x8FD7C7 0x82B2
+0x8FD7C8 0x82B4
+0x8FD7C9 0x82B7
+0x8FD7CA 0x82BA
+0x8FD7CB 0x82BC
+0x8FD7CC 0x82BE
+0x8FD7CD 0x82BF
+0x8FD7CE 0x82C6
+0x8FD7CF 0x82D0
+0x8FD7D0 0x82D5
+0x8FD7D1 0x82DA
+0x8FD7D2 0x82E0
+0x8FD7D3 0x82E2
+0x8FD7D4 0x82E4
+0x8FD7D5 0x82E8
+0x8FD7D6 0x82EA
+0x8FD7D7 0x82ED
+0x8FD7D8 0x82EF
+0x8FD7D9 0x82F6
+0x8FD7DA 0x82F7
+0x8FD7DB 0x82FD
+0x8FD7DC 0x82FE
+0x8FD7DD 0x8300
+0x8FD7DE 0x8301
+0x8FD7DF 0x8307
+0x8FD7E0 0x8308
+0x8FD7E1 0x830A
+0x8FD7E2 0x830B
+0x8FD7E3 0x8354
+0x8FD7E4 0x831B
+0x8FD7E5 0x831D
+0x8FD7E6 0x831E
+0x8FD7E7 0x831F
+0x8FD7E8 0x8321
+0x8FD7E9 0x8322
+0x8FD7EA 0x832C
+0x8FD7EB 0x832D
+0x8FD7EC 0x832E
+0x8FD7ED 0x8330
+0x8FD7EE 0x8333
+0x8FD7EF 0x8337
+0x8FD7F0 0x833A
+0x8FD7F1 0x833C
+0x8FD7F2 0x833D
+0x8FD7F3 0x8342
+0x8FD7F4 0x8343
+0x8FD7F5 0x8344
+0x8FD7F6 0x8347
+0x8FD7F7 0x834D
+0x8FD7F8 0x834E
+0x8FD7F9 0x8351
+0x8FD7FA 0x8355
+0x8FD7FB 0x8356
+0x8FD7FC 0x8357
+0x8FD7FD 0x8370
+0x8FD7FE 0x8378
+0x8FD8A1 0x837D
+0x8FD8A2 0x837F
+0x8FD8A3 0x8380
+0x8FD8A4 0x8382
+0x8FD8A5 0x8384
+0x8FD8A6 0x8386
+0x8FD8A7 0x838D
+0x8FD8A8 0x8392
+0x8FD8A9 0x8394
+0x8FD8AA 0x8395
+0x8FD8AB 0x8398
+0x8FD8AC 0x8399
+0x8FD8AD 0x839B
+0x8FD8AE 0x839C
+0x8FD8AF 0x839D
+0x8FD8B0 0x83A6
+0x8FD8B1 0x83A7
+0x8FD8B2 0x83A9
+0x8FD8B3 0x83AC
+0x8FD8B4 0x83BE
+0x8FD8B5 0x83BF
+0x8FD8B6 0x83C0
+0x8FD8B7 0x83C7
+0x8FD8B8 0x83C9
+0x8FD8B9 0x83CF
+0x8FD8BA 0x83D0
+0x8FD8BB 0x83D1
+0x8FD8BC 0x83D4
+0x8FD8BD 0x83DD
+0x8FD8BE 0x8353
+0x8FD8BF 0x83E8
+0x8FD8C0 0x83EA
+0x8FD8C1 0x83F6
+0x8FD8C2 0x83F8
+0x8FD8C3 0x83F9
+0x8FD8C4 0x83FC
+0x8FD8C5 0x8401
+0x8FD8C6 0x8406
+0x8FD8C7 0x840A
+0x8FD8C8 0x840F
+0x8FD8C9 0x8411
+0x8FD8CA 0x8415
+0x8FD8CB 0x8419
+0x8FD8CC 0x83AD
+0x8FD8CD 0x842F
+0x8FD8CE 0x8439
+0x8FD8CF 0x8445
+0x8FD8D0 0x8447
+0x8FD8D1 0x8448
+0x8FD8D2 0x844A
+0x8FD8D3 0x844D
+0x8FD8D4 0x844F
+0x8FD8D5 0x8451
+0x8FD8D6 0x8452
+0x8FD8D7 0x8456
+0x8FD8D8 0x8458
+0x8FD8D9 0x8459
+0x8FD8DA 0x845A
+0x8FD8DB 0x845C
+0x8FD8DC 0x8460
+0x8FD8DD 0x8464
+0x8FD8DE 0x8465
+0x8FD8DF 0x8467
+0x8FD8E0 0x846A
+0x8FD8E1 0x8470
+0x8FD8E2 0x8473
+0x8FD8E3 0x8474
+0x8FD8E4 0x8476
+0x8FD8E5 0x8478
+0x8FD8E6 0x847C
+0x8FD8E7 0x847D
+0x8FD8E8 0x8481
+0x8FD8E9 0x8485
+0x8FD8EA 0x8492
+0x8FD8EB 0x8493
+0x8FD8EC 0x8495
+0x8FD8ED 0x849E
+0x8FD8EE 0x84A6
+0x8FD8EF 0x84A8
+0x8FD8F0 0x84A9
+0x8FD8F1 0x84AA
+0x8FD8F2 0x84AF
+0x8FD8F3 0x84B1
+0x8FD8F4 0x84B4
+0x8FD8F5 0x84BA
+0x8FD8F6 0x84BD
+0x8FD8F7 0x84BE
+0x8FD8F8 0x84C0
+0x8FD8F9 0x84C2
+0x8FD8FA 0x84C7
+0x8FD8FB 0x84C8
+0x8FD8FC 0x84CC
+0x8FD8FD 0x84CF
+0x8FD8FE 0x84D3
+0x8FD9A1 0x84DC
+0x8FD9A2 0x84E7
+0x8FD9A3 0x84EA
+0x8FD9A4 0x84EF
+0x8FD9A5 0x84F0
+0x8FD9A6 0x84F1
+0x8FD9A7 0x84F2
+0x8FD9A8 0x84F7
+0x8FD9A9 0x8532
+0x8FD9AA 0x84FA
+0x8FD9AB 0x84FB
+0x8FD9AC 0x84FD
+0x8FD9AD 0x8502
+0x8FD9AE 0x8503
+0x8FD9AF 0x8507
+0x8FD9B0 0x850C
+0x8FD9B1 0x850E
+0x8FD9B2 0x8510
+0x8FD9B3 0x851C
+0x8FD9B4 0x851E
+0x8FD9B5 0x8522
+0x8FD9B6 0x8523
+0x8FD9B7 0x8524
+0x8FD9B8 0x8525
+0x8FD9B9 0x8527
+0x8FD9BA 0x852A
+0x8FD9BB 0x852B
+0x8FD9BC 0x852F
+0x8FD9BD 0x8533
+0x8FD9BE 0x8534
+0x8FD9BF 0x8536
+0x8FD9C0 0x853F
+0x8FD9C1 0x8546
+0x8FD9C2 0x854F
+0x8FD9C3 0x8550
+0x8FD9C4 0x8551
+0x8FD9C5 0x8552
+0x8FD9C6 0x8553
+0x8FD9C7 0x8556
+0x8FD9C8 0x8559
+0x8FD9C9 0x855C
+0x8FD9CA 0x855D
+0x8FD9CB 0x855E
+0x8FD9CC 0x855F
+0x8FD9CD 0x8560
+0x8FD9CE 0x8561
+0x8FD9CF 0x8562
+0x8FD9D0 0x8564
+0x8FD9D1 0x856B
+0x8FD9D2 0x856F
+0x8FD9D3 0x8579
+0x8FD9D4 0x857A
+0x8FD9D5 0x857B
+0x8FD9D6 0x857D
+0x8FD9D7 0x857F
+0x8FD9D8 0x8581
+0x8FD9D9 0x8585
+0x8FD9DA 0x8586
+0x8FD9DB 0x8589
+0x8FD9DC 0x858B
+0x8FD9DD 0x858C
+0x8FD9DE 0x858F
+0x8FD9DF 0x8593
+0x8FD9E0 0x8598
+0x8FD9E1 0x859D
+0x8FD9E2 0x859F
+0x8FD9E3 0x85A0
+0x8FD9E4 0x85A2
+0x8FD9E5 0x85A5
+0x8FD9E6 0x85A7
+0x8FD9E7 0x85B4
+0x8FD9E8 0x85B6
+0x8FD9E9 0x85B7
+0x8FD9EA 0x85B8
+0x8FD9EB 0x85BC
+0x8FD9EC 0x85BD
+0x8FD9ED 0x85BE
+0x8FD9EE 0x85BF
+0x8FD9EF 0x85C2
+0x8FD9F0 0x85C7
+0x8FD9F1 0x85CA
+0x8FD9F2 0x85CB
+0x8FD9F3 0x85CE
+0x8FD9F4 0x85AD
+0x8FD9F5 0x85D8
+0x8FD9F6 0x85DA
+0x8FD9F7 0x85DF
+0x8FD9F8 0x85E0
+0x8FD9F9 0x85E6
+0x8FD9FA 0x85E8
+0x8FD9FB 0x85ED
+0x8FD9FC 0x85F3
+0x8FD9FD 0x85F6
+0x8FD9FE 0x85FC
+0x8FDAA1 0x85FF
+0x8FDAA2 0x8600
+0x8FDAA3 0x8604
+0x8FDAA4 0x8605
+0x8FDAA5 0x860D
+0x8FDAA6 0x860E
+0x8FDAA7 0x8610
+0x8FDAA8 0x8611
+0x8FDAA9 0x8612
+0x8FDAAA 0x8618
+0x8FDAAB 0x8619
+0x8FDAAC 0x861B
+0x8FDAAD 0x861E
+0x8FDAAE 0x8621
+0x8FDAAF 0x8627
+0x8FDAB0 0x8629
+0x8FDAB1 0x8636
+0x8FDAB2 0x8638
+0x8FDAB3 0x863A
+0x8FDAB4 0x863C
+0x8FDAB5 0x863D
+0x8FDAB6 0x8640
+0x8FDAB7 0x8642
+0x8FDAB8 0x8646
+0x8FDAB9 0x8652
+0x8FDABA 0x8653
+0x8FDABB 0x8656
+0x8FDABC 0x8657
+0x8FDABD 0x8658
+0x8FDABE 0x8659
+0x8FDABF 0x865D
+0x8FDAC0 0x8660
+0x8FDAC1 0x8661
+0x8FDAC2 0x8662
+0x8FDAC3 0x8663
+0x8FDAC4 0x8664
+0x8FDAC5 0x8669
+0x8FDAC6 0x866C
+0x8FDAC7 0x866F
+0x8FDAC8 0x8675
+0x8FDAC9 0x8676
+0x8FDACA 0x8677
+0x8FDACB 0x867A
+0x8FDACC 0x868D
+0x8FDACD 0x8691
+0x8FDACE 0x8696
+0x8FDACF 0x8698
+0x8FDAD0 0x869A
+0x8FDAD1 0x869C
+0x8FDAD2 0x86A1
+0x8FDAD3 0x86A6
+0x8FDAD4 0x86A7
+0x8FDAD5 0x86A8
+0x8FDAD6 0x86AD
+0x8FDAD7 0x86B1
+0x8FDAD8 0x86B3
+0x8FDAD9 0x86B4
+0x8FDADA 0x86B5
+0x8FDADB 0x86B7
+0x8FDADC 0x86B8
+0x8FDADD 0x86B9
+0x8FDADE 0x86BF
+0x8FDADF 0x86C0
+0x8FDAE0 0x86C1
+0x8FDAE1 0x86C3
+0x8FDAE2 0x86C5
+0x8FDAE3 0x86D1
+0x8FDAE4 0x86D2
+0x8FDAE5 0x86D5
+0x8FDAE6 0x86D7
+0x8FDAE7 0x86DA
+0x8FDAE8 0x86DC
+0x8FDAE9 0x86E0
+0x8FDAEA 0x86E3
+0x8FDAEB 0x86E5
+0x8FDAEC 0x86E7
+0x8FDAED 0x8688
+0x8FDAEE 0x86FA
+0x8FDAEF 0x86FC
+0x8FDAF0 0x86FD
+0x8FDAF1 0x8704
+0x8FDAF2 0x8705
+0x8FDAF3 0x8707
+0x8FDAF4 0x870B
+0x8FDAF5 0x870E
+0x8FDAF6 0x870F
+0x8FDAF7 0x8710
+0x8FDAF8 0x8713
+0x8FDAF9 0x8714
+0x8FDAFA 0x8719
+0x8FDAFB 0x871E
+0x8FDAFC 0x871F
+0x8FDAFD 0x8721
+0x8FDAFE 0x8723
+0x8FDBA1 0x8728
+0x8FDBA2 0x872E
+0x8FDBA3 0x872F
+0x8FDBA4 0x8731
+0x8FDBA5 0x8732
+0x8FDBA6 0x8739
+0x8FDBA7 0x873A
+0x8FDBA8 0x873C
+0x8FDBA9 0x873D
+0x8FDBAA 0x873E
+0x8FDBAB 0x8740
+0x8FDBAC 0x8743
+0x8FDBAD 0x8745
+0x8FDBAE 0x874D
+0x8FDBAF 0x8758
+0x8FDBB0 0x875D
+0x8FDBB1 0x8761
+0x8FDBB2 0x8764
+0x8FDBB3 0x8765
+0x8FDBB4 0x876F
+0x8FDBB5 0x8771
+0x8FDBB6 0x8772
+0x8FDBB7 0x877B
+0x8FDBB8 0x8783
+0x8FDBB9 0x8784
+0x8FDBBA 0x8785
+0x8FDBBB 0x8786
+0x8FDBBC 0x8787
+0x8FDBBD 0x8788
+0x8FDBBE 0x8789
+0x8FDBBF 0x878B
+0x8FDBC0 0x878C
+0x8FDBC1 0x8790
+0x8FDBC2 0x8793
+0x8FDBC3 0x8795
+0x8FDBC4 0x8797
+0x8FDBC5 0x8798
+0x8FDBC6 0x8799
+0x8FDBC7 0x879E
+0x8FDBC8 0x87A0
+0x8FDBC9 0x87A3
+0x8FDBCA 0x87A7
+0x8FDBCB 0x87AC
+0x8FDBCC 0x87AD
+0x8FDBCD 0x87AE
+0x8FDBCE 0x87B1
+0x8FDBCF 0x87B5
+0x8FDBD0 0x87BE
+0x8FDBD1 0x87BF
+0x8FDBD2 0x87C1
+0x8FDBD3 0x87C8
+0x8FDBD4 0x87C9
+0x8FDBD5 0x87CA
+0x8FDBD6 0x87CE
+0x8FDBD7 0x87D5
+0x8FDBD8 0x87D6
+0x8FDBD9 0x87D9
+0x8FDBDA 0x87DA
+0x8FDBDB 0x87DC
+0x8FDBDC 0x87DF
+0x8FDBDD 0x87E2
+0x8FDBDE 0x87E3
+0x8FDBDF 0x87E4
+0x8FDBE0 0x87EA
+0x8FDBE1 0x87EB
+0x8FDBE2 0x87ED
+0x8FDBE3 0x87F1
+0x8FDBE4 0x87F3
+0x8FDBE5 0x87F8
+0x8FDBE6 0x87FA
+0x8FDBE7 0x87FF
+0x8FDBE8 0x8801
+0x8FDBE9 0x8803
+0x8FDBEA 0x8806
+0x8FDBEB 0x8809
+0x8FDBEC 0x880A
+0x8FDBED 0x880B
+0x8FDBEE 0x8810
+0x8FDBEF 0x8819
+0x8FDBF0 0x8812
+0x8FDBF1 0x8813
+0x8FDBF2 0x8814
+0x8FDBF3 0x8818
+0x8FDBF4 0x881A
+0x8FDBF5 0x881B
+0x8FDBF6 0x881C
+0x8FDBF7 0x881E
+0x8FDBF8 0x881F
+0x8FDBF9 0x8828
+0x8FDBFA 0x882D
+0x8FDBFB 0x882E
+0x8FDBFC 0x8830
+0x8FDBFD 0x8832
+0x8FDBFE 0x8835
+0x8FDCA1 0x883A
+0x8FDCA2 0x883C
+0x8FDCA3 0x8841
+0x8FDCA4 0x8843
+0x8FDCA5 0x8845
+0x8FDCA6 0x8848
+0x8FDCA7 0x8849
+0x8FDCA8 0x884A
+0x8FDCA9 0x884B
+0x8FDCAA 0x884E
+0x8FDCAB 0x8851
+0x8FDCAC 0x8855
+0x8FDCAD 0x8856
+0x8FDCAE 0x8858
+0x8FDCAF 0x885A
+0x8FDCB0 0x885C
+0x8FDCB1 0x885F
+0x8FDCB2 0x8860
+0x8FDCB3 0x8864
+0x8FDCB4 0x8869
+0x8FDCB5 0x8871
+0x8FDCB6 0x8879
+0x8FDCB7 0x887B
+0x8FDCB8 0x8880
+0x8FDCB9 0x8898
+0x8FDCBA 0x889A
+0x8FDCBB 0x889B
+0x8FDCBC 0x889C
+0x8FDCBD 0x889F
+0x8FDCBE 0x88A0
+0x8FDCBF 0x88A8
+0x8FDCC0 0x88AA
+0x8FDCC1 0x88BA
+0x8FDCC2 0x88BD
+0x8FDCC3 0x88BE
+0x8FDCC4 0x88C0
+0x8FDCC5 0x88CA
+0x8FDCC6 0x88CB
+0x8FDCC7 0x88CC
+0x8FDCC8 0x88CD
+0x8FDCC9 0x88CE
+0x8FDCCA 0x88D1
+0x8FDCCB 0x88D2
+0x8FDCCC 0x88D3
+0x8FDCCD 0x88DB
+0x8FDCCE 0x88DE
+0x8FDCCF 0x88E7
+0x8FDCD0 0x88EF
+0x8FDCD1 0x88F0
+0x8FDCD2 0x88F1
+0x8FDCD3 0x88F5
+0x8FDCD4 0x88F7
+0x8FDCD5 0x8901
+0x8FDCD6 0x8906
+0x8FDCD7 0x890D
+0x8FDCD8 0x890E
+0x8FDCD9 0x890F
+0x8FDCDA 0x8915
+0x8FDCDB 0x8916
+0x8FDCDC 0x8918
+0x8FDCDD 0x8919
+0x8FDCDE 0x891A
+0x8FDCDF 0x891C
+0x8FDCE0 0x8920
+0x8FDCE1 0x8926
+0x8FDCE2 0x8927
+0x8FDCE3 0x8928
+0x8FDCE4 0x8930
+0x8FDCE5 0x8931
+0x8FDCE6 0x8932
+0x8FDCE7 0x8935
+0x8FDCE8 0x8939
+0x8FDCE9 0x893A
+0x8FDCEA 0x893E
+0x8FDCEB 0x8940
+0x8FDCEC 0x8942
+0x8FDCED 0x8945
+0x8FDCEE 0x8946
+0x8FDCEF 0x8949
+0x8FDCF0 0x894F
+0x8FDCF1 0x8952
+0x8FDCF2 0x8957
+0x8FDCF3 0x895A
+0x8FDCF4 0x895B
+0x8FDCF5 0x895C
+0x8FDCF6 0x8961
+0x8FDCF7 0x8962
+0x8FDCF8 0x8963
+0x8FDCF9 0x896B
+0x8FDCFA 0x896E
+0x8FDCFB 0x8970
+0x8FDCFC 0x8973
+0x8FDCFD 0x8975
+0x8FDCFE 0x897A
+0x8FDDA1 0x897B
+0x8FDDA2 0x897C
+0x8FDDA3 0x897D
+0x8FDDA4 0x8989
+0x8FDDA5 0x898D
+0x8FDDA6 0x8990
+0x8FDDA7 0x8994
+0x8FDDA8 0x8995
+0x8FDDA9 0x899B
+0x8FDDAA 0x899C
+0x8FDDAB 0x899F
+0x8FDDAC 0x89A0
+0x8FDDAD 0x89A5
+0x8FDDAE 0x89B0
+0x8FDDAF 0x89B4
+0x8FDDB0 0x89B5
+0x8FDDB1 0x89B6
+0x8FDDB2 0x89B7
+0x8FDDB3 0x89BC
+0x8FDDB4 0x89D4
+0x8FDDB5 0x89D5
+0x8FDDB6 0x89D6
+0x8FDDB7 0x89D7
+0x8FDDB8 0x89D8
+0x8FDDB9 0x89E5
+0x8FDDBA 0x89E9
+0x8FDDBB 0x89EB
+0x8FDDBC 0x89ED
+0x8FDDBD 0x89F1
+0x8FDDBE 0x89F3
+0x8FDDBF 0x89F6
+0x8FDDC0 0x89F9
+0x8FDDC1 0x89FD
+0x8FDDC2 0x89FF
+0x8FDDC3 0x8A04
+0x8FDDC4 0x8A05
+0x8FDDC5 0x8A07
+0x8FDDC6 0x8A0F
+0x8FDDC7 0x8A11
+0x8FDDC8 0x8A12
+0x8FDDC9 0x8A14
+0x8FDDCA 0x8A15
+0x8FDDCB 0x8A1E
+0x8FDDCC 0x8A20
+0x8FDDCD 0x8A22
+0x8FDDCE 0x8A24
+0x8FDDCF 0x8A26
+0x8FDDD0 0x8A2B
+0x8FDDD1 0x8A2C
+0x8FDDD2 0x8A2F
+0x8FDDD3 0x8A35
+0x8FDDD4 0x8A37
+0x8FDDD5 0x8A3D
+0x8FDDD6 0x8A3E
+0x8FDDD7 0x8A40
+0x8FDDD8 0x8A43
+0x8FDDD9 0x8A45
+0x8FDDDA 0x8A47
+0x8FDDDB 0x8A49
+0x8FDDDC 0x8A4D
+0x8FDDDD 0x8A4E
+0x8FDDDE 0x8A53
+0x8FDDDF 0x8A56
+0x8FDDE0 0x8A57
+0x8FDDE1 0x8A58
+0x8FDDE2 0x8A5C
+0x8FDDE3 0x8A5D
+0x8FDDE4 0x8A61
+0x8FDDE5 0x8A65
+0x8FDDE6 0x8A67
+0x8FDDE7 0x8A75
+0x8FDDE8 0x8A76
+0x8FDDE9 0x8A77
+0x8FDDEA 0x8A79
+0x8FDDEB 0x8A7A
+0x8FDDEC 0x8A7B
+0x8FDDED 0x8A7E
+0x8FDDEE 0x8A7F
+0x8FDDEF 0x8A80
+0x8FDDF0 0x8A83
+0x8FDDF1 0x8A86
+0x8FDDF2 0x8A8B
+0x8FDDF3 0x8A8F
+0x8FDDF4 0x8A90
+0x8FDDF5 0x8A92
+0x8FDDF6 0x8A96
+0x8FDDF7 0x8A97
+0x8FDDF8 0x8A99
+0x8FDDF9 0x8A9F
+0x8FDDFA 0x8AA7
+0x8FDDFB 0x8AA9
+0x8FDDFC 0x8AAE
+0x8FDDFD 0x8AAF
+0x8FDDFE 0x8AB3
+0x8FDEA1 0x8AB6
+0x8FDEA2 0x8AB7
+0x8FDEA3 0x8ABB
+0x8FDEA4 0x8ABE
+0x8FDEA5 0x8AC3
+0x8FDEA6 0x8AC6
+0x8FDEA7 0x8AC8
+0x8FDEA8 0x8AC9
+0x8FDEA9 0x8ACA
+0x8FDEAA 0x8AD1
+0x8FDEAB 0x8AD3
+0x8FDEAC 0x8AD4
+0x8FDEAD 0x8AD5
+0x8FDEAE 0x8AD7
+0x8FDEAF 0x8ADD
+0x8FDEB0 0x8ADF
+0x8FDEB1 0x8AEC
+0x8FDEB2 0x8AF0
+0x8FDEB3 0x8AF4
+0x8FDEB4 0x8AF5
+0x8FDEB5 0x8AF6
+0x8FDEB6 0x8AFC
+0x8FDEB7 0x8AFF
+0x8FDEB8 0x8B05
+0x8FDEB9 0x8B06
+0x8FDEBA 0x8B0B
+0x8FDEBB 0x8B11
+0x8FDEBC 0x8B1C
+0x8FDEBD 0x8B1E
+0x8FDEBE 0x8B1F
+0x8FDEBF 0x8B0A
+0x8FDEC0 0x8B2D
+0x8FDEC1 0x8B30
+0x8FDEC2 0x8B37
+0x8FDEC3 0x8B3C
+0x8FDEC4 0x8B42
+0x8FDEC5 0x8B43
+0x8FDEC6 0x8B44
+0x8FDEC7 0x8B45
+0x8FDEC8 0x8B46
+0x8FDEC9 0x8B48
+0x8FDECA 0x8B52
+0x8FDECB 0x8B53
+0x8FDECC 0x8B54
+0x8FDECD 0x8B59
+0x8FDECE 0x8B4D
+0x8FDECF 0x8B5E
+0x8FDED0 0x8B63
+0x8FDED1 0x8B6D
+0x8FDED2 0x8B76
+0x8FDED3 0x8B78
+0x8FDED4 0x8B79
+0x8FDED5 0x8B7C
+0x8FDED6 0x8B7E
+0x8FDED7 0x8B81
+0x8FDED8 0x8B84
+0x8FDED9 0x8B85
+0x8FDEDA 0x8B8B
+0x8FDEDB 0x8B8D
+0x8FDEDC 0x8B8F
+0x8FDEDD 0x8B94
+0x8FDEDE 0x8B95
+0x8FDEDF 0x8B9C
+0x8FDEE0 0x8B9E
+0x8FDEE1 0x8B9F
+0x8FDEE2 0x8C38
+0x8FDEE3 0x8C39
+0x8FDEE4 0x8C3D
+0x8FDEE5 0x8C3E
+0x8FDEE6 0x8C45
+0x8FDEE7 0x8C47
+0x8FDEE8 0x8C49
+0x8FDEE9 0x8C4B
+0x8FDEEA 0x8C4F
+0x8FDEEB 0x8C51
+0x8FDEEC 0x8C53
+0x8FDEED 0x8C54
+0x8FDEEE 0x8C57
+0x8FDEEF 0x8C58
+0x8FDEF0 0x8C5B
+0x8FDEF1 0x8C5D
+0x8FDEF2 0x8C59
+0x8FDEF3 0x8C63
+0x8FDEF4 0x8C64
+0x8FDEF5 0x8C66
+0x8FDEF6 0x8C68
+0x8FDEF7 0x8C69
+0x8FDEF8 0x8C6D
+0x8FDEF9 0x8C73
+0x8FDEFA 0x8C75
+0x8FDEFB 0x8C76
+0x8FDEFC 0x8C7B
+0x8FDEFD 0x8C7E
+0x8FDEFE 0x8C86
+0x8FDFA1 0x8C87
+0x8FDFA2 0x8C8B
+0x8FDFA3 0x8C90
+0x8FDFA4 0x8C92
+0x8FDFA5 0x8C93
+0x8FDFA6 0x8C99
+0x8FDFA7 0x8C9B
+0x8FDFA8 0x8C9C
+0x8FDFA9 0x8CA4
+0x8FDFAA 0x8CB9
+0x8FDFAB 0x8CBA
+0x8FDFAC 0x8CC5
+0x8FDFAD 0x8CC6
+0x8FDFAE 0x8CC9
+0x8FDFAF 0x8CCB
+0x8FDFB0 0x8CCF
+0x8FDFB1 0x8CD6
+0x8FDFB2 0x8CD5
+0x8FDFB3 0x8CD9
+0x8FDFB4 0x8CDD
+0x8FDFB5 0x8CE1
+0x8FDFB6 0x8CE8
+0x8FDFB7 0x8CEC
+0x8FDFB8 0x8CEF
+0x8FDFB9 0x8CF0
+0x8FDFBA 0x8CF2
+0x8FDFBB 0x8CF5
+0x8FDFBC 0x8CF7
+0x8FDFBD 0x8CF8
+0x8FDFBE 0x8CFE
+0x8FDFBF 0x8CFF
+0x8FDFC0 0x8D01
+0x8FDFC1 0x8D03
+0x8FDFC2 0x8D09
+0x8FDFC3 0x8D12
+0x8FDFC4 0x8D17
+0x8FDFC5 0x8D1B
+0x8FDFC6 0x8D65
+0x8FDFC7 0x8D69
+0x8FDFC8 0x8D6C
+0x8FDFC9 0x8D6E
+0x8FDFCA 0x8D7F
+0x8FDFCB 0x8D82
+0x8FDFCC 0x8D84
+0x8FDFCD 0x8D88
+0x8FDFCE 0x8D8D
+0x8FDFCF 0x8D90
+0x8FDFD0 0x8D91
+0x8FDFD1 0x8D95
+0x8FDFD2 0x8D9E
+0x8FDFD3 0x8D9F
+0x8FDFD4 0x8DA0
+0x8FDFD5 0x8DA6
+0x8FDFD6 0x8DAB
+0x8FDFD7 0x8DAC
+0x8FDFD8 0x8DAF
+0x8FDFD9 0x8DB2
+0x8FDFDA 0x8DB5
+0x8FDFDB 0x8DB7
+0x8FDFDC 0x8DB9
+0x8FDFDD 0x8DBB
+0x8FDFDE 0x8DC0
+0x8FDFDF 0x8DC5
+0x8FDFE0 0x8DC6
+0x8FDFE1 0x8DC7
+0x8FDFE2 0x8DC8
+0x8FDFE3 0x8DCA
+0x8FDFE4 0x8DCE
+0x8FDFE5 0x8DD1
+0x8FDFE6 0x8DD4
+0x8FDFE7 0x8DD5
+0x8FDFE8 0x8DD7
+0x8FDFE9 0x8DD9
+0x8FDFEA 0x8DE4
+0x8FDFEB 0x8DE5
+0x8FDFEC 0x8DE7
+0x8FDFED 0x8DEC
+0x8FDFEE 0x8DF0
+0x8FDFEF 0x8DBC
+0x8FDFF0 0x8DF1
+0x8FDFF1 0x8DF2
+0x8FDFF2 0x8DF4
+0x8FDFF3 0x8DFD
+0x8FDFF4 0x8E01
+0x8FDFF5 0x8E04
+0x8FDFF6 0x8E05
+0x8FDFF7 0x8E06
+0x8FDFF8 0x8E0B
+0x8FDFF9 0x8E11
+0x8FDFFA 0x8E14
+0x8FDFFB 0x8E16
+0x8FDFFC 0x8E20
+0x8FDFFD 0x8E21
+0x8FDFFE 0x8E22
+0x8FE0A1 0x8E23
+0x8FE0A2 0x8E26
+0x8FE0A3 0x8E27
+0x8FE0A4 0x8E31
+0x8FE0A5 0x8E33
+0x8FE0A6 0x8E36
+0x8FE0A7 0x8E37
+0x8FE0A8 0x8E38
+0x8FE0A9 0x8E39
+0x8FE0AA 0x8E3D
+0x8FE0AB 0x8E40
+0x8FE0AC 0x8E41
+0x8FE0AD 0x8E4B
+0x8FE0AE 0x8E4D
+0x8FE0AF 0x8E4E
+0x8FE0B0 0x8E4F
+0x8FE0B1 0x8E54
+0x8FE0B2 0x8E5B
+0x8FE0B3 0x8E5C
+0x8FE0B4 0x8E5D
+0x8FE0B5 0x8E5E
+0x8FE0B6 0x8E61
+0x8FE0B7 0x8E62
+0x8FE0B8 0x8E69
+0x8FE0B9 0x8E6C
+0x8FE0BA 0x8E6D
+0x8FE0BB 0x8E6F
+0x8FE0BC 0x8E70
+0x8FE0BD 0x8E71
+0x8FE0BE 0x8E79
+0x8FE0BF 0x8E7A
+0x8FE0C0 0x8E7B
+0x8FE0C1 0x8E82
+0x8FE0C2 0x8E83
+0x8FE0C3 0x8E89
+0x8FE0C4 0x8E90
+0x8FE0C5 0x8E92
+0x8FE0C6 0x8E95
+0x8FE0C7 0x8E9A
+0x8FE0C8 0x8E9B
+0x8FE0C9 0x8E9D
+0x8FE0CA 0x8E9E
+0x8FE0CB 0x8EA2
+0x8FE0CC 0x8EA7
+0x8FE0CD 0x8EA9
+0x8FE0CE 0x8EAD
+0x8FE0CF 0x8EAE
+0x8FE0D0 0x8EB3
+0x8FE0D1 0x8EB5
+0x8FE0D2 0x8EBA
+0x8FE0D3 0x8EBB
+0x8FE0D4 0x8EC0
+0x8FE0D5 0x8EC1
+0x8FE0D6 0x8EC3
+0x8FE0D7 0x8EC4
+0x8FE0D8 0x8EC7
+0x8FE0D9 0x8ECF
+0x8FE0DA 0x8ED1
+0x8FE0DB 0x8ED4
+0x8FE0DC 0x8EDC
+0x8FE0DD 0x8EE8
+0x8FE0DE 0x8EEE
+0x8FE0DF 0x8EF0
+0x8FE0E0 0x8EF1
+0x8FE0E1 0x8EF7
+0x8FE0E2 0x8EF9
+0x8FE0E3 0x8EFA
+0x8FE0E4 0x8EED
+0x8FE0E5 0x8F00
+0x8FE0E6 0x8F02
+0x8FE0E7 0x8F07
+0x8FE0E8 0x8F08
+0x8FE0E9 0x8F0F
+0x8FE0EA 0x8F10
+0x8FE0EB 0x8F16
+0x8FE0EC 0x8F17
+0x8FE0ED 0x8F18
+0x8FE0EE 0x8F1E
+0x8FE0EF 0x8F20
+0x8FE0F0 0x8F21
+0x8FE0F1 0x8F23
+0x8FE0F2 0x8F25
+0x8FE0F3 0x8F27
+0x8FE0F4 0x8F28
+0x8FE0F5 0x8F2C
+0x8FE0F6 0x8F2D
+0x8FE0F7 0x8F2E
+0x8FE0F8 0x8F34
+0x8FE0F9 0x8F35
+0x8FE0FA 0x8F36
+0x8FE0FB 0x8F37
+0x8FE0FC 0x8F3A
+0x8FE0FD 0x8F40
+0x8FE0FE 0x8F41
+0x8FE1A1 0x8F43
+0x8FE1A2 0x8F47
+0x8FE1A3 0x8F4F
+0x8FE1A4 0x8F51
+0x8FE1A5 0x8F52
+0x8FE1A6 0x8F53
+0x8FE1A7 0x8F54
+0x8FE1A8 0x8F55
+0x8FE1A9 0x8F58
+0x8FE1AA 0x8F5D
+0x8FE1AB 0x8F5E
+0x8FE1AC 0x8F65
+0x8FE1AD 0x8F9D
+0x8FE1AE 0x8FA0
+0x8FE1AF 0x8FA1
+0x8FE1B0 0x8FA4
+0x8FE1B1 0x8FA5
+0x8FE1B2 0x8FA6
+0x8FE1B3 0x8FB5
+0x8FE1B4 0x8FB6
+0x8FE1B5 0x8FB8
+0x8FE1B6 0x8FBE
+0x8FE1B7 0x8FC0
+0x8FE1B8 0x8FC1
+0x8FE1B9 0x8FC6
+0x8FE1BA 0x8FCA
+0x8FE1BB 0x8FCB
+0x8FE1BC 0x8FCD
+0x8FE1BD 0x8FD0
+0x8FE1BE 0x8FD2
+0x8FE1BF 0x8FD3
+0x8FE1C0 0x8FD5
+0x8FE1C1 0x8FE0
+0x8FE1C2 0x8FE3
+0x8FE1C3 0x8FE4
+0x8FE1C4 0x8FE8
+0x8FE1C5 0x8FEE
+0x8FE1C6 0x8FF1
+0x8FE1C7 0x8FF5
+0x8FE1C8 0x8FF6
+0x8FE1C9 0x8FFB
+0x8FE1CA 0x8FFE
+0x8FE1CB 0x9002
+0x8FE1CC 0x9004
+0x8FE1CD 0x9008
+0x8FE1CE 0x900C
+0x8FE1CF 0x9018
+0x8FE1D0 0x901B
+0x8FE1D1 0x9028
+0x8FE1D2 0x9029
+0x8FE1D3 0x902F
+0x8FE1D4 0x902A
+0x8FE1D5 0x902C
+0x8FE1D6 0x902D
+0x8FE1D7 0x9033
+0x8FE1D8 0x9034
+0x8FE1D9 0x9037
+0x8FE1DA 0x903F
+0x8FE1DB 0x9043
+0x8FE1DC 0x9044
+0x8FE1DD 0x904C
+0x8FE1DE 0x905B
+0x8FE1DF 0x905D
+0x8FE1E0 0x9062
+0x8FE1E1 0x9066
+0x8FE1E2 0x9067
+0x8FE1E3 0x906C
+0x8FE1E4 0x9070
+0x8FE1E5 0x9074
+0x8FE1E6 0x9079
+0x8FE1E7 0x9085
+0x8FE1E8 0x9088
+0x8FE1E9 0x908B
+0x8FE1EA 0x908C
+0x8FE1EB 0x908E
+0x8FE1EC 0x9090
+0x8FE1ED 0x9095
+0x8FE1EE 0x9097
+0x8FE1EF 0x9098
+0x8FE1F0 0x9099
+0x8FE1F1 0x909B
+0x8FE1F2 0x90A0
+0x8FE1F3 0x90A1
+0x8FE1F4 0x90A2
+0x8FE1F5 0x90A5
+0x8FE1F6 0x90B0
+0x8FE1F7 0x90B2
+0x8FE1F8 0x90B3
+0x8FE1F9 0x90B4
+0x8FE1FA 0x90B6
+0x8FE1FB 0x90BD
+0x8FE1FC 0x90CC
+0x8FE1FD 0x90BE
+0x8FE1FE 0x90C3
+0x8FE2A1 0x90C4
+0x8FE2A2 0x90C5
+0x8FE2A3 0x90C7
+0x8FE2A4 0x90C8
+0x8FE2A5 0x90D5
+0x8FE2A6 0x90D7
+0x8FE2A7 0x90D8
+0x8FE2A8 0x90D9
+0x8FE2A9 0x90DC
+0x8FE2AA 0x90DD
+0x8FE2AB 0x90DF
+0x8FE2AC 0x90E5
+0x8FE2AD 0x90D2
+0x8FE2AE 0x90F6
+0x8FE2AF 0x90EB
+0x8FE2B0 0x90EF
+0x8FE2B1 0x90F0
+0x8FE2B2 0x90F4
+0x8FE2B3 0x90FE
+0x8FE2B4 0x90FF
+0x8FE2B5 0x9100
+0x8FE2B6 0x9104
+0x8FE2B7 0x9105
+0x8FE2B8 0x9106
+0x8FE2B9 0x9108
+0x8FE2BA 0x910D
+0x8FE2BB 0x9110
+0x8FE2BC 0x9114
+0x8FE2BD 0x9116
+0x8FE2BE 0x9117
+0x8FE2BF 0x9118
+0x8FE2C0 0x911A
+0x8FE2C1 0x911C
+0x8FE2C2 0x911E
+0x8FE2C3 0x9120
+0x8FE2C4 0x9125
+0x8FE2C5 0x9122
+0x8FE2C6 0x9123
+0x8FE2C7 0x9127
+0x8FE2C8 0x9129
+0x8FE2C9 0x912E
+0x8FE2CA 0x912F
+0x8FE2CB 0x9131
+0x8FE2CC 0x9134
+0x8FE2CD 0x9136
+0x8FE2CE 0x9137
+0x8FE2CF 0x9139
+0x8FE2D0 0x913A
+0x8FE2D1 0x913C
+0x8FE2D2 0x913D
+0x8FE2D3 0x9143
+0x8FE2D4 0x9147
+0x8FE2D5 0x9148
+0x8FE2D6 0x914F
+0x8FE2D7 0x9153
+0x8FE2D8 0x9157
+0x8FE2D9 0x9159
+0x8FE2DA 0x915A
+0x8FE2DB 0x915B
+0x8FE2DC 0x9161
+0x8FE2DD 0x9164
+0x8FE2DE 0x9167
+0x8FE2DF 0x916D
+0x8FE2E0 0x9174
+0x8FE2E1 0x9179
+0x8FE2E2 0x917A
+0x8FE2E3 0x917B
+0x8FE2E4 0x9181
+0x8FE2E5 0x9183
+0x8FE2E6 0x9185
+0x8FE2E7 0x9186
+0x8FE2E8 0x918A
+0x8FE2E9 0x918E
+0x8FE2EA 0x9191
+0x8FE2EB 0x9193
+0x8FE2EC 0x9194
+0x8FE2ED 0x9195
+0x8FE2EE 0x9198
+0x8FE2EF 0x919E
+0x8FE2F0 0x91A1
+0x8FE2F1 0x91A6
+0x8FE2F2 0x91A8
+0x8FE2F3 0x91AC
+0x8FE2F4 0x91AD
+0x8FE2F5 0x91AE
+0x8FE2F6 0x91B0
+0x8FE2F7 0x91B1
+0x8FE2F8 0x91B2
+0x8FE2F9 0x91B3
+0x8FE2FA 0x91B6
+0x8FE2FB 0x91BB
+0x8FE2FC 0x91BC
+0x8FE2FD 0x91BD
+0x8FE2FE 0x91BF
+0x8FE3A1 0x91C2
+0x8FE3A2 0x91C3
+0x8FE3A3 0x91C5
+0x8FE3A4 0x91D3
+0x8FE3A5 0x91D4
+0x8FE3A6 0x91D7
+0x8FE3A7 0x91D9
+0x8FE3A8 0x91DA
+0x8FE3A9 0x91DE
+0x8FE3AA 0x91E4
+0x8FE3AB 0x91E5
+0x8FE3AC 0x91E9
+0x8FE3AD 0x91EA
+0x8FE3AE 0x91EC
+0x8FE3AF 0x91ED
+0x8FE3B0 0x91EE
+0x8FE3B1 0x91EF
+0x8FE3B2 0x91F0
+0x8FE3B3 0x91F1
+0x8FE3B4 0x91F7
+0x8FE3B5 0x91F9
+0x8FE3B6 0x91FB
+0x8FE3B7 0x91FD
+0x8FE3B8 0x9200
+0x8FE3B9 0x9201
+0x8FE3BA 0x9204
+0x8FE3BB 0x9205
+0x8FE3BC 0x9206
+0x8FE3BD 0x9207
+0x8FE3BE 0x9209
+0x8FE3BF 0x920A
+0x8FE3C0 0x920C
+0x8FE3C1 0x9210
+0x8FE3C2 0x9212
+0x8FE3C3 0x9213
+0x8FE3C4 0x9216
+0x8FE3C5 0x9218
+0x8FE3C6 0x921C
+0x8FE3C7 0x921D
+0x8FE3C8 0x9223
+0x8FE3C9 0x9224
+0x8FE3CA 0x9225
+0x8FE3CB 0x9226
+0x8FE3CC 0x9228
+0x8FE3CD 0x922E
+0x8FE3CE 0x922F
+0x8FE3CF 0x9230
+0x8FE3D0 0x9233
+0x8FE3D1 0x9235
+0x8FE3D2 0x9236
+0x8FE3D3 0x9238
+0x8FE3D4 0x9239
+0x8FE3D5 0x923A
+0x8FE3D6 0x923C
+0x8FE3D7 0x923E
+0x8FE3D8 0x9240
+0x8FE3D9 0x9242
+0x8FE3DA 0x9243
+0x8FE3DB 0x9246
+0x8FE3DC 0x9247
+0x8FE3DD 0x924A
+0x8FE3DE 0x924D
+0x8FE3DF 0x924E
+0x8FE3E0 0x924F
+0x8FE3E1 0x9251
+0x8FE3E2 0x9258
+0x8FE3E3 0x9259
+0x8FE3E4 0x925C
+0x8FE3E5 0x925D
+0x8FE3E6 0x9260
+0x8FE3E7 0x9261
+0x8FE3E8 0x9265
+0x8FE3E9 0x9267
+0x8FE3EA 0x9268
+0x8FE3EB 0x9269
+0x8FE3EC 0x926E
+0x8FE3ED 0x926F
+0x8FE3EE 0x9270
+0x8FE3EF 0x9275
+0x8FE3F0 0x9276
+0x8FE3F1 0x9277
+0x8FE3F2 0x9278
+0x8FE3F3 0x9279
+0x8FE3F4 0x927B
+0x8FE3F5 0x927C
+0x8FE3F6 0x927D
+0x8FE3F7 0x927F
+0x8FE3F8 0x9288
+0x8FE3F9 0x9289
+0x8FE3FA 0x928A
+0x8FE3FB 0x928D
+0x8FE3FC 0x928E
+0x8FE3FD 0x9292
+0x8FE3FE 0x9297
+0x8FE4A1 0x9299
+0x8FE4A2 0x929F
+0x8FE4A3 0x92A0
+0x8FE4A4 0x92A4
+0x8FE4A5 0x92A5
+0x8FE4A6 0x92A7
+0x8FE4A7 0x92A8
+0x8FE4A8 0x92AB
+0x8FE4A9 0x92AF
+0x8FE4AA 0x92B2
+0x8FE4AB 0x92B6
+0x8FE4AC 0x92B8
+0x8FE4AD 0x92BA
+0x8FE4AE 0x92BB
+0x8FE4AF 0x92BC
+0x8FE4B0 0x92BD
+0x8FE4B1 0x92BF
+0x8FE4B2 0x92C0
+0x8FE4B3 0x92C1
+0x8FE4B4 0x92C2
+0x8FE4B5 0x92C3
+0x8FE4B6 0x92C5
+0x8FE4B7 0x92C6
+0x8FE4B8 0x92C7
+0x8FE4B9 0x92C8
+0x8FE4BA 0x92CB
+0x8FE4BB 0x92CC
+0x8FE4BC 0x92CD
+0x8FE4BD 0x92CE
+0x8FE4BE 0x92D0
+0x8FE4BF 0x92D3
+0x8FE4C0 0x92D5
+0x8FE4C1 0x92D7
+0x8FE4C2 0x92D8
+0x8FE4C3 0x92D9
+0x8FE4C4 0x92DC
+0x8FE4C5 0x92DD
+0x8FE4C6 0x92DF
+0x8FE4C7 0x92E0
+0x8FE4C8 0x92E1
+0x8FE4C9 0x92E3
+0x8FE4CA 0x92E5
+0x8FE4CB 0x92E7
+0x8FE4CC 0x92E8
+0x8FE4CD 0x92EC
+0x8FE4CE 0x92EE
+0x8FE4CF 0x92F0
+0x8FE4D0 0x92F9
+0x8FE4D1 0x92FB
+0x8FE4D2 0x92FF
+0x8FE4D3 0x9300
+0x8FE4D4 0x9302
+0x8FE4D5 0x9308
+0x8FE4D6 0x930D
+0x8FE4D7 0x9311
+0x8FE4D8 0x9314
+0x8FE4D9 0x9315
+0x8FE4DA 0x931C
+0x8FE4DB 0x931D
+0x8FE4DC 0x931E
+0x8FE4DD 0x931F
+0x8FE4DE 0x9321
+0x8FE4DF 0x9324
+0x8FE4E0 0x9325
+0x8FE4E1 0x9327
+0x8FE4E2 0x9329
+0x8FE4E3 0x932A
+0x8FE4E4 0x9333
+0x8FE4E5 0x9334
+0x8FE4E6 0x9336
+0x8FE4E7 0x9337
+0x8FE4E8 0x9347
+0x8FE4E9 0x9348
+0x8FE4EA 0x9349
+0x8FE4EB 0x9350
+0x8FE4EC 0x9351
+0x8FE4ED 0x9352
+0x8FE4EE 0x9355
+0x8FE4EF 0x9357
+0x8FE4F0 0x9358
+0x8FE4F1 0x935A
+0x8FE4F2 0x935E
+0x8FE4F3 0x9364
+0x8FE4F4 0x9365
+0x8FE4F5 0x9367
+0x8FE4F6 0x9369
+0x8FE4F7 0x936A
+0x8FE4F8 0x936D
+0x8FE4F9 0x936F
+0x8FE4FA 0x9370
+0x8FE4FB 0x9371
+0x8FE4FC 0x9373
+0x8FE4FD 0x9374
+0x8FE4FE 0x9376
+0x8FE5A1 0x937A
+0x8FE5A2 0x937D
+0x8FE5A3 0x937F
+0x8FE5A4 0x9380
+0x8FE5A5 0x9381
+0x8FE5A6 0x9382
+0x8FE5A7 0x9388
+0x8FE5A8 0x938A
+0x8FE5A9 0x938B
+0x8FE5AA 0x938D
+0x8FE5AB 0x938F
+0x8FE5AC 0x9392
+0x8FE5AD 0x9395
+0x8FE5AE 0x9398
+0x8FE5AF 0x939B
+0x8FE5B0 0x939E
+0x8FE5B1 0x93A1
+0x8FE5B2 0x93A3
+0x8FE5B3 0x93A4
+0x8FE5B4 0x93A6
+0x8FE5B5 0x93A8
+0x8FE5B6 0x93AB
+0x8FE5B7 0x93B4
+0x8FE5B8 0x93B5
+0x8FE5B9 0x93B6
+0x8FE5BA 0x93BA
+0x8FE5BB 0x93A9
+0x8FE5BC 0x93C1
+0x8FE5BD 0x93C4
+0x8FE5BE 0x93C5
+0x8FE5BF 0x93C6
+0x8FE5C0 0x93C7
+0x8FE5C1 0x93C9
+0x8FE5C2 0x93CA
+0x8FE5C3 0x93CB
+0x8FE5C4 0x93CC
+0x8FE5C5 0x93CD
+0x8FE5C6 0x93D3
+0x8FE5C7 0x93D9
+0x8FE5C8 0x93DC
+0x8FE5C9 0x93DE
+0x8FE5CA 0x93DF
+0x8FE5CB 0x93E2
+0x8FE5CC 0x93E6
+0x8FE5CD 0x93E7
+0x8FE5CE 0x93F9
+0x8FE5CF 0x93F7
+0x8FE5D0 0x93F8
+0x8FE5D1 0x93FA
+0x8FE5D2 0x93FB
+0x8FE5D3 0x93FD
+0x8FE5D4 0x9401
+0x8FE5D5 0x9402
+0x8FE5D6 0x9404
+0x8FE5D7 0x9408
+0x8FE5D8 0x9409
+0x8FE5D9 0x940D
+0x8FE5DA 0x940E
+0x8FE5DB 0x940F
+0x8FE5DC 0x9415
+0x8FE5DD 0x9416
+0x8FE5DE 0x9417
+0x8FE5DF 0x941F
+0x8FE5E0 0x942E
+0x8FE5E1 0x942F
+0x8FE5E2 0x9431
+0x8FE5E3 0x9432
+0x8FE5E4 0x9433
+0x8FE5E5 0x9434
+0x8FE5E6 0x943B
+0x8FE5E7 0x943F
+0x8FE5E8 0x943D
+0x8FE5E9 0x9443
+0x8FE5EA 0x9445
+0x8FE5EB 0x9448
+0x8FE5EC 0x944A
+0x8FE5ED 0x944C
+0x8FE5EE 0x9455
+0x8FE5EF 0x9459
+0x8FE5F0 0x945C
+0x8FE5F1 0x945F
+0x8FE5F2 0x9461
+0x8FE5F3 0x9463
+0x8FE5F4 0x9468
+0x8FE5F5 0x946B
+0x8FE5F6 0x946D
+0x8FE5F7 0x946E
+0x8FE5F8 0x946F
+0x8FE5F9 0x9471
+0x8FE5FA 0x9472
+0x8FE5FB 0x9484
+0x8FE5FC 0x9483
+0x8FE5FD 0x9578
+0x8FE5FE 0x9579
+0x8FE6A1 0x957E
+0x8FE6A2 0x9584
+0x8FE6A3 0x9588
+0x8FE6A4 0x958C
+0x8FE6A5 0x958D
+0x8FE6A6 0x958E
+0x8FE6A7 0x959D
+0x8FE6A8 0x959E
+0x8FE6A9 0x959F
+0x8FE6AA 0x95A1
+0x8FE6AB 0x95A6
+0x8FE6AC 0x95A9
+0x8FE6AD 0x95AB
+0x8FE6AE 0x95AC
+0x8FE6AF 0x95B4
+0x8FE6B0 0x95B6
+0x8FE6B1 0x95BA
+0x8FE6B2 0x95BD
+0x8FE6B3 0x95BF
+0x8FE6B4 0x95C6
+0x8FE6B5 0x95C8
+0x8FE6B6 0x95C9
+0x8FE6B7 0x95CB
+0x8FE6B8 0x95D0
+0x8FE6B9 0x95D1
+0x8FE6BA 0x95D2
+0x8FE6BB 0x95D3
+0x8FE6BC 0x95D9
+0x8FE6BD 0x95DA
+0x8FE6BE 0x95DD
+0x8FE6BF 0x95DE
+0x8FE6C0 0x95DF
+0x8FE6C1 0x95E0
+0x8FE6C2 0x95E4
+0x8FE6C3 0x95E6
+0x8FE6C4 0x961D
+0x8FE6C5 0x961E
+0x8FE6C6 0x9622
+0x8FE6C7 0x9624
+0x8FE6C8 0x9625
+0x8FE6C9 0x9626
+0x8FE6CA 0x962C
+0x8FE6CB 0x9631
+0x8FE6CC 0x9633
+0x8FE6CD 0x9637
+0x8FE6CE 0x9638
+0x8FE6CF 0x9639
+0x8FE6D0 0x963A
+0x8FE6D1 0x963C
+0x8FE6D2 0x963D
+0x8FE6D3 0x9641
+0x8FE6D4 0x9652
+0x8FE6D5 0x9654
+0x8FE6D6 0x9656
+0x8FE6D7 0x9657
+0x8FE6D8 0x9658
+0x8FE6D9 0x9661
+0x8FE6DA 0x966E
+0x8FE6DB 0x9674
+0x8FE6DC 0x967B
+0x8FE6DD 0x967C
+0x8FE6DE 0x967E
+0x8FE6DF 0x967F
+0x8FE6E0 0x9681
+0x8FE6E1 0x9682
+0x8FE6E2 0x9683
+0x8FE6E3 0x9684
+0x8FE6E4 0x9689
+0x8FE6E5 0x9691
+0x8FE6E6 0x9696
+0x8FE6E7 0x969A
+0x8FE6E8 0x969D
+0x8FE6E9 0x969F
+0x8FE6EA 0x96A4
+0x8FE6EB 0x96A5
+0x8FE6EC 0x96A6
+0x8FE6ED 0x96A9
+0x8FE6EE 0x96AE
+0x8FE6EF 0x96AF
+0x8FE6F0 0x96B3
+0x8FE6F1 0x96BA
+0x8FE6F2 0x96CA
+0x8FE6F3 0x96D2
+0x8FE6F4 0x5DB2
+0x8FE6F5 0x96D8
+0x8FE6F6 0x96DA
+0x8FE6F7 0x96DD
+0x8FE6F8 0x96DE
+0x8FE6F9 0x96DF
+0x8FE6FA 0x96E9
+0x8FE6FB 0x96EF
+0x8FE6FC 0x96F1
+0x8FE6FD 0x96FA
+0x8FE6FE 0x9702
+0x8FE7A1 0x9703
+0x8FE7A2 0x9705
+0x8FE7A3 0x9709
+0x8FE7A4 0x971A
+0x8FE7A5 0x971B
+0x8FE7A6 0x971D
+0x8FE7A7 0x9721
+0x8FE7A8 0x9722
+0x8FE7A9 0x9723
+0x8FE7AA 0x9728
+0x8FE7AB 0x9731
+0x8FE7AC 0x9733
+0x8FE7AD 0x9741
+0x8FE7AE 0x9743
+0x8FE7AF 0x974A
+0x8FE7B0 0x974E
+0x8FE7B1 0x974F
+0x8FE7B2 0x9755
+0x8FE7B3 0x9757
+0x8FE7B4 0x9758
+0x8FE7B5 0x975A
+0x8FE7B6 0x975B
+0x8FE7B7 0x9763
+0x8FE7B8 0x9767
+0x8FE7B9 0x976A
+0x8FE7BA 0x976E
+0x8FE7BB 0x9773
+0x8FE7BC 0x9776
+0x8FE7BD 0x9777
+0x8FE7BE 0x9778
+0x8FE7BF 0x977B
+0x8FE7C0 0x977D
+0x8FE7C1 0x977F
+0x8FE7C2 0x9780
+0x8FE7C3 0x9789
+0x8FE7C4 0x9795
+0x8FE7C5 0x9796
+0x8FE7C6 0x9797
+0x8FE7C7 0x9799
+0x8FE7C8 0x979A
+0x8FE7C9 0x979E
+0x8FE7CA 0x979F
+0x8FE7CB 0x97A2
+0x8FE7CC 0x97AC
+0x8FE7CD 0x97AE
+0x8FE7CE 0x97B1
+0x8FE7CF 0x97B2
+0x8FE7D0 0x97B5
+0x8FE7D1 0x97B6
+0x8FE7D2 0x97B8
+0x8FE7D3 0x97B9
+0x8FE7D4 0x97BA
+0x8FE7D5 0x97BC
+0x8FE7D6 0x97BE
+0x8FE7D7 0x97BF
+0x8FE7D8 0x97C1
+0x8FE7D9 0x97C4
+0x8FE7DA 0x97C5
+0x8FE7DB 0x97C7
+0x8FE7DC 0x97C9
+0x8FE7DD 0x97CA
+0x8FE7DE 0x97CC
+0x8FE7DF 0x97CD
+0x8FE7E0 0x97CE
+0x8FE7E1 0x97D0
+0x8FE7E2 0x97D1
+0x8FE7E3 0x97D4
+0x8FE7E4 0x97D7
+0x8FE7E5 0x97D8
+0x8FE7E6 0x97D9
+0x8FE7E7 0x97DD
+0x8FE7E8 0x97DE
+0x8FE7E9 0x97E0
+0x8FE7EA 0x97DB
+0x8FE7EB 0x97E1
+0x8FE7EC 0x97E4
+0x8FE7ED 0x97EF
+0x8FE7EE 0x97F1
+0x8FE7EF 0x97F4
+0x8FE7F0 0x97F7
+0x8FE7F1 0x97F8
+0x8FE7F2 0x97FA
+0x8FE7F3 0x9807
+0x8FE7F4 0x980A
+0x8FE7F5 0x9819
+0x8FE7F6 0x980D
+0x8FE7F7 0x980E
+0x8FE7F8 0x9814
+0x8FE7F9 0x9816
+0x8FE7FA 0x981C
+0x8FE7FB 0x981E
+0x8FE7FC 0x9820
+0x8FE7FD 0x9823
+0x8FE7FE 0x9826
+0x8FE8A1 0x982B
+0x8FE8A2 0x982E
+0x8FE8A3 0x982F
+0x8FE8A4 0x9830
+0x8FE8A5 0x9832
+0x8FE8A6 0x9833
+0x8FE8A7 0x9835
+0x8FE8A8 0x9825
+0x8FE8A9 0x983E
+0x8FE8AA 0x9844
+0x8FE8AB 0x9847
+0x8FE8AC 0x984A
+0x8FE8AD 0x9851
+0x8FE8AE 0x9852
+0x8FE8AF 0x9853
+0x8FE8B0 0x9856
+0x8FE8B1 0x9857
+0x8FE8B2 0x9859
+0x8FE8B3 0x985A
+0x8FE8B4 0x9862
+0x8FE8B5 0x9863
+0x8FE8B6 0x9865
+0x8FE8B7 0x9866
+0x8FE8B8 0x986A
+0x8FE8B9 0x986C
+0x8FE8BA 0x98AB
+0x8FE8BB 0x98AD
+0x8FE8BC 0x98AE
+0x8FE8BD 0x98B0
+0x8FE8BE 0x98B4
+0x8FE8BF 0x98B7
+0x8FE8C0 0x98B8
+0x8FE8C1 0x98BA
+0x8FE8C2 0x98BB
+0x8FE8C3 0x98BF
+0x8FE8C4 0x98C2
+0x8FE8C5 0x98C5
+0x8FE8C6 0x98C8
+0x8FE8C7 0x98CC
+0x8FE8C8 0x98E1
+0x8FE8C9 0x98E3
+0x8FE8CA 0x98E5
+0x8FE8CB 0x98E6
+0x8FE8CC 0x98E7
+0x8FE8CD 0x98EA
+0x8FE8CE 0x98F3
+0x8FE8CF 0x98F6
+0x8FE8D0 0x9902
+0x8FE8D1 0x9907
+0x8FE8D2 0x9908
+0x8FE8D3 0x9911
+0x8FE8D4 0x9915
+0x8FE8D5 0x9916
+0x8FE8D6 0x9917
+0x8FE8D7 0x991A
+0x8FE8D8 0x991B
+0x8FE8D9 0x991C
+0x8FE8DA 0x991F
+0x8FE8DB 0x9922
+0x8FE8DC 0x9926
+0x8FE8DD 0x9927
+0x8FE8DE 0x992B
+0x8FE8DF 0x9931
+0x8FE8E0 0x9932
+0x8FE8E1 0x9933
+0x8FE8E2 0x9934
+0x8FE8E3 0x9935
+0x8FE8E4 0x9939
+0x8FE8E5 0x993A
+0x8FE8E6 0x993B
+0x8FE8E7 0x993C
+0x8FE8E8 0x9940
+0x8FE8E9 0x9941
+0x8FE8EA 0x9946
+0x8FE8EB 0x9947
+0x8FE8EC 0x9948
+0x8FE8ED 0x994D
+0x8FE8EE 0x994E
+0x8FE8EF 0x9954
+0x8FE8F0 0x9958
+0x8FE8F1 0x9959
+0x8FE8F2 0x995B
+0x8FE8F3 0x995C
+0x8FE8F4 0x995E
+0x8FE8F5 0x995F
+0x8FE8F6 0x9960
+0x8FE8F7 0x999B
+0x8FE8F8 0x999D
+0x8FE8F9 0x999F
+0x8FE8FA 0x99A6
+0x8FE8FB 0x99B0
+0x8FE8FC 0x99B1
+0x8FE8FD 0x99B2
+0x8FE8FE 0x99B5
+0x8FE9A1 0x99B9
+0x8FE9A2 0x99BA
+0x8FE9A3 0x99BD
+0x8FE9A4 0x99BF
+0x8FE9A5 0x99C3
+0x8FE9A6 0x99C9
+0x8FE9A7 0x99D3
+0x8FE9A8 0x99D4
+0x8FE9A9 0x99D9
+0x8FE9AA 0x99DA
+0x8FE9AB 0x99DC
+0x8FE9AC 0x99DE
+0x8FE9AD 0x99E7
+0x8FE9AE 0x99EA
+0x8FE9AF 0x99EB
+0x8FE9B0 0x99EC
+0x8FE9B1 0x99F0
+0x8FE9B2 0x99F4
+0x8FE9B3 0x99F5
+0x8FE9B4 0x99F9
+0x8FE9B5 0x99FD
+0x8FE9B6 0x99FE
+0x8FE9B7 0x9A02
+0x8FE9B8 0x9A03
+0x8FE9B9 0x9A04
+0x8FE9BA 0x9A0B
+0x8FE9BB 0x9A0C
+0x8FE9BC 0x9A10
+0x8FE9BD 0x9A11
+0x8FE9BE 0x9A16
+0x8FE9BF 0x9A1E
+0x8FE9C0 0x9A20
+0x8FE9C1 0x9A22
+0x8FE9C2 0x9A23
+0x8FE9C3 0x9A24
+0x8FE9C4 0x9A27
+0x8FE9C5 0x9A2D
+0x8FE9C6 0x9A2E
+0x8FE9C7 0x9A33
+0x8FE9C8 0x9A35
+0x8FE9C9 0x9A36
+0x8FE9CA 0x9A38
+0x8FE9CB 0x9A47
+0x8FE9CC 0x9A41
+0x8FE9CD 0x9A44
+0x8FE9CE 0x9A4A
+0x8FE9CF 0x9A4B
+0x8FE9D0 0x9A4C
+0x8FE9D1 0x9A4E
+0x8FE9D2 0x9A51
+0x8FE9D3 0x9A54
+0x8FE9D4 0x9A56
+0x8FE9D5 0x9A5D
+0x8FE9D6 0x9AAA
+0x8FE9D7 0x9AAC
+0x8FE9D8 0x9AAE
+0x8FE9D9 0x9AAF
+0x8FE9DA 0x9AB2
+0x8FE9DB 0x9AB4
+0x8FE9DC 0x9AB5
+0x8FE9DD 0x9AB6
+0x8FE9DE 0x9AB9
+0x8FE9DF 0x9ABB
+0x8FE9E0 0x9ABE
+0x8FE9E1 0x9ABF
+0x8FE9E2 0x9AC1
+0x8FE9E3 0x9AC3
+0x8FE9E4 0x9AC6
+0x8FE9E5 0x9AC8
+0x8FE9E6 0x9ACE
+0x8FE9E7 0x9AD0
+0x8FE9E8 0x9AD2
+0x8FE9E9 0x9AD5
+0x8FE9EA 0x9AD6
+0x8FE9EB 0x9AD7
+0x8FE9EC 0x9ADB
+0x8FE9ED 0x9ADC
+0x8FE9EE 0x9AE0
+0x8FE9EF 0x9AE4
+0x8FE9F0 0x9AE5
+0x8FE9F1 0x9AE7
+0x8FE9F2 0x9AE9
+0x8FE9F3 0x9AEC
+0x8FE9F4 0x9AF2
+0x8FE9F5 0x9AF3
+0x8FE9F6 0x9AF5
+0x8FE9F7 0x9AF9
+0x8FE9F8 0x9AFA
+0x8FE9F9 0x9AFD
+0x8FE9FA 0x9AFF
+0x8FE9FB 0x9B00
+0x8FE9FC 0x9B01
+0x8FE9FD 0x9B02
+0x8FE9FE 0x9B03
+0x8FEAA1 0x9B04
+0x8FEAA2 0x9B05
+0x8FEAA3 0x9B08
+0x8FEAA4 0x9B09
+0x8FEAA5 0x9B0B
+0x8FEAA6 0x9B0C
+0x8FEAA7 0x9B0D
+0x8FEAA8 0x9B0E
+0x8FEAA9 0x9B10
+0x8FEAAA 0x9B12
+0x8FEAAB 0x9B16
+0x8FEAAC 0x9B19
+0x8FEAAD 0x9B1B
+0x8FEAAE 0x9B1C
+0x8FEAAF 0x9B20
+0x8FEAB0 0x9B26
+0x8FEAB1 0x9B2B
+0x8FEAB2 0x9B2D
+0x8FEAB3 0x9B33
+0x8FEAB4 0x9B34
+0x8FEAB5 0x9B35
+0x8FEAB6 0x9B37
+0x8FEAB7 0x9B39
+0x8FEAB8 0x9B3A
+0x8FEAB9 0x9B3D
+0x8FEABA 0x9B48
+0x8FEABB 0x9B4B
+0x8FEABC 0x9B4C
+0x8FEABD 0x9B55
+0x8FEABE 0x9B56
+0x8FEABF 0x9B57
+0x8FEAC0 0x9B5B
+0x8FEAC1 0x9B5E
+0x8FEAC2 0x9B61
+0x8FEAC3 0x9B63
+0x8FEAC4 0x9B65
+0x8FEAC5 0x9B66
+0x8FEAC6 0x9B68
+0x8FEAC7 0x9B6A
+0x8FEAC8 0x9B6B
+0x8FEAC9 0x9B6C
+0x8FEACA 0x9B6D
+0x8FEACB 0x9B6E
+0x8FEACC 0x9B73
+0x8FEACD 0x9B75
+0x8FEACE 0x9B77
+0x8FEACF 0x9B78
+0x8FEAD0 0x9B79
+0x8FEAD1 0x9B7F
+0x8FEAD2 0x9B80
+0x8FEAD3 0x9B84
+0x8FEAD4 0x9B85
+0x8FEAD5 0x9B86
+0x8FEAD6 0x9B87
+0x8FEAD7 0x9B89
+0x8FEAD8 0x9B8A
+0x8FEAD9 0x9B8B
+0x8FEADA 0x9B8D
+0x8FEADB 0x9B8F
+0x8FEADC 0x9B90
+0x8FEADD 0x9B94
+0x8FEADE 0x9B9A
+0x8FEADF 0x9B9D
+0x8FEAE0 0x9B9E
+0x8FEAE1 0x9BA6
+0x8FEAE2 0x9BA7
+0x8FEAE3 0x9BA9
+0x8FEAE4 0x9BAC
+0x8FEAE5 0x9BB0
+0x8FEAE6 0x9BB1
+0x8FEAE7 0x9BB2
+0x8FEAE8 0x9BB7
+0x8FEAE9 0x9BB8
+0x8FEAEA 0x9BBB
+0x8FEAEB 0x9BBC
+0x8FEAEC 0x9BBE
+0x8FEAED 0x9BBF
+0x8FEAEE 0x9BC1
+0x8FEAEF 0x9BC7
+0x8FEAF0 0x9BC8
+0x8FEAF1 0x9BCE
+0x8FEAF2 0x9BD0
+0x8FEAF3 0x9BD7
+0x8FEAF4 0x9BD8
+0x8FEAF5 0x9BDD
+0x8FEAF6 0x9BDF
+0x8FEAF7 0x9BE5
+0x8FEAF8 0x9BE7
+0x8FEAF9 0x9BEA
+0x8FEAFA 0x9BEB
+0x8FEAFB 0x9BEF
+0x8FEAFC 0x9BF3
+0x8FEAFD 0x9BF7
+0x8FEAFE 0x9BF8
+0x8FEBA1 0x9BF9
+0x8FEBA2 0x9BFA
+0x8FEBA3 0x9BFD
+0x8FEBA4 0x9BFF
+0x8FEBA5 0x9C00
+0x8FEBA6 0x9C02
+0x8FEBA7 0x9C0B
+0x8FEBA8 0x9C0F
+0x8FEBA9 0x9C11
+0x8FEBAA 0x9C16
+0x8FEBAB 0x9C18
+0x8FEBAC 0x9C19
+0x8FEBAD 0x9C1A
+0x8FEBAE 0x9C1C
+0x8FEBAF 0x9C1E
+0x8FEBB0 0x9C22
+0x8FEBB1 0x9C23
+0x8FEBB2 0x9C26
+0x8FEBB3 0x9C27
+0x8FEBB4 0x9C28
+0x8FEBB5 0x9C29
+0x8FEBB6 0x9C2A
+0x8FEBB7 0x9C31
+0x8FEBB8 0x9C35
+0x8FEBB9 0x9C36
+0x8FEBBA 0x9C37
+0x8FEBBB 0x9C3D
+0x8FEBBC 0x9C41
+0x8FEBBD 0x9C43
+0x8FEBBE 0x9C44
+0x8FEBBF 0x9C45
+0x8FEBC0 0x9C49
+0x8FEBC1 0x9C4A
+0x8FEBC2 0x9C4E
+0x8FEBC3 0x9C4F
+0x8FEBC4 0x9C50
+0x8FEBC5 0x9C53
+0x8FEBC6 0x9C54
+0x8FEBC7 0x9C56
+0x8FEBC8 0x9C58
+0x8FEBC9 0x9C5B
+0x8FEBCA 0x9C5D
+0x8FEBCB 0x9C5E
+0x8FEBCC 0x9C5F
+0x8FEBCD 0x9C63
+0x8FEBCE 0x9C69
+0x8FEBCF 0x9C6A
+0x8FEBD0 0x9C5C
+0x8FEBD1 0x9C6B
+0x8FEBD2 0x9C68
+0x8FEBD3 0x9C6E
+0x8FEBD4 0x9C70
+0x8FEBD5 0x9C72
+0x8FEBD6 0x9C75
+0x8FEBD7 0x9C77
+0x8FEBD8 0x9C7B
+0x8FEBD9 0x9CE6
+0x8FEBDA 0x9CF2
+0x8FEBDB 0x9CF7
+0x8FEBDC 0x9CF9
+0x8FEBDD 0x9D0B
+0x8FEBDE 0x9D02
+0x8FEBDF 0x9D11
+0x8FEBE0 0x9D17
+0x8FEBE1 0x9D18
+0x8FEBE2 0x9D1C
+0x8FEBE3 0x9D1D
+0x8FEBE4 0x9D1E
+0x8FEBE5 0x9D2F
+0x8FEBE6 0x9D30
+0x8FEBE7 0x9D32
+0x8FEBE8 0x9D33
+0x8FEBE9 0x9D34
+0x8FEBEA 0x9D3A
+0x8FEBEB 0x9D3C
+0x8FEBEC 0x9D45
+0x8FEBED 0x9D3D
+0x8FEBEE 0x9D42
+0x8FEBEF 0x9D43
+0x8FEBF0 0x9D47
+0x8FEBF1 0x9D4A
+0x8FEBF2 0x9D53
+0x8FEBF3 0x9D54
+0x8FEBF4 0x9D5F
+0x8FEBF5 0x9D63
+0x8FEBF6 0x9D62
+0x8FEBF7 0x9D65
+0x8FEBF8 0x9D69
+0x8FEBF9 0x9D6A
+0x8FEBFA 0x9D6B
+0x8FEBFB 0x9D70
+0x8FEBFC 0x9D76
+0x8FEBFD 0x9D77
+0x8FEBFE 0x9D7B
+0x8FECA1 0x9D7C
+0x8FECA2 0x9D7E
+0x8FECA3 0x9D83
+0x8FECA4 0x9D84
+0x8FECA5 0x9D86
+0x8FECA6 0x9D8A
+0x8FECA7 0x9D8D
+0x8FECA8 0x9D8E
+0x8FECA9 0x9D92
+0x8FECAA 0x9D93
+0x8FECAB 0x9D95
+0x8FECAC 0x9D96
+0x8FECAD 0x9D97
+0x8FECAE 0x9D98
+0x8FECAF 0x9DA1
+0x8FECB0 0x9DAA
+0x8FECB1 0x9DAC
+0x8FECB2 0x9DAE
+0x8FECB3 0x9DB1
+0x8FECB4 0x9DB5
+0x8FECB5 0x9DB9
+0x8FECB6 0x9DBC
+0x8FECB7 0x9DBF
+0x8FECB8 0x9DC3
+0x8FECB9 0x9DC7
+0x8FECBA 0x9DC9
+0x8FECBB 0x9DCA
+0x8FECBC 0x9DD4
+0x8FECBD 0x9DD5
+0x8FECBE 0x9DD6
+0x8FECBF 0x9DD7
+0x8FECC0 0x9DDA
+0x8FECC1 0x9DDE
+0x8FECC2 0x9DDF
+0x8FECC3 0x9DE0
+0x8FECC4 0x9DE5
+0x8FECC5 0x9DE7
+0x8FECC6 0x9DE9
+0x8FECC7 0x9DEB
+0x8FECC8 0x9DEE
+0x8FECC9 0x9DF0
+0x8FECCA 0x9DF3
+0x8FECCB 0x9DF4
+0x8FECCC 0x9DFE
+0x8FECCD 0x9E0A
+0x8FECCE 0x9E02
+0x8FECCF 0x9E07
+0x8FECD0 0x9E0E
+0x8FECD1 0x9E10
+0x8FECD2 0x9E11
+0x8FECD3 0x9E12
+0x8FECD4 0x9E15
+0x8FECD5 0x9E16
+0x8FECD6 0x9E19
+0x8FECD7 0x9E1C
+0x8FECD8 0x9E1D
+0x8FECD9 0x9E7A
+0x8FECDA 0x9E7B
+0x8FECDB 0x9E7C
+0x8FECDC 0x9E80
+0x8FECDD 0x9E82
+0x8FECDE 0x9E83
+0x8FECDF 0x9E84
+0x8FECE0 0x9E85
+0x8FECE1 0x9E87
+0x8FECE2 0x9E8E
+0x8FECE3 0x9E8F
+0x8FECE4 0x9E96
+0x8FECE5 0x9E98
+0x8FECE6 0x9E9B
+0x8FECE7 0x9E9E
+0x8FECE8 0x9EA4
+0x8FECE9 0x9EA8
+0x8FECEA 0x9EAC
+0x8FECEB 0x9EAE
+0x8FECEC 0x9EAF
+0x8FECED 0x9EB0
+0x8FECEE 0x9EB3
+0x8FECEF 0x9EB4
+0x8FECF0 0x9EB5
+0x8FECF1 0x9EC6
+0x8FECF2 0x9EC8
+0x8FECF3 0x9ECB
+0x8FECF4 0x9ED5
+0x8FECF5 0x9EDF
+0x8FECF6 0x9EE4
+0x8FECF7 0x9EE7
+0x8FECF8 0x9EEC
+0x8FECF9 0x9EED
+0x8FECFA 0x9EEE
+0x8FECFB 0x9EF0
+0x8FECFC 0x9EF1
+0x8FECFD 0x9EF2
+0x8FECFE 0x9EF5
+0x8FEDA1 0x9EF8
+0x8FEDA2 0x9EFF
+0x8FEDA3 0x9F02
+0x8FEDA4 0x9F03
+0x8FEDA5 0x9F09
+0x8FEDA6 0x9F0F
+0x8FEDA7 0x9F10
+0x8FEDA8 0x9F11
+0x8FEDA9 0x9F12
+0x8FEDAA 0x9F14
+0x8FEDAB 0x9F16
+0x8FEDAC 0x9F17
+0x8FEDAD 0x9F19
+0x8FEDAE 0x9F1A
+0x8FEDAF 0x9F1B
+0x8FEDB0 0x9F1F
+0x8FEDB1 0x9F22
+0x8FEDB2 0x9F26
+0x8FEDB3 0x9F2A
+0x8FEDB4 0x9F2B
+0x8FEDB5 0x9F2F
+0x8FEDB6 0x9F31
+0x8FEDB7 0x9F32
+0x8FEDB8 0x9F34
+0x8FEDB9 0x9F37
+0x8FEDBA 0x9F39
+0x8FEDBB 0x9F3A
+0x8FEDBC 0x9F3C
+0x8FEDBD 0x9F3D
+0x8FEDBE 0x9F3F
+0x8FEDBF 0x9F41
+0x8FEDC0 0x9F43
+0x8FEDC1 0x9F44
+0x8FEDC2 0x9F45
+0x8FEDC3 0x9F46
+0x8FEDC4 0x9F47
+0x8FEDC5 0x9F53
+0x8FEDC6 0x9F55
+0x8FEDC7 0x9F56
+0x8FEDC8 0x9F57
+0x8FEDC9 0x9F58
+0x8FEDCA 0x9F5A
+0x8FEDCB 0x9F5D
+0x8FEDCC 0x9F5E
+0x8FEDCD 0x9F68
+0x8FEDCE 0x9F69
+0x8FEDCF 0x9F6D
+0x8FEDD0 0x9F6E
+0x8FEDD1 0x9F6F
+0x8FEDD2 0x9F70
+0x8FEDD3 0x9F71
+0x8FEDD4 0x9F73
+0x8FEDD5 0x9F75
+0x8FEDD6 0x9F7A
+0x8FEDD7 0x9F7D
+0x8FEDD8 0x9F8F
+0x8FEDD9 0x9F90
+0x8FEDDA 0x9F91
+0x8FEDDB 0x9F92
+0x8FEDDC 0x9F94
+0x8FEDDD 0x9F96
+0x8FEDDE 0x9F97
+0x8FEDDF 0x9F9E
+0x8FEDE0 0x9FA1
+0x8FEDE1 0x9FA2
+0x8FEDE2 0x9FA3
+0x8FEDE3 0x9FA5
+0xA1A1 0x3000
+0xA1A2 0x3001
+0xA1A3 0x3002
+0xA1A4 0xFF0C
+0xA1A5 0xFF0E
+0xA1A6 0x30FB
+0xA1A7 0xFF1A
+0xA1A8 0xFF1B
+0xA1A9 0xFF1F
+0xA1AA 0xFF01
+0xA1AB 0x309B
+0xA1AC 0x309C
+0xA1AD 0x00B4
+0xA1AE 0xFF40
+0xA1AF 0x00A8
+0xA1B0 0xFF3E
+0xA1B1 0xFFE3
+0xA1B2 0xFF3F
+0xA1B3 0x30FD
+0xA1B4 0x30FE
+0xA1B5 0x309D
+0xA1B6 0x309E
+0xA1B7 0x3003
+0xA1B8 0x4EDD
+0xA1B9 0x3005
+0xA1BA 0x3006
+0xA1BB 0x3007
+0xA1BC 0x30FC
+0xA1BD 0x2015
+0xA1BE 0x2010
+0xA1BF 0xFF0F
+0xA1C0 0x005C
+0xA1C1 0x301C
+0xA1C2 0x2016
+0xA1C3 0xFF5C
+0xA1C4 0x2026
+0xA1C5 0x2025
+0xA1C6 0x2018
+0xA1C7 0x2019
+0xA1C8 0x201C
+0xA1C9 0x201D
+0xA1CA 0xFF08
+0xA1CB 0xFF09
+0xA1CC 0x3014
+0xA1CD 0x3015
+0xA1CE 0xFF3B
+0xA1CF 0xFF3D
+0xA1D0 0xFF5B
+0xA1D1 0xFF5D
+0xA1D2 0x3008
+0xA1D3 0x3009
+0xA1D4 0x300A
+0xA1D5 0x300B
+0xA1D6 0x300C
+0xA1D7 0x300D
+0xA1D8 0x300E
+0xA1D9 0x300F
+0xA1DA 0x3010
+0xA1DB 0x3011
+0xA1DC 0xFF0B
+0xA1DD 0x2212
+0xA1DE 0x00B1
+0xA1DF 0x00D7
+0xA1E0 0x00F7
+0xA1E1 0xFF1D
+0xA1E2 0x2260
+0xA1E3 0xFF1C
+0xA1E4 0xFF1E
+0xA1E5 0x2266
+0xA1E6 0x2267
+0xA1E7 0x221E
+0xA1E8 0x2234
+0xA1E9 0x2642
+0xA1EA 0x2640
+0xA1EB 0x00B0
+0xA1EC 0x2032
+0xA1ED 0x2033
+0xA1EE 0x2103
+0xA1EF 0xFFE5
+0xA1F0 0xFF04
+0xA1F1 0x00A2
+0xA1F2 0x00A3
+0xA1F3 0xFF05
+0xA1F4 0xFF03
+0xA1F5 0xFF06
+0xA1F6 0xFF0A
+0xA1F7 0xFF20
+0xA1F8 0x00A7
+0xA1F9 0x2606
+0xA1FA 0x2605
+0xA1FB 0x25CB
+0xA1FC 0x25CF
+0xA1FD 0x25CE
+0xA1FE 0x25C7
+0xA2A1 0x25C6
+0xA2A2 0x25A1
+0xA2A3 0x25A0
+0xA2A4 0x25B3
+0xA2A5 0x25B2
+0xA2A6 0x25BD
+0xA2A7 0x25BC
+0xA2A8 0x203B
+0xA2A9 0x3012
+0xA2AA 0x2192
+0xA2AB 0x2190
+0xA2AC 0x2191
+0xA2AD 0x2193
+0xA2AE 0x3013
+0xA2BA 0x2208
+0xA2BB 0x220B
+0xA2BC 0x2286
+0xA2BD 0x2287
+0xA2BE 0x2282
+0xA2BF 0x2283
+0xA2C0 0x222A
+0xA2C1 0x2229
+0xA2CA 0x2227
+0xA2CB 0x2228
+0xA2CC 0x00AC
+0xA2CD 0x21D2
+0xA2CE 0x21D4
+0xA2CF 0x2200
+0xA2D0 0x2203
+0xA2DC 0x2220
+0xA2DD 0x22A5
+0xA2DE 0x2312
+0xA2DF 0x2202
+0xA2E0 0x2207
+0xA2E1 0x2261
+0xA2E2 0x2252
+0xA2E3 0x226A
+0xA2E4 0x226B
+0xA2E5 0x221A
+0xA2E6 0x223D
+0xA2E7 0x221D
+0xA2E8 0x2235
+0xA2E9 0x222B
+0xA2EA 0x222C
+0xA2F2 0x212B
+0xA2F3 0x2030
+0xA2F4 0x266F
+0xA2F5 0x266D
+0xA2F6 0x266A
+0xA2F7 0x2020
+0xA2F8 0x2021
+0xA2F9 0x00B6
+0xA2FE 0x25EF
+0xA3B0 0xFF10
+0xA3B1 0xFF11
+0xA3B2 0xFF12
+0xA3B3 0xFF13
+0xA3B4 0xFF14
+0xA3B5 0xFF15
+0xA3B6 0xFF16
+0xA3B7 0xFF17
+0xA3B8 0xFF18
+0xA3B9 0xFF19
+0xA3C1 0xFF21
+0xA3C2 0xFF22
+0xA3C3 0xFF23
+0xA3C4 0xFF24
+0xA3C5 0xFF25
+0xA3C6 0xFF26
+0xA3C7 0xFF27
+0xA3C8 0xFF28
+0xA3C9 0xFF29
+0xA3CA 0xFF2A
+0xA3CB 0xFF2B
+0xA3CC 0xFF2C
+0xA3CD 0xFF2D
+0xA3CE 0xFF2E
+0xA3CF 0xFF2F
+0xA3D0 0xFF30
+0xA3D1 0xFF31
+0xA3D2 0xFF32
+0xA3D3 0xFF33
+0xA3D4 0xFF34
+0xA3D5 0xFF35
+0xA3D6 0xFF36
+0xA3D7 0xFF37
+0xA3D8 0xFF38
+0xA3D9 0xFF39
+0xA3DA 0xFF3A
+0xA3E1 0xFF41
+0xA3E2 0xFF42
+0xA3E3 0xFF43
+0xA3E4 0xFF44
+0xA3E5 0xFF45
+0xA3E6 0xFF46
+0xA3E7 0xFF47
+0xA3E8 0xFF48
+0xA3E9 0xFF49
+0xA3EA 0xFF4A
+0xA3EB 0xFF4B
+0xA3EC 0xFF4C
+0xA3ED 0xFF4D
+0xA3EE 0xFF4E
+0xA3EF 0xFF4F
+0xA3F0 0xFF50
+0xA3F1 0xFF51
+0xA3F2 0xFF52
+0xA3F3 0xFF53
+0xA3F4 0xFF54
+0xA3F5 0xFF55
+0xA3F6 0xFF56
+0xA3F7 0xFF57
+0xA3F8 0xFF58
+0xA3F9 0xFF59
+0xA3FA 0xFF5A
+0xA4A1 0x3041
+0xA4A2 0x3042
+0xA4A3 0x3043
+0xA4A4 0x3044
+0xA4A5 0x3045
+0xA4A6 0x3046
+0xA4A7 0x3047
+0xA4A8 0x3048
+0xA4A9 0x3049
+0xA4AA 0x304A
+0xA4AB 0x304B
+0xA4AC 0x304C
+0xA4AD 0x304D
+0xA4AE 0x304E
+0xA4AF 0x304F
+0xA4B0 0x3050
+0xA4B1 0x3051
+0xA4B2 0x3052
+0xA4B3 0x3053
+0xA4B4 0x3054
+0xA4B5 0x3055
+0xA4B6 0x3056
+0xA4B7 0x3057
+0xA4B8 0x3058
+0xA4B9 0x3059
+0xA4BA 0x305A
+0xA4BB 0x305B
+0xA4BC 0x305C
+0xA4BD 0x305D
+0xA4BE 0x305E
+0xA4BF 0x305F
+0xA4C0 0x3060
+0xA4C1 0x3061
+0xA4C2 0x3062
+0xA4C3 0x3063
+0xA4C4 0x3064
+0xA4C5 0x3065
+0xA4C6 0x3066
+0xA4C7 0x3067
+0xA4C8 0x3068
+0xA4C9 0x3069
+0xA4CA 0x306A
+0xA4CB 0x306B
+0xA4CC 0x306C
+0xA4CD 0x306D
+0xA4CE 0x306E
+0xA4CF 0x306F
+0xA4D0 0x3070
+0xA4D1 0x3071
+0xA4D2 0x3072
+0xA4D3 0x3073
+0xA4D4 0x3074
+0xA4D5 0x3075
+0xA4D6 0x3076
+0xA4D7 0x3077
+0xA4D8 0x3078
+0xA4D9 0x3079
+0xA4DA 0x307A
+0xA4DB 0x307B
+0xA4DC 0x307C
+0xA4DD 0x307D
+0xA4DE 0x307E
+0xA4DF 0x307F
+0xA4E0 0x3080
+0xA4E1 0x3081
+0xA4E2 0x3082
+0xA4E3 0x3083
+0xA4E4 0x3084
+0xA4E5 0x3085
+0xA4E6 0x3086
+0xA4E7 0x3087
+0xA4E8 0x3088
+0xA4E9 0x3089
+0xA4EA 0x308A
+0xA4EB 0x308B
+0xA4EC 0x308C
+0xA4ED 0x308D
+0xA4EE 0x308E
+0xA4EF 0x308F
+0xA4F0 0x3090
+0xA4F1 0x3091
+0xA4F2 0x3092
+0xA4F3 0x3093
+0xA5A1 0x30A1
+0xA5A2 0x30A2
+0xA5A3 0x30A3
+0xA5A4 0x30A4
+0xA5A5 0x30A5
+0xA5A6 0x30A6
+0xA5A7 0x30A7
+0xA5A8 0x30A8
+0xA5A9 0x30A9
+0xA5AA 0x30AA
+0xA5AB 0x30AB
+0xA5AC 0x30AC
+0xA5AD 0x30AD
+0xA5AE 0x30AE
+0xA5AF 0x30AF
+0xA5B0 0x30B0
+0xA5B1 0x30B1
+0xA5B2 0x30B2
+0xA5B3 0x30B3
+0xA5B4 0x30B4
+0xA5B5 0x30B5
+0xA5B6 0x30B6
+0xA5B7 0x30B7
+0xA5B8 0x30B8
+0xA5B9 0x30B9
+0xA5BA 0x30BA
+0xA5BB 0x30BB
+0xA5BC 0x30BC
+0xA5BD 0x30BD
+0xA5BE 0x30BE
+0xA5BF 0x30BF
+0xA5C0 0x30C0
+0xA5C1 0x30C1
+0xA5C2 0x30C2
+0xA5C3 0x30C3
+0xA5C4 0x30C4
+0xA5C5 0x30C5
+0xA5C6 0x30C6
+0xA5C7 0x30C7
+0xA5C8 0x30C8
+0xA5C9 0x30C9
+0xA5CA 0x30CA
+0xA5CB 0x30CB
+0xA5CC 0x30CC
+0xA5CD 0x30CD
+0xA5CE 0x30CE
+0xA5CF 0x30CF
+0xA5D0 0x30D0
+0xA5D1 0x30D1
+0xA5D2 0x30D2
+0xA5D3 0x30D3
+0xA5D4 0x30D4
+0xA5D5 0x30D5
+0xA5D6 0x30D6
+0xA5D7 0x30D7
+0xA5D8 0x30D8
+0xA5D9 0x30D9
+0xA5DA 0x30DA
+0xA5DB 0x30DB
+0xA5DC 0x30DC
+0xA5DD 0x30DD
+0xA5DE 0x30DE
+0xA5DF 0x30DF
+0xA5E0 0x30E0
+0xA5E1 0x30E1
+0xA5E2 0x30E2
+0xA5E3 0x30E3
+0xA5E4 0x30E4
+0xA5E5 0x30E5
+0xA5E6 0x30E6
+0xA5E7 0x30E7
+0xA5E8 0x30E8
+0xA5E9 0x30E9
+0xA5EA 0x30EA
+0xA5EB 0x30EB
+0xA5EC 0x30EC
+0xA5ED 0x30ED
+0xA5EE 0x30EE
+0xA5EF 0x30EF
+0xA5F0 0x30F0
+0xA5F1 0x30F1
+0xA5F2 0x30F2
+0xA5F3 0x30F3
+0xA5F4 0x30F4
+0xA5F5 0x30F5
+0xA5F6 0x30F6
+0xA6A1 0x0391
+0xA6A2 0x0392
+0xA6A3 0x0393
+0xA6A4 0x0394
+0xA6A5 0x0395
+0xA6A6 0x0396
+0xA6A7 0x0397
+0xA6A8 0x0398
+0xA6A9 0x0399
+0xA6AA 0x039A
+0xA6AB 0x039B
+0xA6AC 0x039C
+0xA6AD 0x039D
+0xA6AE 0x039E
+0xA6AF 0x039F
+0xA6B0 0x03A0
+0xA6B1 0x03A1
+0xA6B2 0x03A3
+0xA6B3 0x03A4
+0xA6B4 0x03A5
+0xA6B5 0x03A6
+0xA6B6 0x03A7
+0xA6B7 0x03A8
+0xA6B8 0x03A9
+0xA6C1 0x03B1
+0xA6C2 0x03B2
+0xA6C3 0x03B3
+0xA6C4 0x03B4
+0xA6C5 0x03B5
+0xA6C6 0x03B6
+0xA6C7 0x03B7
+0xA6C8 0x03B8
+0xA6C9 0x03B9
+0xA6CA 0x03BA
+0xA6CB 0x03BB
+0xA6CC 0x03BC
+0xA6CD 0x03BD
+0xA6CE 0x03BE
+0xA6CF 0x03BF
+0xA6D0 0x03C0
+0xA6D1 0x03C1
+0xA6D2 0x03C3
+0xA6D3 0x03C4
+0xA6D4 0x03C5
+0xA6D5 0x03C6
+0xA6D6 0x03C7
+0xA6D7 0x03C8
+0xA6D8 0x03C9
+0xA7A1 0x0410
+0xA7A2 0x0411
+0xA7A3 0x0412
+0xA7A4 0x0413
+0xA7A5 0x0414
+0xA7A6 0x0415
+0xA7A7 0x0401
+0xA7A8 0x0416
+0xA7A9 0x0417
+0xA7AA 0x0418
+0xA7AB 0x0419
+0xA7AC 0x041A
+0xA7AD 0x041B
+0xA7AE 0x041C
+0xA7AF 0x041D
+0xA7B0 0x041E
+0xA7B1 0x041F
+0xA7B2 0x0420
+0xA7B3 0x0421
+0xA7B4 0x0422
+0xA7B5 0x0423
+0xA7B6 0x0424
+0xA7B7 0x0425
+0xA7B8 0x0426
+0xA7B9 0x0427
+0xA7BA 0x0428
+0xA7BB 0x0429
+0xA7BC 0x042A
+0xA7BD 0x042B
+0xA7BE 0x042C
+0xA7BF 0x042D
+0xA7C0 0x042E
+0xA7C1 0x042F
+0xA7D1 0x0430
+0xA7D2 0x0431
+0xA7D3 0x0432
+0xA7D4 0x0433
+0xA7D5 0x0434
+0xA7D6 0x0435
+0xA7D7 0x0451
+0xA7D8 0x0436
+0xA7D9 0x0437
+0xA7DA 0x0438
+0xA7DB 0x0439
+0xA7DC 0x043A
+0xA7DD 0x043B
+0xA7DE 0x043C
+0xA7DF 0x043D
+0xA7E0 0x043E
+0xA7E1 0x043F
+0xA7E2 0x0440
+0xA7E3 0x0441
+0xA7E4 0x0442
+0xA7E5 0x0443
+0xA7E6 0x0444
+0xA7E7 0x0445
+0xA7E8 0x0446
+0xA7E9 0x0447
+0xA7EA 0x0448
+0xA7EB 0x0449
+0xA7EC 0x044A
+0xA7ED 0x044B
+0xA7EE 0x044C
+0xA7EF 0x044D
+0xA7F0 0x044E
+0xA7F1 0x044F
+0xA8A1 0x2500
+0xA8A2 0x2502
+0xA8A3 0x250C
+0xA8A4 0x2510
+0xA8A5 0x2518
+0xA8A6 0x2514
+0xA8A7 0x251C
+0xA8A8 0x252C
+0xA8A9 0x2524
+0xA8AA 0x2534
+0xA8AB 0x253C
+0xA8AC 0x2501
+0xA8AD 0x2503
+0xA8AE 0x250F
+0xA8AF 0x2513
+0xA8B0 0x251B
+0xA8B1 0x2517
+0xA8B2 0x2523
+0xA8B3 0x2533
+0xA8B4 0x252B
+0xA8B5 0x253B
+0xA8B6 0x254B
+0xA8B7 0x2520
+0xA8B8 0x252F
+0xA8B9 0x2528
+0xA8BA 0x2537
+0xA8BB 0x253F
+0xA8BC 0x251D
+0xA8BD 0x2530
+0xA8BE 0x2525
+0xA8BF 0x2538
+0xA8C0 0x2542
+0xB0A1 0x4E9C
+0xB0A2 0x5516
+0xB0A3 0x5A03
+0xB0A4 0x963F
+0xB0A5 0x54C0
+0xB0A6 0x611B
+0xB0A7 0x6328
+0xB0A8 0x59F6
+0xB0A9 0x9022
+0xB0AA 0x8475
+0xB0AB 0x831C
+0xB0AC 0x7A50
+0xB0AD 0x60AA
+0xB0AE 0x63E1
+0xB0AF 0x6E25
+0xB0B0 0x65ED
+0xB0B1 0x8466
+0xB0B2 0x82A6
+0xB0B3 0x9BF5
+0xB0B4 0x6893
+0xB0B5 0x5727
+0xB0B6 0x65A1
+0xB0B7 0x6271
+0xB0B8 0x5B9B
+0xB0B9 0x59D0
+0xB0BA 0x867B
+0xB0BB 0x98F4
+0xB0BC 0x7D62
+0xB0BD 0x7DBE
+0xB0BE 0x9B8E
+0xB0BF 0x6216
+0xB0C0 0x7C9F
+0xB0C1 0x88B7
+0xB0C2 0x5B89
+0xB0C3 0x5EB5
+0xB0C4 0x6309
+0xB0C5 0x6697
+0xB0C6 0x6848
+0xB0C7 0x95C7
+0xB0C8 0x978D
+0xB0C9 0x674F
+0xB0CA 0x4EE5
+0xB0CB 0x4F0A
+0xB0CC 0x4F4D
+0xB0CD 0x4F9D
+0xB0CE 0x5049
+0xB0CF 0x56F2
+0xB0D0 0x5937
+0xB0D1 0x59D4
+0xB0D2 0x5A01
+0xB0D3 0x5C09
+0xB0D4 0x60DF
+0xB0D5 0x610F
+0xB0D6 0x6170
+0xB0D7 0x6613
+0xB0D8 0x6905
+0xB0D9 0x70BA
+0xB0DA 0x754F
+0xB0DB 0x7570
+0xB0DC 0x79FB
+0xB0DD 0x7DAD
+0xB0DE 0x7DEF
+0xB0DF 0x80C3
+0xB0E0 0x840E
+0xB0E1 0x8863
+0xB0E2 0x8B02
+0xB0E3 0x9055
+0xB0E4 0x907A
+0xB0E5 0x533B
+0xB0E6 0x4E95
+0xB0E7 0x4EA5
+0xB0E8 0x57DF
+0xB0E9 0x80B2
+0xB0EA 0x90C1
+0xB0EB 0x78EF
+0xB0EC 0x4E00
+0xB0ED 0x58F1
+0xB0EE 0x6EA2
+0xB0EF 0x9038
+0xB0F0 0x7A32
+0xB0F1 0x8328
+0xB0F2 0x828B
+0xB0F3 0x9C2F
+0xB0F4 0x5141
+0xB0F5 0x5370
+0xB0F6 0x54BD
+0xB0F7 0x54E1
+0xB0F8 0x56E0
+0xB0F9 0x59FB
+0xB0FA 0x5F15
+0xB0FB 0x98F2
+0xB0FC 0x6DEB
+0xB0FD 0x80E4
+0xB0FE 0x852D
+0xB1A1 0x9662
+0xB1A2 0x9670
+0xB1A3 0x96A0
+0xB1A4 0x97FB
+0xB1A5 0x540B
+0xB1A6 0x53F3
+0xB1A7 0x5B87
+0xB1A8 0x70CF
+0xB1A9 0x7FBD
+0xB1AA 0x8FC2
+0xB1AB 0x96E8
+0xB1AC 0x536F
+0xB1AD 0x9D5C
+0xB1AE 0x7ABA
+0xB1AF 0x4E11
+0xB1B0 0x7893
+0xB1B1 0x81FC
+0xB1B2 0x6E26
+0xB1B3 0x5618
+0xB1B4 0x5504
+0xB1B5 0x6B1D
+0xB1B6 0x851A
+0xB1B7 0x9C3B
+0xB1B8 0x59E5
+0xB1B9 0x53A9
+0xB1BA 0x6D66
+0xB1BB 0x74DC
+0xB1BC 0x958F
+0xB1BD 0x5642
+0xB1BE 0x4E91
+0xB1BF 0x904B
+0xB1C0 0x96F2
+0xB1C1 0x834F
+0xB1C2 0x990C
+0xB1C3 0x53E1
+0xB1C4 0x55B6
+0xB1C5 0x5B30
+0xB1C6 0x5F71
+0xB1C7 0x6620
+0xB1C8 0x66F3
+0xB1C9 0x6804
+0xB1CA 0x6C38
+0xB1CB 0x6CF3
+0xB1CC 0x6D29
+0xB1CD 0x745B
+0xB1CE 0x76C8
+0xB1CF 0x7A4E
+0xB1D0 0x9834
+0xB1D1 0x82F1
+0xB1D2 0x885B
+0xB1D3 0x8A60
+0xB1D4 0x92ED
+0xB1D5 0x6DB2
+0xB1D6 0x75AB
+0xB1D7 0x76CA
+0xB1D8 0x99C5
+0xB1D9 0x60A6
+0xB1DA 0x8B01
+0xB1DB 0x8D8A
+0xB1DC 0x95B2
+0xB1DD 0x698E
+0xB1DE 0x53AD
+0xB1DF 0x5186
+0xB1E0 0x5712
+0xB1E1 0x5830
+0xB1E2 0x5944
+0xB1E3 0x5BB4
+0xB1E4 0x5EF6
+0xB1E5 0x6028
+0xB1E6 0x63A9
+0xB1E7 0x63F4
+0xB1E8 0x6CBF
+0xB1E9 0x6F14
+0xB1EA 0x708E
+0xB1EB 0x7114
+0xB1EC 0x7159
+0xB1ED 0x71D5
+0xB1EE 0x733F
+0xB1EF 0x7E01
+0xB1F0 0x8276
+0xB1F1 0x82D1
+0xB1F2 0x8597
+0xB1F3 0x9060
+0xB1F4 0x925B
+0xB1F5 0x9D1B
+0xB1F6 0x5869
+0xB1F7 0x65BC
+0xB1F8 0x6C5A
+0xB1F9 0x7525
+0xB1FA 0x51F9
+0xB1FB 0x592E
+0xB1FC 0x5965
+0xB1FD 0x5F80
+0xB1FE 0x5FDC
+0xB2A1 0x62BC
+0xB2A2 0x65FA
+0xB2A3 0x6A2A
+0xB2A4 0x6B27
+0xB2A5 0x6BB4
+0xB2A6 0x738B
+0xB2A7 0x7FC1
+0xB2A8 0x8956
+0xB2A9 0x9D2C
+0xB2AA 0x9D0E
+0xB2AB 0x9EC4
+0xB2AC 0x5CA1
+0xB2AD 0x6C96
+0xB2AE 0x837B
+0xB2AF 0x5104
+0xB2B0 0x5C4B
+0xB2B1 0x61B6
+0xB2B2 0x81C6
+0xB2B3 0x6876
+0xB2B4 0x7261
+0xB2B5 0x4E59
+0xB2B6 0x4FFA
+0xB2B7 0x5378
+0xB2B8 0x6069
+0xB2B9 0x6E29
+0xB2BA 0x7A4F
+0xB2BB 0x97F3
+0xB2BC 0x4E0B
+0xB2BD 0x5316
+0xB2BE 0x4EEE
+0xB2BF 0x4F55
+0xB2C0 0x4F3D
+0xB2C1 0x4FA1
+0xB2C2 0x4F73
+0xB2C3 0x52A0
+0xB2C4 0x53EF
+0xB2C5 0x5609
+0xB2C6 0x590F
+0xB2C7 0x5AC1
+0xB2C8 0x5BB6
+0xB2C9 0x5BE1
+0xB2CA 0x79D1
+0xB2CB 0x6687
+0xB2CC 0x679C
+0xB2CD 0x67B6
+0xB2CE 0x6B4C
+0xB2CF 0x6CB3
+0xB2D0 0x706B
+0xB2D1 0x73C2
+0xB2D2 0x798D
+0xB2D3 0x79BE
+0xB2D4 0x7A3C
+0xB2D5 0x7B87
+0xB2D6 0x82B1
+0xB2D7 0x82DB
+0xB2D8 0x8304
+0xB2D9 0x8377
+0xB2DA 0x83EF
+0xB2DB 0x83D3
+0xB2DC 0x8766
+0xB2DD 0x8AB2
+0xB2DE 0x5629
+0xB2DF 0x8CA8
+0xB2E0 0x8FE6
+0xB2E1 0x904E
+0xB2E2 0x971E
+0xB2E3 0x868A
+0xB2E4 0x4FC4
+0xB2E5 0x5CE8
+0xB2E6 0x6211
+0xB2E7 0x7259
+0xB2E8 0x753B
+0xB2E9 0x81E5
+0xB2EA 0x82BD
+0xB2EB 0x86FE
+0xB2EC 0x8CC0
+0xB2ED 0x96C5
+0xB2EE 0x9913
+0xB2EF 0x99D5
+0xB2F0 0x4ECB
+0xB2F1 0x4F1A
+0xB2F2 0x89E3
+0xB2F3 0x56DE
+0xB2F4 0x584A
+0xB2F5 0x58CA
+0xB2F6 0x5EFB
+0xB2F7 0x5FEB
+0xB2F8 0x602A
+0xB2F9 0x6094
+0xB2FA 0x6062
+0xB2FB 0x61D0
+0xB2FC 0x6212
+0xB2FD 0x62D0
+0xB2FE 0x6539
+0xB3A1 0x9B41
+0xB3A2 0x6666
+0xB3A3 0x68B0
+0xB3A4 0x6D77
+0xB3A5 0x7070
+0xB3A6 0x754C
+0xB3A7 0x7686
+0xB3A8 0x7D75
+0xB3A9 0x82A5
+0xB3AA 0x87F9
+0xB3AB 0x958B
+0xB3AC 0x968E
+0xB3AD 0x8C9D
+0xB3AE 0x51F1
+0xB3AF 0x52BE
+0xB3B0 0x5916
+0xB3B1 0x54B3
+0xB3B2 0x5BB3
+0xB3B3 0x5D16
+0xB3B4 0x6168
+0xB3B5 0x6982
+0xB3B6 0x6DAF
+0xB3B7 0x788D
+0xB3B8 0x84CB
+0xB3B9 0x8857
+0xB3BA 0x8A72
+0xB3BB 0x93A7
+0xB3BC 0x9AB8
+0xB3BD 0x6D6C
+0xB3BE 0x99A8
+0xB3BF 0x86D9
+0xB3C0 0x57A3
+0xB3C1 0x67FF
+0xB3C2 0x86CE
+0xB3C3 0x920E
+0xB3C4 0x5283
+0xB3C5 0x5687
+0xB3C6 0x5404
+0xB3C7 0x5ED3
+0xB3C8 0x62E1
+0xB3C9 0x64B9
+0xB3CA 0x683C
+0xB3CB 0x6838
+0xB3CC 0x6BBB
+0xB3CD 0x7372
+0xB3CE 0x78BA
+0xB3CF 0x7A6B
+0xB3D0 0x899A
+0xB3D1 0x89D2
+0xB3D2 0x8D6B
+0xB3D3 0x8F03
+0xB3D4 0x90ED
+0xB3D5 0x95A3
+0xB3D6 0x9694
+0xB3D7 0x9769
+0xB3D8 0x5B66
+0xB3D9 0x5CB3
+0xB3DA 0x697D
+0xB3DB 0x984D
+0xB3DC 0x984E
+0xB3DD 0x639B
+0xB3DE 0x7B20
+0xB3DF 0x6A2B
+0xB3E0 0x6A7F
+0xB3E1 0x68B6
+0xB3E2 0x9C0D
+0xB3E3 0x6F5F
+0xB3E4 0x5272
+0xB3E5 0x559D
+0xB3E6 0x6070
+0xB3E7 0x62EC
+0xB3E8 0x6D3B
+0xB3E9 0x6E07
+0xB3EA 0x6ED1
+0xB3EB 0x845B
+0xB3EC 0x8910
+0xB3ED 0x8F44
+0xB3EE 0x4E14
+0xB3EF 0x9C39
+0xB3F0 0x53F6
+0xB3F1 0x691B
+0xB3F2 0x6A3A
+0xB3F3 0x9784
+0xB3F4 0x682A
+0xB3F5 0x515C
+0xB3F6 0x7AC3
+0xB3F7 0x84B2
+0xB3F8 0x91DC
+0xB3F9 0x938C
+0xB3FA 0x565B
+0xB3FB 0x9D28
+0xB3FC 0x6822
+0xB3FD 0x8305
+0xB3FE 0x8431
+0xB4A1 0x7CA5
+0xB4A2 0x5208
+0xB4A3 0x82C5
+0xB4A4 0x74E6
+0xB4A5 0x4E7E
+0xB4A6 0x4F83
+0xB4A7 0x51A0
+0xB4A8 0x5BD2
+0xB4A9 0x520A
+0xB4AA 0x52D8
+0xB4AB 0x52E7
+0xB4AC 0x5DFB
+0xB4AD 0x559A
+0xB4AE 0x582A
+0xB4AF 0x59E6
+0xB4B0 0x5B8C
+0xB4B1 0x5B98
+0xB4B2 0x5BDB
+0xB4B3 0x5E72
+0xB4B4 0x5E79
+0xB4B5 0x60A3
+0xB4B6 0x611F
+0xB4B7 0x6163
+0xB4B8 0x61BE
+0xB4B9 0x63DB
+0xB4BA 0x6562
+0xB4BB 0x67D1
+0xB4BC 0x6853
+0xB4BD 0x68FA
+0xB4BE 0x6B3E
+0xB4BF 0x6B53
+0xB4C0 0x6C57
+0xB4C1 0x6F22
+0xB4C2 0x6F97
+0xB4C3 0x6F45
+0xB4C4 0x74B0
+0xB4C5 0x7518
+0xB4C6 0x76E3
+0xB4C7 0x770B
+0xB4C8 0x7AFF
+0xB4C9 0x7BA1
+0xB4CA 0x7C21
+0xB4CB 0x7DE9
+0xB4CC 0x7F36
+0xB4CD 0x7FF0
+0xB4CE 0x809D
+0xB4CF 0x8266
+0xB4D0 0x839E
+0xB4D1 0x89B3
+0xB4D2 0x8ACC
+0xB4D3 0x8CAB
+0xB4D4 0x9084
+0xB4D5 0x9451
+0xB4D6 0x9593
+0xB4D7 0x9591
+0xB4D8 0x95A2
+0xB4D9 0x9665
+0xB4DA 0x97D3
+0xB4DB 0x9928
+0xB4DC 0x8218
+0xB4DD 0x4E38
+0xB4DE 0x542B
+0xB4DF 0x5CB8
+0xB4E0 0x5DCC
+0xB4E1 0x73A9
+0xB4E2 0x764C
+0xB4E3 0x773C
+0xB4E4 0x5CA9
+0xB4E5 0x7FEB
+0xB4E6 0x8D0B
+0xB4E7 0x96C1
+0xB4E8 0x9811
+0xB4E9 0x9854
+0xB4EA 0x9858
+0xB4EB 0x4F01
+0xB4EC 0x4F0E
+0xB4ED 0x5371
+0xB4EE 0x559C
+0xB4EF 0x5668
+0xB4F0 0x57FA
+0xB4F1 0x5947
+0xB4F2 0x5B09
+0xB4F3 0x5BC4
+0xB4F4 0x5C90
+0xB4F5 0x5E0C
+0xB4F6 0x5E7E
+0xB4F7 0x5FCC
+0xB4F8 0x63EE
+0xB4F9 0x673A
+0xB4FA 0x65D7
+0xB4FB 0x65E2
+0xB4FC 0x671F
+0xB4FD 0x68CB
+0xB4FE 0x68C4
+0xB5A1 0x6A5F
+0xB5A2 0x5E30
+0xB5A3 0x6BC5
+0xB5A4 0x6C17
+0xB5A5 0x6C7D
+0xB5A6 0x757F
+0xB5A7 0x7948
+0xB5A8 0x5B63
+0xB5A9 0x7A00
+0xB5AA 0x7D00
+0xB5AB 0x5FBD
+0xB5AC 0x898F
+0xB5AD 0x8A18
+0xB5AE 0x8CB4
+0xB5AF 0x8D77
+0xB5B0 0x8ECC
+0xB5B1 0x8F1D
+0xB5B2 0x98E2
+0xB5B3 0x9A0E
+0xB5B4 0x9B3C
+0xB5B5 0x4E80
+0xB5B6 0x507D
+0xB5B7 0x5100
+0xB5B8 0x5993
+0xB5B9 0x5B9C
+0xB5BA 0x622F
+0xB5BB 0x6280
+0xB5BC 0x64EC
+0xB5BD 0x6B3A
+0xB5BE 0x72A0
+0xB5BF 0x7591
+0xB5C0 0x7947
+0xB5C1 0x7FA9
+0xB5C2 0x87FB
+0xB5C3 0x8ABC
+0xB5C4 0x8B70
+0xB5C5 0x63AC
+0xB5C6 0x83CA
+0xB5C7 0x97A0
+0xB5C8 0x5409
+0xB5C9 0x5403
+0xB5CA 0x55AB
+0xB5CB 0x6854
+0xB5CC 0x6A58
+0xB5CD 0x8A70
+0xB5CE 0x7827
+0xB5CF 0x6775
+0xB5D0 0x9ECD
+0xB5D1 0x5374
+0xB5D2 0x5BA2
+0xB5D3 0x811A
+0xB5D4 0x8650
+0xB5D5 0x9006
+0xB5D6 0x4E18
+0xB5D7 0x4E45
+0xB5D8 0x4EC7
+0xB5D9 0x4F11
+0xB5DA 0x53CA
+0xB5DB 0x5438
+0xB5DC 0x5BAE
+0xB5DD 0x5F13
+0xB5DE 0x6025
+0xB5DF 0x6551
+0xB5E0 0x673D
+0xB5E1 0x6C42
+0xB5E2 0x6C72
+0xB5E3 0x6CE3
+0xB5E4 0x7078
+0xB5E5 0x7403
+0xB5E6 0x7A76
+0xB5E7 0x7AAE
+0xB5E8 0x7B08
+0xB5E9 0x7D1A
+0xB5EA 0x7CFE
+0xB5EB 0x7D66
+0xB5EC 0x65E7
+0xB5ED 0x725B
+0xB5EE 0x53BB
+0xB5EF 0x5C45
+0xB5F0 0x5DE8
+0xB5F1 0x62D2
+0xB5F2 0x62E0
+0xB5F3 0x6319
+0xB5F4 0x6E20
+0xB5F5 0x865A
+0xB5F6 0x8A31
+0xB5F7 0x8DDD
+0xB5F8 0x92F8
+0xB5F9 0x6F01
+0xB5FA 0x79A6
+0xB5FB 0x9B5A
+0xB5FC 0x4EA8
+0xB5FD 0x4EAB
+0xB5FE 0x4EAC
+0xB6A1 0x4F9B
+0xB6A2 0x4FA0
+0xB6A3 0x50D1
+0xB6A4 0x5147
+0xB6A5 0x7AF6
+0xB6A6 0x5171
+0xB6A7 0x51F6
+0xB6A8 0x5354
+0xB6A9 0x5321
+0xB6AA 0x537F
+0xB6AB 0x53EB
+0xB6AC 0x55AC
+0xB6AD 0x5883
+0xB6AE 0x5CE1
+0xB6AF 0x5F37
+0xB6B0 0x5F4A
+0xB6B1 0x602F
+0xB6B2 0x6050
+0xB6B3 0x606D
+0xB6B4 0x631F
+0xB6B5 0x6559
+0xB6B6 0x6A4B
+0xB6B7 0x6CC1
+0xB6B8 0x72C2
+0xB6B9 0x72ED
+0xB6BA 0x77EF
+0xB6BB 0x80F8
+0xB6BC 0x8105
+0xB6BD 0x8208
+0xB6BE 0x854E
+0xB6BF 0x90F7
+0xB6C0 0x93E1
+0xB6C1 0x97FF
+0xB6C2 0x9957
+0xB6C3 0x9A5A
+0xB6C4 0x4EF0
+0xB6C5 0x51DD
+0xB6C6 0x5C2D
+0xB6C7 0x6681
+0xB6C8 0x696D
+0xB6C9 0x5C40
+0xB6CA 0x66F2
+0xB6CB 0x6975
+0xB6CC 0x7389
+0xB6CD 0x6850
+0xB6CE 0x7C81
+0xB6CF 0x50C5
+0xB6D0 0x52E4
+0xB6D1 0x5747
+0xB6D2 0x5DFE
+0xB6D3 0x9326
+0xB6D4 0x65A4
+0xB6D5 0x6B23
+0xB6D6 0x6B3D
+0xB6D7 0x7434
+0xB6D8 0x7981
+0xB6D9 0x79BD
+0xB6DA 0x7B4B
+0xB6DB 0x7DCA
+0xB6DC 0x82B9
+0xB6DD 0x83CC
+0xB6DE 0x887F
+0xB6DF 0x895F
+0xB6E0 0x8B39
+0xB6E1 0x8FD1
+0xB6E2 0x91D1
+0xB6E3 0x541F
+0xB6E4 0x9280
+0xB6E5 0x4E5D
+0xB6E6 0x5036
+0xB6E7 0x53E5
+0xB6E8 0x533A
+0xB6E9 0x72D7
+0xB6EA 0x7396
+0xB6EB 0x77E9
+0xB6EC 0x82E6
+0xB6ED 0x8EAF
+0xB6EE 0x99C6
+0xB6EF 0x99C8
+0xB6F0 0x99D2
+0xB6F1 0x5177
+0xB6F2 0x611A
+0xB6F3 0x865E
+0xB6F4 0x55B0
+0xB6F5 0x7A7A
+0xB6F6 0x5076
+0xB6F7 0x5BD3
+0xB6F8 0x9047
+0xB6F9 0x9685
+0xB6FA 0x4E32
+0xB6FB 0x6ADB
+0xB6FC 0x91E7
+0xB6FD 0x5C51
+0xB6FE 0x5C48
+0xB7A1 0x6398
+0xB7A2 0x7A9F
+0xB7A3 0x6C93
+0xB7A4 0x9774
+0xB7A5 0x8F61
+0xB7A6 0x7AAA
+0xB7A7 0x718A
+0xB7A8 0x9688
+0xB7A9 0x7C82
+0xB7AA 0x6817
+0xB7AB 0x7E70
+0xB7AC 0x6851
+0xB7AD 0x936C
+0xB7AE 0x52F2
+0xB7AF 0x541B
+0xB7B0 0x85AB
+0xB7B1 0x8A13
+0xB7B2 0x7FA4
+0xB7B3 0x8ECD
+0xB7B4 0x90E1
+0xB7B5 0x5366
+0xB7B6 0x8888
+0xB7B7 0x7941
+0xB7B8 0x4FC2
+0xB7B9 0x50BE
+0xB7BA 0x5211
+0xB7BB 0x5144
+0xB7BC 0x5553
+0xB7BD 0x572D
+0xB7BE 0x73EA
+0xB7BF 0x578B
+0xB7C0 0x5951
+0xB7C1 0x5F62
+0xB7C2 0x5F84
+0xB7C3 0x6075
+0xB7C4 0x6176
+0xB7C5 0x6167
+0xB7C6 0x61A9
+0xB7C7 0x63B2
+0xB7C8 0x643A
+0xB7C9 0x656C
+0xB7CA 0x666F
+0xB7CB 0x6842
+0xB7CC 0x6E13
+0xB7CD 0x7566
+0xB7CE 0x7A3D
+0xB7CF 0x7CFB
+0xB7D0 0x7D4C
+0xB7D1 0x7D99
+0xB7D2 0x7E4B
+0xB7D3 0x7F6B
+0xB7D4 0x830E
+0xB7D5 0x834A
+0xB7D6 0x86CD
+0xB7D7 0x8A08
+0xB7D8 0x8A63
+0xB7D9 0x8B66
+0xB7DA 0x8EFD
+0xB7DB 0x981A
+0xB7DC 0x9D8F
+0xB7DD 0x82B8
+0xB7DE 0x8FCE
+0xB7DF 0x9BE8
+0xB7E0 0x5287
+0xB7E1 0x621F
+0xB7E2 0x6483
+0xB7E3 0x6FC0
+0xB7E4 0x9699
+0xB7E5 0x6841
+0xB7E6 0x5091
+0xB7E7 0x6B20
+0xB7E8 0x6C7A
+0xB7E9 0x6F54
+0xB7EA 0x7A74
+0xB7EB 0x7D50
+0xB7EC 0x8840
+0xB7ED 0x8A23
+0xB7EE 0x6708
+0xB7EF 0x4EF6
+0xB7F0 0x5039
+0xB7F1 0x5026
+0xB7F2 0x5065
+0xB7F3 0x517C
+0xB7F4 0x5238
+0xB7F5 0x5263
+0xB7F6 0x55A7
+0xB7F7 0x570F
+0xB7F8 0x5805
+0xB7F9 0x5ACC
+0xB7FA 0x5EFA
+0xB7FB 0x61B2
+0xB7FC 0x61F8
+0xB7FD 0x62F3
+0xB7FE 0x6372
+0xB8A1 0x691C
+0xB8A2 0x6A29
+0xB8A3 0x727D
+0xB8A4 0x72AC
+0xB8A5 0x732E
+0xB8A6 0x7814
+0xB8A7 0x786F
+0xB8A8 0x7D79
+0xB8A9 0x770C
+0xB8AA 0x80A9
+0xB8AB 0x898B
+0xB8AC 0x8B19
+0xB8AD 0x8CE2
+0xB8AE 0x8ED2
+0xB8AF 0x9063
+0xB8B0 0x9375
+0xB8B1 0x967A
+0xB8B2 0x9855
+0xB8B3 0x9A13
+0xB8B4 0x9E78
+0xB8B5 0x5143
+0xB8B6 0x539F
+0xB8B7 0x53B3
+0xB8B8 0x5E7B
+0xB8B9 0x5F26
+0xB8BA 0x6E1B
+0xB8BB 0x6E90
+0xB8BC 0x7384
+0xB8BD 0x73FE
+0xB8BE 0x7D43
+0xB8BF 0x8237
+0xB8C0 0x8A00
+0xB8C1 0x8AFA
+0xB8C2 0x9650
+0xB8C3 0x4E4E
+0xB8C4 0x500B
+0xB8C5 0x53E4
+0xB8C6 0x547C
+0xB8C7 0x56FA
+0xB8C8 0x59D1
+0xB8C9 0x5B64
+0xB8CA 0x5DF1
+0xB8CB 0x5EAB
+0xB8CC 0x5F27
+0xB8CD 0x6238
+0xB8CE 0x6545
+0xB8CF 0x67AF
+0xB8D0 0x6E56
+0xB8D1 0x72D0
+0xB8D2 0x7CCA
+0xB8D3 0x88B4
+0xB8D4 0x80A1
+0xB8D5 0x80E1
+0xB8D6 0x83F0
+0xB8D7 0x864E
+0xB8D8 0x8A87
+0xB8D9 0x8DE8
+0xB8DA 0x9237
+0xB8DB 0x96C7
+0xB8DC 0x9867
+0xB8DD 0x9F13
+0xB8DE 0x4E94
+0xB8DF 0x4E92
+0xB8E0 0x4F0D
+0xB8E1 0x5348
+0xB8E2 0x5449
+0xB8E3 0x543E
+0xB8E4 0x5A2F
+0xB8E5 0x5F8C
+0xB8E6 0x5FA1
+0xB8E7 0x609F
+0xB8E8 0x68A7
+0xB8E9 0x6A8E
+0xB8EA 0x745A
+0xB8EB 0x7881
+0xB8EC 0x8A9E
+0xB8ED 0x8AA4
+0xB8EE 0x8B77
+0xB8EF 0x9190
+0xB8F0 0x4E5E
+0xB8F1 0x9BC9
+0xB8F2 0x4EA4
+0xB8F3 0x4F7C
+0xB8F4 0x4FAF
+0xB8F5 0x5019
+0xB8F6 0x5016
+0xB8F7 0x5149
+0xB8F8 0x516C
+0xB8F9 0x529F
+0xB8FA 0x52B9
+0xB8FB 0x52FE
+0xB8FC 0x539A
+0xB8FD 0x53E3
+0xB8FE 0x5411
+0xB9A1 0x540E
+0xB9A2 0x5589
+0xB9A3 0x5751
+0xB9A4 0x57A2
+0xB9A5 0x597D
+0xB9A6 0x5B54
+0xB9A7 0x5B5D
+0xB9A8 0x5B8F
+0xB9A9 0x5DE5
+0xB9AA 0x5DE7
+0xB9AB 0x5DF7
+0xB9AC 0x5E78
+0xB9AD 0x5E83
+0xB9AE 0x5E9A
+0xB9AF 0x5EB7
+0xB9B0 0x5F18
+0xB9B1 0x6052
+0xB9B2 0x614C
+0xB9B3 0x6297
+0xB9B4 0x62D8
+0xB9B5 0x63A7
+0xB9B6 0x653B
+0xB9B7 0x6602
+0xB9B8 0x6643
+0xB9B9 0x66F4
+0xB9BA 0x676D
+0xB9BB 0x6821
+0xB9BC 0x6897
+0xB9BD 0x69CB
+0xB9BE 0x6C5F
+0xB9BF 0x6D2A
+0xB9C0 0x6D69
+0xB9C1 0x6E2F
+0xB9C2 0x6E9D
+0xB9C3 0x7532
+0xB9C4 0x7687
+0xB9C5 0x786C
+0xB9C6 0x7A3F
+0xB9C7 0x7CE0
+0xB9C8 0x7D05
+0xB9C9 0x7D18
+0xB9CA 0x7D5E
+0xB9CB 0x7DB1
+0xB9CC 0x8015
+0xB9CD 0x8003
+0xB9CE 0x80AF
+0xB9CF 0x80B1
+0xB9D0 0x8154
+0xB9D1 0x818F
+0xB9D2 0x822A
+0xB9D3 0x8352
+0xB9D4 0x884C
+0xB9D5 0x8861
+0xB9D6 0x8B1B
+0xB9D7 0x8CA2
+0xB9D8 0x8CFC
+0xB9D9 0x90CA
+0xB9DA 0x9175
+0xB9DB 0x9271
+0xB9DC 0x783F
+0xB9DD 0x92FC
+0xB9DE 0x95A4
+0xB9DF 0x964D
+0xB9E0 0x9805
+0xB9E1 0x9999
+0xB9E2 0x9AD8
+0xB9E3 0x9D3B
+0xB9E4 0x525B
+0xB9E5 0x52AB
+0xB9E6 0x53F7
+0xB9E7 0x5408
+0xB9E8 0x58D5
+0xB9E9 0x62F7
+0xB9EA 0x6FE0
+0xB9EB 0x8C6A
+0xB9EC 0x8F5F
+0xB9ED 0x9EB9
+0xB9EE 0x514B
+0xB9EF 0x523B
+0xB9F0 0x544A
+0xB9F1 0x56FD
+0xB9F2 0x7A40
+0xB9F3 0x9177
+0xB9F4 0x9D60
+0xB9F5 0x9ED2
+0xB9F6 0x7344
+0xB9F7 0x6F09
+0xB9F8 0x8170
+0xB9F9 0x7511
+0xB9FA 0x5FFD
+0xB9FB 0x60DA
+0xB9FC 0x9AA8
+0xB9FD 0x72DB
+0xB9FE 0x8FBC
+0xBAA1 0x6B64
+0xBAA2 0x9803
+0xBAA3 0x4ECA
+0xBAA4 0x56F0
+0xBAA5 0x5764
+0xBAA6 0x58BE
+0xBAA7 0x5A5A
+0xBAA8 0x6068
+0xBAA9 0x61C7
+0xBAAA 0x660F
+0xBAAB 0x6606
+0xBAAC 0x6839
+0xBAAD 0x68B1
+0xBAAE 0x6DF7
+0xBAAF 0x75D5
+0xBAB0 0x7D3A
+0xBAB1 0x826E
+0xBAB2 0x9B42
+0xBAB3 0x4E9B
+0xBAB4 0x4F50
+0xBAB5 0x53C9
+0xBAB6 0x5506
+0xBAB7 0x5D6F
+0xBAB8 0x5DE6
+0xBAB9 0x5DEE
+0xBABA 0x67FB
+0xBABB 0x6C99
+0xBABC 0x7473
+0xBABD 0x7802
+0xBABE 0x8A50
+0xBABF 0x9396
+0xBAC0 0x88DF
+0xBAC1 0x5750
+0xBAC2 0x5EA7
+0xBAC3 0x632B
+0xBAC4 0x50B5
+0xBAC5 0x50AC
+0xBAC6 0x518D
+0xBAC7 0x6700
+0xBAC8 0x54C9
+0xBAC9 0x585E
+0xBACA 0x59BB
+0xBACB 0x5BB0
+0xBACC 0x5F69
+0xBACD 0x624D
+0xBACE 0x63A1
+0xBACF 0x683D
+0xBAD0 0x6B73
+0xBAD1 0x6E08
+0xBAD2 0x707D
+0xBAD3 0x91C7
+0xBAD4 0x7280
+0xBAD5 0x7815
+0xBAD6 0x7826
+0xBAD7 0x796D
+0xBAD8 0x658E
+0xBAD9 0x7D30
+0xBADA 0x83DC
+0xBADB 0x88C1
+0xBADC 0x8F09
+0xBADD 0x969B
+0xBADE 0x5264
+0xBADF 0x5728
+0xBAE0 0x6750
+0xBAE1 0x7F6A
+0xBAE2 0x8CA1
+0xBAE3 0x51B4
+0xBAE4 0x5742
+0xBAE5 0x962A
+0xBAE6 0x583A
+0xBAE7 0x698A
+0xBAE8 0x80B4
+0xBAE9 0x54B2
+0xBAEA 0x5D0E
+0xBAEB 0x57FC
+0xBAEC 0x7895
+0xBAED 0x9DFA
+0xBAEE 0x4F5C
+0xBAEF 0x524A
+0xBAF0 0x548B
+0xBAF1 0x643E
+0xBAF2 0x6628
+0xBAF3 0x6714
+0xBAF4 0x67F5
+0xBAF5 0x7A84
+0xBAF6 0x7B56
+0xBAF7 0x7D22
+0xBAF8 0x932F
+0xBAF9 0x685C
+0xBAFA 0x9BAD
+0xBAFB 0x7B39
+0xBAFC 0x5319
+0xBAFD 0x518A
+0xBAFE 0x5237
+0xBBA1 0x5BDF
+0xBBA2 0x62F6
+0xBBA3 0x64AE
+0xBBA4 0x64E6
+0xBBA5 0x672D
+0xBBA6 0x6BBA
+0xBBA7 0x85A9
+0xBBA8 0x96D1
+0xBBA9 0x7690
+0xBBAA 0x9BD6
+0xBBAB 0x634C
+0xBBAC 0x9306
+0xBBAD 0x9BAB
+0xBBAE 0x76BF
+0xBBAF 0x6652
+0xBBB0 0x4E09
+0xBBB1 0x5098
+0xBBB2 0x53C2
+0xBBB3 0x5C71
+0xBBB4 0x60E8
+0xBBB5 0x6492
+0xBBB6 0x6563
+0xBBB7 0x685F
+0xBBB8 0x71E6
+0xBBB9 0x73CA
+0xBBBA 0x7523
+0xBBBB 0x7B97
+0xBBBC 0x7E82
+0xBBBD 0x8695
+0xBBBE 0x8B83
+0xBBBF 0x8CDB
+0xBBC0 0x9178
+0xBBC1 0x9910
+0xBBC2 0x65AC
+0xBBC3 0x66AB
+0xBBC4 0x6B8B
+0xBBC5 0x4ED5
+0xBBC6 0x4ED4
+0xBBC7 0x4F3A
+0xBBC8 0x4F7F
+0xBBC9 0x523A
+0xBBCA 0x53F8
+0xBBCB 0x53F2
+0xBBCC 0x55E3
+0xBBCD 0x56DB
+0xBBCE 0x58EB
+0xBBCF 0x59CB
+0xBBD0 0x59C9
+0xBBD1 0x59FF
+0xBBD2 0x5B50
+0xBBD3 0x5C4D
+0xBBD4 0x5E02
+0xBBD5 0x5E2B
+0xBBD6 0x5FD7
+0xBBD7 0x601D
+0xBBD8 0x6307
+0xBBD9 0x652F
+0xBBDA 0x5B5C
+0xBBDB 0x65AF
+0xBBDC 0x65BD
+0xBBDD 0x65E8
+0xBBDE 0x679D
+0xBBDF 0x6B62
+0xBBE0 0x6B7B
+0xBBE1 0x6C0F
+0xBBE2 0x7345
+0xBBE3 0x7949
+0xBBE4 0x79C1
+0xBBE5 0x7CF8
+0xBBE6 0x7D19
+0xBBE7 0x7D2B
+0xBBE8 0x80A2
+0xBBE9 0x8102
+0xBBEA 0x81F3
+0xBBEB 0x8996
+0xBBEC 0x8A5E
+0xBBED 0x8A69
+0xBBEE 0x8A66
+0xBBEF 0x8A8C
+0xBBF0 0x8AEE
+0xBBF1 0x8CC7
+0xBBF2 0x8CDC
+0xBBF3 0x96CC
+0xBBF4 0x98FC
+0xBBF5 0x6B6F
+0xBBF6 0x4E8B
+0xBBF7 0x4F3C
+0xBBF8 0x4F8D
+0xBBF9 0x5150
+0xBBFA 0x5B57
+0xBBFB 0x5BFA
+0xBBFC 0x6148
+0xBBFD 0x6301
+0xBBFE 0x6642
+0xBCA1 0x6B21
+0xBCA2 0x6ECB
+0xBCA3 0x6CBB
+0xBCA4 0x723E
+0xBCA5 0x74BD
+0xBCA6 0x75D4
+0xBCA7 0x78C1
+0xBCA8 0x793A
+0xBCA9 0x800C
+0xBCAA 0x8033
+0xBCAB 0x81EA
+0xBCAC 0x8494
+0xBCAD 0x8F9E
+0xBCAE 0x6C50
+0xBCAF 0x9E7F
+0xBCB0 0x5F0F
+0xBCB1 0x8B58
+0xBCB2 0x9D2B
+0xBCB3 0x7AFA
+0xBCB4 0x8EF8
+0xBCB5 0x5B8D
+0xBCB6 0x96EB
+0xBCB7 0x4E03
+0xBCB8 0x53F1
+0xBCB9 0x57F7
+0xBCBA 0x5931
+0xBCBB 0x5AC9
+0xBCBC 0x5BA4
+0xBCBD 0x6089
+0xBCBE 0x6E7F
+0xBCBF 0x6F06
+0xBCC0 0x75BE
+0xBCC1 0x8CEA
+0xBCC2 0x5B9F
+0xBCC3 0x8500
+0xBCC4 0x7BE0
+0xBCC5 0x5072
+0xBCC6 0x67F4
+0xBCC7 0x829D
+0xBCC8 0x5C61
+0xBCC9 0x854A
+0xBCCA 0x7E1E
+0xBCCB 0x820E
+0xBCCC 0x5199
+0xBCCD 0x5C04
+0xBCCE 0x6368
+0xBCCF 0x8D66
+0xBCD0 0x659C
+0xBCD1 0x716E
+0xBCD2 0x793E
+0xBCD3 0x7D17
+0xBCD4 0x8005
+0xBCD5 0x8B1D
+0xBCD6 0x8ECA
+0xBCD7 0x906E
+0xBCD8 0x86C7
+0xBCD9 0x90AA
+0xBCDA 0x501F
+0xBCDB 0x52FA
+0xBCDC 0x5C3A
+0xBCDD 0x6753
+0xBCDE 0x707C
+0xBCDF 0x7235
+0xBCE0 0x914C
+0xBCE1 0x91C8
+0xBCE2 0x932B
+0xBCE3 0x82E5
+0xBCE4 0x5BC2
+0xBCE5 0x5F31
+0xBCE6 0x60F9
+0xBCE7 0x4E3B
+0xBCE8 0x53D6
+0xBCE9 0x5B88
+0xBCEA 0x624B
+0xBCEB 0x6731
+0xBCEC 0x6B8A
+0xBCED 0x72E9
+0xBCEE 0x73E0
+0xBCEF 0x7A2E
+0xBCF0 0x816B
+0xBCF1 0x8DA3
+0xBCF2 0x9152
+0xBCF3 0x9996
+0xBCF4 0x5112
+0xBCF5 0x53D7
+0xBCF6 0x546A
+0xBCF7 0x5BFF
+0xBCF8 0x6388
+0xBCF9 0x6A39
+0xBCFA 0x7DAC
+0xBCFB 0x9700
+0xBCFC 0x56DA
+0xBCFD 0x53CE
+0xBCFE 0x5468
+0xBDA1 0x5B97
+0xBDA2 0x5C31
+0xBDA3 0x5DDE
+0xBDA4 0x4FEE
+0xBDA5 0x6101
+0xBDA6 0x62FE
+0xBDA7 0x6D32
+0xBDA8 0x79C0
+0xBDA9 0x79CB
+0xBDAA 0x7D42
+0xBDAB 0x7E4D
+0xBDAC 0x7FD2
+0xBDAD 0x81ED
+0xBDAE 0x821F
+0xBDAF 0x8490
+0xBDB0 0x8846
+0xBDB1 0x8972
+0xBDB2 0x8B90
+0xBDB3 0x8E74
+0xBDB4 0x8F2F
+0xBDB5 0x9031
+0xBDB6 0x914B
+0xBDB7 0x916C
+0xBDB8 0x96C6
+0xBDB9 0x919C
+0xBDBA 0x4EC0
+0xBDBB 0x4F4F
+0xBDBC 0x5145
+0xBDBD 0x5341
+0xBDBE 0x5F93
+0xBDBF 0x620E
+0xBDC0 0x67D4
+0xBDC1 0x6C41
+0xBDC2 0x6E0B
+0xBDC3 0x7363
+0xBDC4 0x7E26
+0xBDC5 0x91CD
+0xBDC6 0x9283
+0xBDC7 0x53D4
+0xBDC8 0x5919
+0xBDC9 0x5BBF
+0xBDCA 0x6DD1
+0xBDCB 0x795D
+0xBDCC 0x7E2E
+0xBDCD 0x7C9B
+0xBDCE 0x587E
+0xBDCF 0x719F
+0xBDD0 0x51FA
+0xBDD1 0x8853
+0xBDD2 0x8FF0
+0xBDD3 0x4FCA
+0xBDD4 0x5CFB
+0xBDD5 0x6625
+0xBDD6 0x77AC
+0xBDD7 0x7AE3
+0xBDD8 0x821C
+0xBDD9 0x99FF
+0xBDDA 0x51C6
+0xBDDB 0x5FAA
+0xBDDC 0x65EC
+0xBDDD 0x696F
+0xBDDE 0x6B89
+0xBDDF 0x6DF3
+0xBDE0 0x6E96
+0xBDE1 0x6F64
+0xBDE2 0x76FE
+0xBDE3 0x7D14
+0xBDE4 0x5DE1
+0xBDE5 0x9075
+0xBDE6 0x9187
+0xBDE7 0x9806
+0xBDE8 0x51E6
+0xBDE9 0x521D
+0xBDEA 0x6240
+0xBDEB 0x6691
+0xBDEC 0x66D9
+0xBDED 0x6E1A
+0xBDEE 0x5EB6
+0xBDEF 0x7DD2
+0xBDF0 0x7F72
+0xBDF1 0x66F8
+0xBDF2 0x85AF
+0xBDF3 0x85F7
+0xBDF4 0x8AF8
+0xBDF5 0x52A9
+0xBDF6 0x53D9
+0xBDF7 0x5973
+0xBDF8 0x5E8F
+0xBDF9 0x5F90
+0xBDFA 0x6055
+0xBDFB 0x92E4
+0xBDFC 0x9664
+0xBDFD 0x50B7
+0xBDFE 0x511F
+0xBEA1 0x52DD
+0xBEA2 0x5320
+0xBEA3 0x5347
+0xBEA4 0x53EC
+0xBEA5 0x54E8
+0xBEA6 0x5546
+0xBEA7 0x5531
+0xBEA8 0x5617
+0xBEA9 0x5968
+0xBEAA 0x59BE
+0xBEAB 0x5A3C
+0xBEAC 0x5BB5
+0xBEAD 0x5C06
+0xBEAE 0x5C0F
+0xBEAF 0x5C11
+0xBEB0 0x5C1A
+0xBEB1 0x5E84
+0xBEB2 0x5E8A
+0xBEB3 0x5EE0
+0xBEB4 0x5F70
+0xBEB5 0x627F
+0xBEB6 0x6284
+0xBEB7 0x62DB
+0xBEB8 0x638C
+0xBEB9 0x6377
+0xBEBA 0x6607
+0xBEBB 0x660C
+0xBEBC 0x662D
+0xBEBD 0x6676
+0xBEBE 0x677E
+0xBEBF 0x68A2
+0xBEC0 0x6A1F
+0xBEC1 0x6A35
+0xBEC2 0x6CBC
+0xBEC3 0x6D88
+0xBEC4 0x6E09
+0xBEC5 0x6E58
+0xBEC6 0x713C
+0xBEC7 0x7126
+0xBEC8 0x7167
+0xBEC9 0x75C7
+0xBECA 0x7701
+0xBECB 0x785D
+0xBECC 0x7901
+0xBECD 0x7965
+0xBECE 0x79F0
+0xBECF 0x7AE0
+0xBED0 0x7B11
+0xBED1 0x7CA7
+0xBED2 0x7D39
+0xBED3 0x8096
+0xBED4 0x83D6
+0xBED5 0x848B
+0xBED6 0x8549
+0xBED7 0x885D
+0xBED8 0x88F3
+0xBED9 0x8A1F
+0xBEDA 0x8A3C
+0xBEDB 0x8A54
+0xBEDC 0x8A73
+0xBEDD 0x8C61
+0xBEDE 0x8CDE
+0xBEDF 0x91A4
+0xBEE0 0x9266
+0xBEE1 0x937E
+0xBEE2 0x9418
+0xBEE3 0x969C
+0xBEE4 0x9798
+0xBEE5 0x4E0A
+0xBEE6 0x4E08
+0xBEE7 0x4E1E
+0xBEE8 0x4E57
+0xBEE9 0x5197
+0xBEEA 0x5270
+0xBEEB 0x57CE
+0xBEEC 0x5834
+0xBEED 0x58CC
+0xBEEE 0x5B22
+0xBEEF 0x5E38
+0xBEF0 0x60C5
+0xBEF1 0x64FE
+0xBEF2 0x6761
+0xBEF3 0x6756
+0xBEF4 0x6D44
+0xBEF5 0x72B6
+0xBEF6 0x7573
+0xBEF7 0x7A63
+0xBEF8 0x84B8
+0xBEF9 0x8B72
+0xBEFA 0x91B8
+0xBEFB 0x9320
+0xBEFC 0x5631
+0xBEFD 0x57F4
+0xBEFE 0x98FE
+0xBFA1 0x62ED
+0xBFA2 0x690D
+0xBFA3 0x6B96
+0xBFA4 0x71ED
+0xBFA5 0x7E54
+0xBFA6 0x8077
+0xBFA7 0x8272
+0xBFA8 0x89E6
+0xBFA9 0x98DF
+0xBFAA 0x8755
+0xBFAB 0x8FB1
+0xBFAC 0x5C3B
+0xBFAD 0x4F38
+0xBFAE 0x4FE1
+0xBFAF 0x4FB5
+0xBFB0 0x5507
+0xBFB1 0x5A20
+0xBFB2 0x5BDD
+0xBFB3 0x5BE9
+0xBFB4 0x5FC3
+0xBFB5 0x614E
+0xBFB6 0x632F
+0xBFB7 0x65B0
+0xBFB8 0x664B
+0xBFB9 0x68EE
+0xBFBA 0x699B
+0xBFBB 0x6D78
+0xBFBC 0x6DF1
+0xBFBD 0x7533
+0xBFBE 0x75B9
+0xBFBF 0x771F
+0xBFC0 0x795E
+0xBFC1 0x79E6
+0xBFC2 0x7D33
+0xBFC3 0x81E3
+0xBFC4 0x82AF
+0xBFC5 0x85AA
+0xBFC6 0x89AA
+0xBFC7 0x8A3A
+0xBFC8 0x8EAB
+0xBFC9 0x8F9B
+0xBFCA 0x9032
+0xBFCB 0x91DD
+0xBFCC 0x9707
+0xBFCD 0x4EBA
+0xBFCE 0x4EC1
+0xBFCF 0x5203
+0xBFD0 0x5875
+0xBFD1 0x58EC
+0xBFD2 0x5C0B
+0xBFD3 0x751A
+0xBFD4 0x5C3D
+0xBFD5 0x814E
+0xBFD6 0x8A0A
+0xBFD7 0x8FC5
+0xBFD8 0x9663
+0xBFD9 0x976D
+0xBFDA 0x7B25
+0xBFDB 0x8ACF
+0xBFDC 0x9808
+0xBFDD 0x9162
+0xBFDE 0x56F3
+0xBFDF 0x53A8
+0xBFE0 0x9017
+0xBFE1 0x5439
+0xBFE2 0x5782
+0xBFE3 0x5E25
+0xBFE4 0x63A8
+0xBFE5 0x6C34
+0xBFE6 0x708A
+0xBFE7 0x7761
+0xBFE8 0x7C8B
+0xBFE9 0x7FE0
+0xBFEA 0x8870
+0xBFEB 0x9042
+0xBFEC 0x9154
+0xBFED 0x9310
+0xBFEE 0x9318
+0xBFEF 0x968F
+0xBFF0 0x745E
+0xBFF1 0x9AC4
+0xBFF2 0x5D07
+0xBFF3 0x5D69
+0xBFF4 0x6570
+0xBFF5 0x67A2
+0xBFF6 0x8DA8
+0xBFF7 0x96DB
+0xBFF8 0x636E
+0xBFF9 0x6749
+0xBFFA 0x6919
+0xBFFB 0x83C5
+0xBFFC 0x9817
+0xBFFD 0x96C0
+0xBFFE 0x88FE
+0xC0A1 0x6F84
+0xC0A2 0x647A
+0xC0A3 0x5BF8
+0xC0A4 0x4E16
+0xC0A5 0x702C
+0xC0A6 0x755D
+0xC0A7 0x662F
+0xC0A8 0x51C4
+0xC0A9 0x5236
+0xC0AA 0x52E2
+0xC0AB 0x59D3
+0xC0AC 0x5F81
+0xC0AD 0x6027
+0xC0AE 0x6210
+0xC0AF 0x653F
+0xC0B0 0x6574
+0xC0B1 0x661F
+0xC0B2 0x6674
+0xC0B3 0x68F2
+0xC0B4 0x6816
+0xC0B5 0x6B63
+0xC0B6 0x6E05
+0xC0B7 0x7272
+0xC0B8 0x751F
+0xC0B9 0x76DB
+0xC0BA 0x7CBE
+0xC0BB 0x8056
+0xC0BC 0x58F0
+0xC0BD 0x88FD
+0xC0BE 0x897F
+0xC0BF 0x8AA0
+0xC0C0 0x8A93
+0xC0C1 0x8ACB
+0xC0C2 0x901D
+0xC0C3 0x9192
+0xC0C4 0x9752
+0xC0C5 0x9759
+0xC0C6 0x6589
+0xC0C7 0x7A0E
+0xC0C8 0x8106
+0xC0C9 0x96BB
+0xC0CA 0x5E2D
+0xC0CB 0x60DC
+0xC0CC 0x621A
+0xC0CD 0x65A5
+0xC0CE 0x6614
+0xC0CF 0x6790
+0xC0D0 0x77F3
+0xC0D1 0x7A4D
+0xC0D2 0x7C4D
+0xC0D3 0x7E3E
+0xC0D4 0x810A
+0xC0D5 0x8CAC
+0xC0D6 0x8D64
+0xC0D7 0x8DE1
+0xC0D8 0x8E5F
+0xC0D9 0x78A9
+0xC0DA 0x5207
+0xC0DB 0x62D9
+0xC0DC 0x63A5
+0xC0DD 0x6442
+0xC0DE 0x6298
+0xC0DF 0x8A2D
+0xC0E0 0x7A83
+0xC0E1 0x7BC0
+0xC0E2 0x8AAC
+0xC0E3 0x96EA
+0xC0E4 0x7D76
+0xC0E5 0x820C
+0xC0E6 0x8749
+0xC0E7 0x4ED9
+0xC0E8 0x5148
+0xC0E9 0x5343
+0xC0EA 0x5360
+0xC0EB 0x5BA3
+0xC0EC 0x5C02
+0xC0ED 0x5C16
+0xC0EE 0x5DDD
+0xC0EF 0x6226
+0xC0F0 0x6247
+0xC0F1 0x64B0
+0xC0F2 0x6813
+0xC0F3 0x6834
+0xC0F4 0x6CC9
+0xC0F5 0x6D45
+0xC0F6 0x6D17
+0xC0F7 0x67D3
+0xC0F8 0x6F5C
+0xC0F9 0x714E
+0xC0FA 0x717D
+0xC0FB 0x65CB
+0xC0FC 0x7A7F
+0xC0FD 0x7BAD
+0xC0FE 0x7DDA
+0xC1A1 0x7E4A
+0xC1A2 0x7FA8
+0xC1A3 0x817A
+0xC1A4 0x821B
+0xC1A5 0x8239
+0xC1A6 0x85A6
+0xC1A7 0x8A6E
+0xC1A8 0x8CCE
+0xC1A9 0x8DF5
+0xC1AA 0x9078
+0xC1AB 0x9077
+0xC1AC 0x92AD
+0xC1AD 0x9291
+0xC1AE 0x9583
+0xC1AF 0x9BAE
+0xC1B0 0x524D
+0xC1B1 0x5584
+0xC1B2 0x6F38
+0xC1B3 0x7136
+0xC1B4 0x5168
+0xC1B5 0x7985
+0xC1B6 0x7E55
+0xC1B7 0x81B3
+0xC1B8 0x7CCE
+0xC1B9 0x564C
+0xC1BA 0x5851
+0xC1BB 0x5CA8
+0xC1BC 0x63AA
+0xC1BD 0x66FE
+0xC1BE 0x66FD
+0xC1BF 0x695A
+0xC1C0 0x72D9
+0xC1C1 0x758F
+0xC1C2 0x758E
+0xC1C3 0x790E
+0xC1C4 0x7956
+0xC1C5 0x79DF
+0xC1C6 0x7C97
+0xC1C7 0x7D20
+0xC1C8 0x7D44
+0xC1C9 0x8607
+0xC1CA 0x8A34
+0xC1CB 0x963B
+0xC1CC 0x9061
+0xC1CD 0x9F20
+0xC1CE 0x50E7
+0xC1CF 0x5275
+0xC1D0 0x53CC
+0xC1D1 0x53E2
+0xC1D2 0x5009
+0xC1D3 0x55AA
+0xC1D4 0x58EE
+0xC1D5 0x594F
+0xC1D6 0x723D
+0xC1D7 0x5B8B
+0xC1D8 0x5C64
+0xC1D9 0x531D
+0xC1DA 0x60E3
+0xC1DB 0x60F3
+0xC1DC 0x635C
+0xC1DD 0x6383
+0xC1DE 0x633F
+0xC1DF 0x63BB
+0xC1E0 0x64CD
+0xC1E1 0x65E9
+0xC1E2 0x66F9
+0xC1E3 0x5DE3
+0xC1E4 0x69CD
+0xC1E5 0x69FD
+0xC1E6 0x6F15
+0xC1E7 0x71E5
+0xC1E8 0x4E89
+0xC1E9 0x75E9
+0xC1EA 0x76F8
+0xC1EB 0x7A93
+0xC1EC 0x7CDF
+0xC1ED 0x7DCF
+0xC1EE 0x7D9C
+0xC1EF 0x8061
+0xC1F0 0x8349
+0xC1F1 0x8358
+0xC1F2 0x846C
+0xC1F3 0x84BC
+0xC1F4 0x85FB
+0xC1F5 0x88C5
+0xC1F6 0x8D70
+0xC1F7 0x9001
+0xC1F8 0x906D
+0xC1F9 0x9397
+0xC1FA 0x971C
+0xC1FB 0x9A12
+0xC1FC 0x50CF
+0xC1FD 0x5897
+0xC1FE 0x618E
+0xC2A1 0x81D3
+0xC2A2 0x8535
+0xC2A3 0x8D08
+0xC2A4 0x9020
+0xC2A5 0x4FC3
+0xC2A6 0x5074
+0xC2A7 0x5247
+0xC2A8 0x5373
+0xC2A9 0x606F
+0xC2AA 0x6349
+0xC2AB 0x675F
+0xC2AC 0x6E2C
+0xC2AD 0x8DB3
+0xC2AE 0x901F
+0xC2AF 0x4FD7
+0xC2B0 0x5C5E
+0xC2B1 0x8CCA
+0xC2B2 0x65CF
+0xC2B3 0x7D9A
+0xC2B4 0x5352
+0xC2B5 0x8896
+0xC2B6 0x5176
+0xC2B7 0x63C3
+0xC2B8 0x5B58
+0xC2B9 0x5B6B
+0xC2BA 0x5C0A
+0xC2BB 0x640D
+0xC2BC 0x6751
+0xC2BD 0x905C
+0xC2BE 0x4ED6
+0xC2BF 0x591A
+0xC2C0 0x592A
+0xC2C1 0x6C70
+0xC2C2 0x8A51
+0xC2C3 0x553E
+0xC2C4 0x5815
+0xC2C5 0x59A5
+0xC2C6 0x60F0
+0xC2C7 0x6253
+0xC2C8 0x67C1
+0xC2C9 0x8235
+0xC2CA 0x6955
+0xC2CB 0x9640
+0xC2CC 0x99C4
+0xC2CD 0x9A28
+0xC2CE 0x4F53
+0xC2CF 0x5806
+0xC2D0 0x5BFE
+0xC2D1 0x8010
+0xC2D2 0x5CB1
+0xC2D3 0x5E2F
+0xC2D4 0x5F85
+0xC2D5 0x6020
+0xC2D6 0x614B
+0xC2D7 0x6234
+0xC2D8 0x66FF
+0xC2D9 0x6CF0
+0xC2DA 0x6EDE
+0xC2DB 0x80CE
+0xC2DC 0x817F
+0xC2DD 0x82D4
+0xC2DE 0x888B
+0xC2DF 0x8CB8
+0xC2E0 0x9000
+0xC2E1 0x902E
+0xC2E2 0x968A
+0xC2E3 0x9EDB
+0xC2E4 0x9BDB
+0xC2E5 0x4EE3
+0xC2E6 0x53F0
+0xC2E7 0x5927
+0xC2E8 0x7B2C
+0xC2E9 0x918D
+0xC2EA 0x984C
+0xC2EB 0x9DF9
+0xC2EC 0x6EDD
+0xC2ED 0x7027
+0xC2EE 0x5353
+0xC2EF 0x5544
+0xC2F0 0x5B85
+0xC2F1 0x6258
+0xC2F2 0x629E
+0xC2F3 0x62D3
+0xC2F4 0x6CA2
+0xC2F5 0x6FEF
+0xC2F6 0x7422
+0xC2F7 0x8A17
+0xC2F8 0x9438
+0xC2F9 0x6FC1
+0xC2FA 0x8AFE
+0xC2FB 0x8338
+0xC2FC 0x51E7
+0xC2FD 0x86F8
+0xC2FE 0x53EA
+0xC3A1 0x53E9
+0xC3A2 0x4F46
+0xC3A3 0x9054
+0xC3A4 0x8FB0
+0xC3A5 0x596A
+0xC3A6 0x8131
+0xC3A7 0x5DFD
+0xC3A8 0x7AEA
+0xC3A9 0x8FBF
+0xC3AA 0x68DA
+0xC3AB 0x8C37
+0xC3AC 0x72F8
+0xC3AD 0x9C48
+0xC3AE 0x6A3D
+0xC3AF 0x8AB0
+0xC3B0 0x4E39
+0xC3B1 0x5358
+0xC3B2 0x5606
+0xC3B3 0x5766
+0xC3B4 0x62C5
+0xC3B5 0x63A2
+0xC3B6 0x65E6
+0xC3B7 0x6B4E
+0xC3B8 0x6DE1
+0xC3B9 0x6E5B
+0xC3BA 0x70AD
+0xC3BB 0x77ED
+0xC3BC 0x7AEF
+0xC3BD 0x7BAA
+0xC3BE 0x7DBB
+0xC3BF 0x803D
+0xC3C0 0x80C6
+0xC3C1 0x86CB
+0xC3C2 0x8A95
+0xC3C3 0x935B
+0xC3C4 0x56E3
+0xC3C5 0x58C7
+0xC3C6 0x5F3E
+0xC3C7 0x65AD
+0xC3C8 0x6696
+0xC3C9 0x6A80
+0xC3CA 0x6BB5
+0xC3CB 0x7537
+0xC3CC 0x8AC7
+0xC3CD 0x5024
+0xC3CE 0x77E5
+0xC3CF 0x5730
+0xC3D0 0x5F1B
+0xC3D1 0x6065
+0xC3D2 0x667A
+0xC3D3 0x6C60
+0xC3D4 0x75F4
+0xC3D5 0x7A1A
+0xC3D6 0x7F6E
+0xC3D7 0x81F4
+0xC3D8 0x8718
+0xC3D9 0x9045
+0xC3DA 0x99B3
+0xC3DB 0x7BC9
+0xC3DC 0x755C
+0xC3DD 0x7AF9
+0xC3DE 0x7B51
+0xC3DF 0x84C4
+0xC3E0 0x9010
+0xC3E1 0x79E9
+0xC3E2 0x7A92
+0xC3E3 0x8336
+0xC3E4 0x5AE1
+0xC3E5 0x7740
+0xC3E6 0x4E2D
+0xC3E7 0x4EF2
+0xC3E8 0x5B99
+0xC3E9 0x5FE0
+0xC3EA 0x62BD
+0xC3EB 0x663C
+0xC3EC 0x67F1
+0xC3ED 0x6CE8
+0xC3EE 0x866B
+0xC3EF 0x8877
+0xC3F0 0x8A3B
+0xC3F1 0x914E
+0xC3F2 0x92F3
+0xC3F3 0x99D0
+0xC3F4 0x6A17
+0xC3F5 0x7026
+0xC3F6 0x732A
+0xC3F7 0x82E7
+0xC3F8 0x8457
+0xC3F9 0x8CAF
+0xC3FA 0x4E01
+0xC3FB 0x5146
+0xC3FC 0x51CB
+0xC3FD 0x558B
+0xC3FE 0x5BF5
+0xC4A1 0x5E16
+0xC4A2 0x5E33
+0xC4A3 0x5E81
+0xC4A4 0x5F14
+0xC4A5 0x5F35
+0xC4A6 0x5F6B
+0xC4A7 0x5FB4
+0xC4A8 0x61F2
+0xC4A9 0x6311
+0xC4AA 0x66A2
+0xC4AB 0x671D
+0xC4AC 0x6F6E
+0xC4AD 0x7252
+0xC4AE 0x753A
+0xC4AF 0x773A
+0xC4B0 0x8074
+0xC4B1 0x8139
+0xC4B2 0x8178
+0xC4B3 0x8776
+0xC4B4 0x8ABF
+0xC4B5 0x8ADC
+0xC4B6 0x8D85
+0xC4B7 0x8DF3
+0xC4B8 0x929A
+0xC4B9 0x9577
+0xC4BA 0x9802
+0xC4BB 0x9CE5
+0xC4BC 0x52C5
+0xC4BD 0x6357
+0xC4BE 0x76F4
+0xC4BF 0x6715
+0xC4C0 0x6C88
+0xC4C1 0x73CD
+0xC4C2 0x8CC3
+0xC4C3 0x93AE
+0xC4C4 0x9673
+0xC4C5 0x6D25
+0xC4C6 0x589C
+0xC4C7 0x690E
+0xC4C8 0x69CC
+0xC4C9 0x8FFD
+0xC4CA 0x939A
+0xC4CB 0x75DB
+0xC4CC 0x901A
+0xC4CD 0x585A
+0xC4CE 0x6802
+0xC4CF 0x63B4
+0xC4D0 0x69FB
+0xC4D1 0x4F43
+0xC4D2 0x6F2C
+0xC4D3 0x67D8
+0xC4D4 0x8FBB
+0xC4D5 0x8526
+0xC4D6 0x7DB4
+0xC4D7 0x9354
+0xC4D8 0x693F
+0xC4D9 0x6F70
+0xC4DA 0x576A
+0xC4DB 0x58F7
+0xC4DC 0x5B2C
+0xC4DD 0x7D2C
+0xC4DE 0x722A
+0xC4DF 0x540A
+0xC4E0 0x91E3
+0xC4E1 0x9DB4
+0xC4E2 0x4EAD
+0xC4E3 0x4F4E
+0xC4E4 0x505C
+0xC4E5 0x5075
+0xC4E6 0x5243
+0xC4E7 0x8C9E
+0xC4E8 0x5448
+0xC4E9 0x5824
+0xC4EA 0x5B9A
+0xC4EB 0x5E1D
+0xC4EC 0x5E95
+0xC4ED 0x5EAD
+0xC4EE 0x5EF7
+0xC4EF 0x5F1F
+0xC4F0 0x608C
+0xC4F1 0x62B5
+0xC4F2 0x633A
+0xC4F3 0x63D0
+0xC4F4 0x68AF
+0xC4F5 0x6C40
+0xC4F6 0x7887
+0xC4F7 0x798E
+0xC4F8 0x7A0B
+0xC4F9 0x7DE0
+0xC4FA 0x8247
+0xC4FB 0x8A02
+0xC4FC 0x8AE6
+0xC4FD 0x8E44
+0xC4FE 0x9013
+0xC5A1 0x90B8
+0xC5A2 0x912D
+0xC5A3 0x91D8
+0xC5A4 0x9F0E
+0xC5A5 0x6CE5
+0xC5A6 0x6458
+0xC5A7 0x64E2
+0xC5A8 0x6575
+0xC5A9 0x6EF4
+0xC5AA 0x7684
+0xC5AB 0x7B1B
+0xC5AC 0x9069
+0xC5AD 0x93D1
+0xC5AE 0x6EBA
+0xC5AF 0x54F2
+0xC5B0 0x5FB9
+0xC5B1 0x64A4
+0xC5B2 0x8F4D
+0xC5B3 0x8FED
+0xC5B4 0x9244
+0xC5B5 0x5178
+0xC5B6 0x586B
+0xC5B7 0x5929
+0xC5B8 0x5C55
+0xC5B9 0x5E97
+0xC5BA 0x6DFB
+0xC5BB 0x7E8F
+0xC5BC 0x751C
+0xC5BD 0x8CBC
+0xC5BE 0x8EE2
+0xC5BF 0x985B
+0xC5C0 0x70B9
+0xC5C1 0x4F1D
+0xC5C2 0x6BBF
+0xC5C3 0x6FB1
+0xC5C4 0x7530
+0xC5C5 0x96FB
+0xC5C6 0x514E
+0xC5C7 0x5410
+0xC5C8 0x5835
+0xC5C9 0x5857
+0xC5CA 0x59AC
+0xC5CB 0x5C60
+0xC5CC 0x5F92
+0xC5CD 0x6597
+0xC5CE 0x675C
+0xC5CF 0x6E21
+0xC5D0 0x767B
+0xC5D1 0x83DF
+0xC5D2 0x8CED
+0xC5D3 0x9014
+0xC5D4 0x90FD
+0xC5D5 0x934D
+0xC5D6 0x7825
+0xC5D7 0x783A
+0xC5D8 0x52AA
+0xC5D9 0x5EA6
+0xC5DA 0x571F
+0xC5DB 0x5974
+0xC5DC 0x6012
+0xC5DD 0x5012
+0xC5DE 0x515A
+0xC5DF 0x51AC
+0xC5E0 0x51CD
+0xC5E1 0x5200
+0xC5E2 0x5510
+0xC5E3 0x5854
+0xC5E4 0x5858
+0xC5E5 0x5957
+0xC5E6 0x5B95
+0xC5E7 0x5CF6
+0xC5E8 0x5D8B
+0xC5E9 0x60BC
+0xC5EA 0x6295
+0xC5EB 0x642D
+0xC5EC 0x6771
+0xC5ED 0x6843
+0xC5EE 0x68BC
+0xC5EF 0x68DF
+0xC5F0 0x76D7
+0xC5F1 0x6DD8
+0xC5F2 0x6E6F
+0xC5F3 0x6D9B
+0xC5F4 0x706F
+0xC5F5 0x71C8
+0xC5F6 0x5F53
+0xC5F7 0x75D8
+0xC5F8 0x7977
+0xC5F9 0x7B49
+0xC5FA 0x7B54
+0xC5FB 0x7B52
+0xC5FC 0x7CD6
+0xC5FD 0x7D71
+0xC5FE 0x5230
+0xC6A1 0x8463
+0xC6A2 0x8569
+0xC6A3 0x85E4
+0xC6A4 0x8A0E
+0xC6A5 0x8B04
+0xC6A6 0x8C46
+0xC6A7 0x8E0F
+0xC6A8 0x9003
+0xC6A9 0x900F
+0xC6AA 0x9419
+0xC6AB 0x9676
+0xC6AC 0x982D
+0xC6AD 0x9A30
+0xC6AE 0x95D8
+0xC6AF 0x50CD
+0xC6B0 0x52D5
+0xC6B1 0x540C
+0xC6B2 0x5802
+0xC6B3 0x5C0E
+0xC6B4 0x61A7
+0xC6B5 0x649E
+0xC6B6 0x6D1E
+0xC6B7 0x77B3
+0xC6B8 0x7AE5
+0xC6B9 0x80F4
+0xC6BA 0x8404
+0xC6BB 0x9053
+0xC6BC 0x9285
+0xC6BD 0x5CE0
+0xC6BE 0x9D07
+0xC6BF 0x533F
+0xC6C0 0x5F97
+0xC6C1 0x5FB3
+0xC6C2 0x6D9C
+0xC6C3 0x7279
+0xC6C4 0x7763
+0xC6C5 0x79BF
+0xC6C6 0x7BE4
+0xC6C7 0x6BD2
+0xC6C8 0x72EC
+0xC6C9 0x8AAD
+0xC6CA 0x6803
+0xC6CB 0x6A61
+0xC6CC 0x51F8
+0xC6CD 0x7A81
+0xC6CE 0x6934
+0xC6CF 0x5C4A
+0xC6D0 0x9CF6
+0xC6D1 0x82EB
+0xC6D2 0x5BC5
+0xC6D3 0x9149
+0xC6D4 0x701E
+0xC6D5 0x5678
+0xC6D6 0x5C6F
+0xC6D7 0x60C7
+0xC6D8 0x6566
+0xC6D9 0x6C8C
+0xC6DA 0x8C5A
+0xC6DB 0x9041
+0xC6DC 0x9813
+0xC6DD 0x5451
+0xC6DE 0x66C7
+0xC6DF 0x920D
+0xC6E0 0x5948
+0xC6E1 0x90A3
+0xC6E2 0x5185
+0xC6E3 0x4E4D
+0xC6E4 0x51EA
+0xC6E5 0x8599
+0xC6E6 0x8B0E
+0xC6E7 0x7058
+0xC6E8 0x637A
+0xC6E9 0x934B
+0xC6EA 0x6962
+0xC6EB 0x99B4
+0xC6EC 0x7E04
+0xC6ED 0x7577
+0xC6EE 0x5357
+0xC6EF 0x6960
+0xC6F0 0x8EDF
+0xC6F1 0x96E3
+0xC6F2 0x6C5D
+0xC6F3 0x4E8C
+0xC6F4 0x5C3C
+0xC6F5 0x5F10
+0xC6F6 0x8FE9
+0xC6F7 0x5302
+0xC6F8 0x8CD1
+0xC6F9 0x8089
+0xC6FA 0x8679
+0xC6FB 0x5EFF
+0xC6FC 0x65E5
+0xC6FD 0x4E73
+0xC6FE 0x5165
+0xC7A1 0x5982
+0xC7A2 0x5C3F
+0xC7A3 0x97EE
+0xC7A4 0x4EFB
+0xC7A5 0x598A
+0xC7A6 0x5FCD
+0xC7A7 0x8A8D
+0xC7A8 0x6FE1
+0xC7A9 0x79B0
+0xC7AA 0x7962
+0xC7AB 0x5BE7
+0xC7AC 0x8471
+0xC7AD 0x732B
+0xC7AE 0x71B1
+0xC7AF 0x5E74
+0xC7B0 0x5FF5
+0xC7B1 0x637B
+0xC7B2 0x649A
+0xC7B3 0x71C3
+0xC7B4 0x7C98
+0xC7B5 0x4E43
+0xC7B6 0x5EFC
+0xC7B7 0x4E4B
+0xC7B8 0x57DC
+0xC7B9 0x56A2
+0xC7BA 0x60A9
+0xC7BB 0x6FC3
+0xC7BC 0x7D0D
+0xC7BD 0x80FD
+0xC7BE 0x8133
+0xC7BF 0x81BF
+0xC7C0 0x8FB2
+0xC7C1 0x8997
+0xC7C2 0x86A4
+0xC7C3 0x5DF4
+0xC7C4 0x628A
+0xC7C5 0x64AD
+0xC7C6 0x8987
+0xC7C7 0x6777
+0xC7C8 0x6CE2
+0xC7C9 0x6D3E
+0xC7CA 0x7436
+0xC7CB 0x7834
+0xC7CC 0x5A46
+0xC7CD 0x7F75
+0xC7CE 0x82AD
+0xC7CF 0x99AC
+0xC7D0 0x4FF3
+0xC7D1 0x5EC3
+0xC7D2 0x62DD
+0xC7D3 0x6392
+0xC7D4 0x6557
+0xC7D5 0x676F
+0xC7D6 0x76C3
+0xC7D7 0x724C
+0xC7D8 0x80CC
+0xC7D9 0x80BA
+0xC7DA 0x8F29
+0xC7DB 0x914D
+0xC7DC 0x500D
+0xC7DD 0x57F9
+0xC7DE 0x5A92
+0xC7DF 0x6885
+0xC7E0 0x6973
+0xC7E1 0x7164
+0xC7E2 0x72FD
+0xC7E3 0x8CB7
+0xC7E4 0x58F2
+0xC7E5 0x8CE0
+0xC7E6 0x966A
+0xC7E7 0x9019
+0xC7E8 0x877F
+0xC7E9 0x79E4
+0xC7EA 0x77E7
+0xC7EB 0x8429
+0xC7EC 0x4F2F
+0xC7ED 0x5265
+0xC7EE 0x535A
+0xC7EF 0x62CD
+0xC7F0 0x67CF
+0xC7F1 0x6CCA
+0xC7F2 0x767D
+0xC7F3 0x7B94
+0xC7F4 0x7C95
+0xC7F5 0x8236
+0xC7F6 0x8584
+0xC7F7 0x8FEB
+0xC7F8 0x66DD
+0xC7F9 0x6F20
+0xC7FA 0x7206
+0xC7FB 0x7E1B
+0xC7FC 0x83AB
+0xC7FD 0x99C1
+0xC7FE 0x9EA6
+0xC8A1 0x51FD
+0xC8A2 0x7BB1
+0xC8A3 0x7872
+0xC8A4 0x7BB8
+0xC8A5 0x8087
+0xC8A6 0x7B48
+0xC8A7 0x6AE8
+0xC8A8 0x5E61
+0xC8A9 0x808C
+0xC8AA 0x7551
+0xC8AB 0x7560
+0xC8AC 0x516B
+0xC8AD 0x9262
+0xC8AE 0x6E8C
+0xC8AF 0x767A
+0xC8B0 0x9197
+0xC8B1 0x9AEA
+0xC8B2 0x4F10
+0xC8B3 0x7F70
+0xC8B4 0x629C
+0xC8B5 0x7B4F
+0xC8B6 0x95A5
+0xC8B7 0x9CE9
+0xC8B8 0x567A
+0xC8B9 0x5859
+0xC8BA 0x86E4
+0xC8BB 0x96BC
+0xC8BC 0x4F34
+0xC8BD 0x5224
+0xC8BE 0x534A
+0xC8BF 0x53CD
+0xC8C0 0x53DB
+0xC8C1 0x5E06
+0xC8C2 0x642C
+0xC8C3 0x6591
+0xC8C4 0x677F
+0xC8C5 0x6C3E
+0xC8C6 0x6C4E
+0xC8C7 0x7248
+0xC8C8 0x72AF
+0xC8C9 0x73ED
+0xC8CA 0x7554
+0xC8CB 0x7E41
+0xC8CC 0x822C
+0xC8CD 0x85E9
+0xC8CE 0x8CA9
+0xC8CF 0x7BC4
+0xC8D0 0x91C6
+0xC8D1 0x7169
+0xC8D2 0x9812
+0xC8D3 0x98EF
+0xC8D4 0x633D
+0xC8D5 0x6669
+0xC8D6 0x756A
+0xC8D7 0x76E4
+0xC8D8 0x78D0
+0xC8D9 0x8543
+0xC8DA 0x86EE
+0xC8DB 0x532A
+0xC8DC 0x5351
+0xC8DD 0x5426
+0xC8DE 0x5983
+0xC8DF 0x5E87
+0xC8E0 0x5F7C
+0xC8E1 0x60B2
+0xC8E2 0x6249
+0xC8E3 0x6279
+0xC8E4 0x62AB
+0xC8E5 0x6590
+0xC8E6 0x6BD4
+0xC8E7 0x6CCC
+0xC8E8 0x75B2
+0xC8E9 0x76AE
+0xC8EA 0x7891
+0xC8EB 0x79D8
+0xC8EC 0x7DCB
+0xC8ED 0x7F77
+0xC8EE 0x80A5
+0xC8EF 0x88AB
+0xC8F0 0x8AB9
+0xC8F1 0x8CBB
+0xC8F2 0x907F
+0xC8F3 0x975E
+0xC8F4 0x98DB
+0xC8F5 0x6A0B
+0xC8F6 0x7C38
+0xC8F7 0x5099
+0xC8F8 0x5C3E
+0xC8F9 0x5FAE
+0xC8FA 0x6787
+0xC8FB 0x6BD8
+0xC8FC 0x7435
+0xC8FD 0x7709
+0xC8FE 0x7F8E
+0xC9A1 0x9F3B
+0xC9A2 0x67CA
+0xC9A3 0x7A17
+0xC9A4 0x5339
+0xC9A5 0x758B
+0xC9A6 0x9AED
+0xC9A7 0x5F66
+0xC9A8 0x819D
+0xC9A9 0x83F1
+0xC9AA 0x8098
+0xC9AB 0x5F3C
+0xC9AC 0x5FC5
+0xC9AD 0x7562
+0xC9AE 0x7B46
+0xC9AF 0x903C
+0xC9B0 0x6867
+0xC9B1 0x59EB
+0xC9B2 0x5A9B
+0xC9B3 0x7D10
+0xC9B4 0x767E
+0xC9B5 0x8B2C
+0xC9B6 0x4FF5
+0xC9B7 0x5F6A
+0xC9B8 0x6A19
+0xC9B9 0x6C37
+0xC9BA 0x6F02
+0xC9BB 0x74E2
+0xC9BC 0x7968
+0xC9BD 0x8868
+0xC9BE 0x8A55
+0xC9BF 0x8C79
+0xC9C0 0x5EDF
+0xC9C1 0x63CF
+0xC9C2 0x75C5
+0xC9C3 0x79D2
+0xC9C4 0x82D7
+0xC9C5 0x9328
+0xC9C6 0x92F2
+0xC9C7 0x849C
+0xC9C8 0x86ED
+0xC9C9 0x9C2D
+0xC9CA 0x54C1
+0xC9CB 0x5F6C
+0xC9CC 0x658C
+0xC9CD 0x6D5C
+0xC9CE 0x7015
+0xC9CF 0x8CA7
+0xC9D0 0x8CD3
+0xC9D1 0x983B
+0xC9D2 0x654F
+0xC9D3 0x74F6
+0xC9D4 0x4E0D
+0xC9D5 0x4ED8
+0xC9D6 0x57E0
+0xC9D7 0x592B
+0xC9D8 0x5A66
+0xC9D9 0x5BCC
+0xC9DA 0x51A8
+0xC9DB 0x5E03
+0xC9DC 0x5E9C
+0xC9DD 0x6016
+0xC9DE 0x6276
+0xC9DF 0x6577
+0xC9E0 0x65A7
+0xC9E1 0x666E
+0xC9E2 0x6D6E
+0xC9E3 0x7236
+0xC9E4 0x7B26
+0xC9E5 0x8150
+0xC9E6 0x819A
+0xC9E7 0x8299
+0xC9E8 0x8B5C
+0xC9E9 0x8CA0
+0xC9EA 0x8CE6
+0xC9EB 0x8D74
+0xC9EC 0x961C
+0xC9ED 0x9644
+0xC9EE 0x4FAE
+0xC9EF 0x64AB
+0xC9F0 0x6B66
+0xC9F1 0x821E
+0xC9F2 0x8461
+0xC9F3 0x856A
+0xC9F4 0x90E8
+0xC9F5 0x5C01
+0xC9F6 0x6953
+0xC9F7 0x98A8
+0xC9F8 0x847A
+0xC9F9 0x8557
+0xC9FA 0x4F0F
+0xC9FB 0x526F
+0xC9FC 0x5FA9
+0xC9FD 0x5E45
+0xC9FE 0x670D
+0xCAA1 0x798F
+0xCAA2 0x8179
+0xCAA3 0x8907
+0xCAA4 0x8986
+0xCAA5 0x6DF5
+0xCAA6 0x5F17
+0xCAA7 0x6255
+0xCAA8 0x6CB8
+0xCAA9 0x4ECF
+0xCAAA 0x7269
+0xCAAB 0x9B92
+0xCAAC 0x5206
+0xCAAD 0x543B
+0xCAAE 0x5674
+0xCAAF 0x58B3
+0xCAB0 0x61A4
+0xCAB1 0x626E
+0xCAB2 0x711A
+0xCAB3 0x596E
+0xCAB4 0x7C89
+0xCAB5 0x7CDE
+0xCAB6 0x7D1B
+0xCAB7 0x96F0
+0xCAB8 0x6587
+0xCAB9 0x805E
+0xCABA 0x4E19
+0xCABB 0x4F75
+0xCABC 0x5175
+0xCABD 0x5840
+0xCABE 0x5E63
+0xCABF 0x5E73
+0xCAC0 0x5F0A
+0xCAC1 0x67C4
+0xCAC2 0x4E26
+0xCAC3 0x853D
+0xCAC4 0x9589
+0xCAC5 0x965B
+0xCAC6 0x7C73
+0xCAC7 0x9801
+0xCAC8 0x50FB
+0xCAC9 0x58C1
+0xCACA 0x7656
+0xCACB 0x78A7
+0xCACC 0x5225
+0xCACD 0x77A5
+0xCACE 0x8511
+0xCACF 0x7B86
+0xCAD0 0x504F
+0xCAD1 0x5909
+0xCAD2 0x7247
+0xCAD3 0x7BC7
+0xCAD4 0x7DE8
+0xCAD5 0x8FBA
+0xCAD6 0x8FD4
+0xCAD7 0x904D
+0xCAD8 0x4FBF
+0xCAD9 0x52C9
+0xCADA 0x5A29
+0xCADB 0x5F01
+0xCADC 0x97AD
+0xCADD 0x4FDD
+0xCADE 0x8217
+0xCADF 0x92EA
+0xCAE0 0x5703
+0xCAE1 0x6355
+0xCAE2 0x6B69
+0xCAE3 0x752B
+0xCAE4 0x88DC
+0xCAE5 0x8F14
+0xCAE6 0x7A42
+0xCAE7 0x52DF
+0xCAE8 0x5893
+0xCAE9 0x6155
+0xCAEA 0x620A
+0xCAEB 0x66AE
+0xCAEC 0x6BCD
+0xCAED 0x7C3F
+0xCAEE 0x83E9
+0xCAEF 0x5023
+0xCAF0 0x4FF8
+0xCAF1 0x5305
+0xCAF2 0x5446
+0xCAF3 0x5831
+0xCAF4 0x5949
+0xCAF5 0x5B9D
+0xCAF6 0x5CF0
+0xCAF7 0x5CEF
+0xCAF8 0x5D29
+0xCAF9 0x5E96
+0xCAFA 0x62B1
+0xCAFB 0x6367
+0xCAFC 0x653E
+0xCAFD 0x65B9
+0xCAFE 0x670B
+0xCBA1 0x6CD5
+0xCBA2 0x6CE1
+0xCBA3 0x70F9
+0xCBA4 0x7832
+0xCBA5 0x7E2B
+0xCBA6 0x80DE
+0xCBA7 0x82B3
+0xCBA8 0x840C
+0xCBA9 0x84EC
+0xCBAA 0x8702
+0xCBAB 0x8912
+0xCBAC 0x8A2A
+0xCBAD 0x8C4A
+0xCBAE 0x90A6
+0xCBAF 0x92D2
+0xCBB0 0x98FD
+0xCBB1 0x9CF3
+0xCBB2 0x9D6C
+0xCBB3 0x4E4F
+0xCBB4 0x4EA1
+0xCBB5 0x508D
+0xCBB6 0x5256
+0xCBB7 0x574A
+0xCBB8 0x59A8
+0xCBB9 0x5E3D
+0xCBBA 0x5FD8
+0xCBBB 0x5FD9
+0xCBBC 0x623F
+0xCBBD 0x66B4
+0xCBBE 0x671B
+0xCBBF 0x67D0
+0xCBC0 0x68D2
+0xCBC1 0x5192
+0xCBC2 0x7D21
+0xCBC3 0x80AA
+0xCBC4 0x81A8
+0xCBC5 0x8B00
+0xCBC6 0x8C8C
+0xCBC7 0x8CBF
+0xCBC8 0x927E
+0xCBC9 0x9632
+0xCBCA 0x5420
+0xCBCB 0x982C
+0xCBCC 0x5317
+0xCBCD 0x50D5
+0xCBCE 0x535C
+0xCBCF 0x58A8
+0xCBD0 0x64B2
+0xCBD1 0x6734
+0xCBD2 0x7267
+0xCBD3 0x7766
+0xCBD4 0x7A46
+0xCBD5 0x91E6
+0xCBD6 0x52C3
+0xCBD7 0x6CA1
+0xCBD8 0x6B86
+0xCBD9 0x5800
+0xCBDA 0x5E4C
+0xCBDB 0x5954
+0xCBDC 0x672C
+0xCBDD 0x7FFB
+0xCBDE 0x51E1
+0xCBDF 0x76C6
+0xCBE0 0x6469
+0xCBE1 0x78E8
+0xCBE2 0x9B54
+0xCBE3 0x9EBB
+0xCBE4 0x57CB
+0xCBE5 0x59B9
+0xCBE6 0x6627
+0xCBE7 0x679A
+0xCBE8 0x6BCE
+0xCBE9 0x54E9
+0xCBEA 0x69D9
+0xCBEB 0x5E55
+0xCBEC 0x819C
+0xCBED 0x6795
+0xCBEE 0x9BAA
+0xCBEF 0x67FE
+0xCBF0 0x9C52
+0xCBF1 0x685D
+0xCBF2 0x4EA6
+0xCBF3 0x4FE3
+0xCBF4 0x53C8
+0xCBF5 0x62B9
+0xCBF6 0x672B
+0xCBF7 0x6CAB
+0xCBF8 0x8FC4
+0xCBF9 0x4FAD
+0xCBFA 0x7E6D
+0xCBFB 0x9EBF
+0xCBFC 0x4E07
+0xCBFD 0x6162
+0xCBFE 0x6E80
+0xCCA1 0x6F2B
+0xCCA2 0x8513
+0xCCA3 0x5473
+0xCCA4 0x672A
+0xCCA5 0x9B45
+0xCCA6 0x5DF3
+0xCCA7 0x7B95
+0xCCA8 0x5CAC
+0xCCA9 0x5BC6
+0xCCAA 0x871C
+0xCCAB 0x6E4A
+0xCCAC 0x84D1
+0xCCAD 0x7A14
+0xCCAE 0x8108
+0xCCAF 0x5999
+0xCCB0 0x7C8D
+0xCCB1 0x6C11
+0xCCB2 0x7720
+0xCCB3 0x52D9
+0xCCB4 0x5922
+0xCCB5 0x7121
+0xCCB6 0x725F
+0xCCB7 0x77DB
+0xCCB8 0x9727
+0xCCB9 0x9D61
+0xCCBA 0x690B
+0xCCBB 0x5A7F
+0xCCBC 0x5A18
+0xCCBD 0x51A5
+0xCCBE 0x540D
+0xCCBF 0x547D
+0xCCC0 0x660E
+0xCCC1 0x76DF
+0xCCC2 0x8FF7
+0xCCC3 0x9298
+0xCCC4 0x9CF4
+0xCCC5 0x59EA
+0xCCC6 0x725D
+0xCCC7 0x6EC5
+0xCCC8 0x514D
+0xCCC9 0x68C9
+0xCCCA 0x7DBF
+0xCCCB 0x7DEC
+0xCCCC 0x9762
+0xCCCD 0x9EBA
+0xCCCE 0x6478
+0xCCCF 0x6A21
+0xCCD0 0x8302
+0xCCD1 0x5984
+0xCCD2 0x5B5F
+0xCCD3 0x6BDB
+0xCCD4 0x731B
+0xCCD5 0x76F2
+0xCCD6 0x7DB2
+0xCCD7 0x8017
+0xCCD8 0x8499
+0xCCD9 0x5132
+0xCCDA 0x6728
+0xCCDB 0x9ED9
+0xCCDC 0x76EE
+0xCCDD 0x6762
+0xCCDE 0x52FF
+0xCCDF 0x9905
+0xCCE0 0x5C24
+0xCCE1 0x623B
+0xCCE2 0x7C7E
+0xCCE3 0x8CB0
+0xCCE4 0x554F
+0xCCE5 0x60B6
+0xCCE6 0x7D0B
+0xCCE7 0x9580
+0xCCE8 0x5301
+0xCCE9 0x4E5F
+0xCCEA 0x51B6
+0xCCEB 0x591C
+0xCCEC 0x723A
+0xCCED 0x8036
+0xCCEE 0x91CE
+0xCCEF 0x5F25
+0xCCF0 0x77E2
+0xCCF1 0x5384
+0xCCF2 0x5F79
+0xCCF3 0x7D04
+0xCCF4 0x85AC
+0xCCF5 0x8A33
+0xCCF6 0x8E8D
+0xCCF7 0x9756
+0xCCF8 0x67F3
+0xCCF9 0x85AE
+0xCCFA 0x9453
+0xCCFB 0x6109
+0xCCFC 0x6108
+0xCCFD 0x6CB9
+0xCCFE 0x7652
+0xCDA1 0x8AED
+0xCDA2 0x8F38
+0xCDA3 0x552F
+0xCDA4 0x4F51
+0xCDA5 0x512A
+0xCDA6 0x52C7
+0xCDA7 0x53CB
+0xCDA8 0x5BA5
+0xCDA9 0x5E7D
+0xCDAA 0x60A0
+0xCDAB 0x6182
+0xCDAC 0x63D6
+0xCDAD 0x6709
+0xCDAE 0x67DA
+0xCDAF 0x6E67
+0xCDB0 0x6D8C
+0xCDB1 0x7336
+0xCDB2 0x7337
+0xCDB3 0x7531
+0xCDB4 0x7950
+0xCDB5 0x88D5
+0xCDB6 0x8A98
+0xCDB7 0x904A
+0xCDB8 0x9091
+0xCDB9 0x90F5
+0xCDBA 0x96C4
+0xCDBB 0x878D
+0xCDBC 0x5915
+0xCDBD 0x4E88
+0xCDBE 0x4F59
+0xCDBF 0x4E0E
+0xCDC0 0x8A89
+0xCDC1 0x8F3F
+0xCDC2 0x9810
+0xCDC3 0x50AD
+0xCDC4 0x5E7C
+0xCDC5 0x5996
+0xCDC6 0x5BB9
+0xCDC7 0x5EB8
+0xCDC8 0x63DA
+0xCDC9 0x63FA
+0xCDCA 0x64C1
+0xCDCB 0x66DC
+0xCDCC 0x694A
+0xCDCD 0x69D8
+0xCDCE 0x6D0B
+0xCDCF 0x6EB6
+0xCDD0 0x7194
+0xCDD1 0x7528
+0xCDD2 0x7AAF
+0xCDD3 0x7F8A
+0xCDD4 0x8000
+0xCDD5 0x8449
+0xCDD6 0x84C9
+0xCDD7 0x8981
+0xCDD8 0x8B21
+0xCDD9 0x8E0A
+0xCDDA 0x9065
+0xCDDB 0x967D
+0xCDDC 0x990A
+0xCDDD 0x617E
+0xCDDE 0x6291
+0xCDDF 0x6B32
+0xCDE0 0x6C83
+0xCDE1 0x6D74
+0xCDE2 0x7FCC
+0xCDE3 0x7FFC
+0xCDE4 0x6DC0
+0xCDE5 0x7F85
+0xCDE6 0x87BA
+0xCDE7 0x88F8
+0xCDE8 0x6765
+0xCDE9 0x83B1
+0xCDEA 0x983C
+0xCDEB 0x96F7
+0xCDEC 0x6D1B
+0xCDED 0x7D61
+0xCDEE 0x843D
+0xCDEF 0x916A
+0xCDF0 0x4E71
+0xCDF1 0x5375
+0xCDF2 0x5D50
+0xCDF3 0x6B04
+0xCDF4 0x6FEB
+0xCDF5 0x85CD
+0xCDF6 0x862D
+0xCDF7 0x89A7
+0xCDF8 0x5229
+0xCDF9 0x540F
+0xCDFA 0x5C65
+0xCDFB 0x674E
+0xCDFC 0x68A8
+0xCDFD 0x7406
+0xCDFE 0x7483
+0xCEA1 0x75E2
+0xCEA2 0x88CF
+0xCEA3 0x88E1
+0xCEA4 0x91CC
+0xCEA5 0x96E2
+0xCEA6 0x9678
+0xCEA7 0x5F8B
+0xCEA8 0x7387
+0xCEA9 0x7ACB
+0xCEAA 0x844E
+0xCEAB 0x63A0
+0xCEAC 0x7565
+0xCEAD 0x5289
+0xCEAE 0x6D41
+0xCEAF 0x6E9C
+0xCEB0 0x7409
+0xCEB1 0x7559
+0xCEB2 0x786B
+0xCEB3 0x7C92
+0xCEB4 0x9686
+0xCEB5 0x7ADC
+0xCEB6 0x9F8D
+0xCEB7 0x4FB6
+0xCEB8 0x616E
+0xCEB9 0x65C5
+0xCEBA 0x865C
+0xCEBB 0x4E86
+0xCEBC 0x4EAE
+0xCEBD 0x50DA
+0xCEBE 0x4E21
+0xCEBF 0x51CC
+0xCEC0 0x5BEE
+0xCEC1 0x6599
+0xCEC2 0x6881
+0xCEC3 0x6DBC
+0xCEC4 0x731F
+0xCEC5 0x7642
+0xCEC6 0x77AD
+0xCEC7 0x7A1C
+0xCEC8 0x7CE7
+0xCEC9 0x826F
+0xCECA 0x8AD2
+0xCECB 0x907C
+0xCECC 0x91CF
+0xCECD 0x9675
+0xCECE 0x9818
+0xCECF 0x529B
+0xCED0 0x7DD1
+0xCED1 0x502B
+0xCED2 0x5398
+0xCED3 0x6797
+0xCED4 0x6DCB
+0xCED5 0x71D0
+0xCED6 0x7433
+0xCED7 0x81E8
+0xCED8 0x8F2A
+0xCED9 0x96A3
+0xCEDA 0x9C57
+0xCEDB 0x9E9F
+0xCEDC 0x7460
+0xCEDD 0x5841
+0xCEDE 0x6D99
+0xCEDF 0x7D2F
+0xCEE0 0x985E
+0xCEE1 0x4EE4
+0xCEE2 0x4F36
+0xCEE3 0x4F8B
+0xCEE4 0x51B7
+0xCEE5 0x52B1
+0xCEE6 0x5DBA
+0xCEE7 0x601C
+0xCEE8 0x73B2
+0xCEE9 0x793C
+0xCEEA 0x82D3
+0xCEEB 0x9234
+0xCEEC 0x96B7
+0xCEED 0x96F6
+0xCEEE 0x970A
+0xCEEF 0x9E97
+0xCEF0 0x9F62
+0xCEF1 0x66A6
+0xCEF2 0x6B74
+0xCEF3 0x5217
+0xCEF4 0x52A3
+0xCEF5 0x70C8
+0xCEF6 0x88C2
+0xCEF7 0x5EC9
+0xCEF8 0x604B
+0xCEF9 0x6190
+0xCEFA 0x6F23
+0xCEFB 0x7149
+0xCEFC 0x7C3E
+0xCEFD 0x7DF4
+0xCEFE 0x806F
+0xCFA1 0x84EE
+0xCFA2 0x9023
+0xCFA3 0x932C
+0xCFA4 0x5442
+0xCFA5 0x9B6F
+0xCFA6 0x6AD3
+0xCFA7 0x7089
+0xCFA8 0x8CC2
+0xCFA9 0x8DEF
+0xCFAA 0x9732
+0xCFAB 0x52B4
+0xCFAC 0x5A41
+0xCFAD 0x5ECA
+0xCFAE 0x5F04
+0xCFAF 0x6717
+0xCFB0 0x697C
+0xCFB1 0x6994
+0xCFB2 0x6D6A
+0xCFB3 0x6F0F
+0xCFB4 0x7262
+0xCFB5 0x72FC
+0xCFB6 0x7BED
+0xCFB7 0x8001
+0xCFB8 0x807E
+0xCFB9 0x874B
+0xCFBA 0x90CE
+0xCFBB 0x516D
+0xCFBC 0x9E93
+0xCFBD 0x7984
+0xCFBE 0x808B
+0xCFBF 0x9332
+0xCFC0 0x8AD6
+0xCFC1 0x502D
+0xCFC2 0x548C
+0xCFC3 0x8A71
+0xCFC4 0x6B6A
+0xCFC5 0x8CC4
+0xCFC6 0x8107
+0xCFC7 0x60D1
+0xCFC8 0x67A0
+0xCFC9 0x9DF2
+0xCFCA 0x4E99
+0xCFCB 0x4E98
+0xCFCC 0x9C10
+0xCFCD 0x8A6B
+0xCFCE 0x85C1
+0xCFCF 0x8568
+0xCFD0 0x6900
+0xCFD1 0x6E7E
+0xCFD2 0x7897
+0xCFD3 0x8155
+0xD0A1 0x5F0C
+0xD0A2 0x4E10
+0xD0A3 0x4E15
+0xD0A4 0x4E2A
+0xD0A5 0x4E31
+0xD0A6 0x4E36
+0xD0A7 0x4E3C
+0xD0A8 0x4E3F
+0xD0A9 0x4E42
+0xD0AA 0x4E56
+0xD0AB 0x4E58
+0xD0AC 0x4E82
+0xD0AD 0x4E85
+0xD0AE 0x8C6B
+0xD0AF 0x4E8A
+0xD0B0 0x8212
+0xD0B1 0x5F0D
+0xD0B2 0x4E8E
+0xD0B3 0x4E9E
+0xD0B4 0x4E9F
+0xD0B5 0x4EA0
+0xD0B6 0x4EA2
+0xD0B7 0x4EB0
+0xD0B8 0x4EB3
+0xD0B9 0x4EB6
+0xD0BA 0x4ECE
+0xD0BB 0x4ECD
+0xD0BC 0x4EC4
+0xD0BD 0x4EC6
+0xD0BE 0x4EC2
+0xD0BF 0x4ED7
+0xD0C0 0x4EDE
+0xD0C1 0x4EED
+0xD0C2 0x4EDF
+0xD0C3 0x4EF7
+0xD0C4 0x4F09
+0xD0C5 0x4F5A
+0xD0C6 0x4F30
+0xD0C7 0x4F5B
+0xD0C8 0x4F5D
+0xD0C9 0x4F57
+0xD0CA 0x4F47
+0xD0CB 0x4F76
+0xD0CC 0x4F88
+0xD0CD 0x4F8F
+0xD0CE 0x4F98
+0xD0CF 0x4F7B
+0xD0D0 0x4F69
+0xD0D1 0x4F70
+0xD0D2 0x4F91
+0xD0D3 0x4F6F
+0xD0D4 0x4F86
+0xD0D5 0x4F96
+0xD0D6 0x5118
+0xD0D7 0x4FD4
+0xD0D8 0x4FDF
+0xD0D9 0x4FCE
+0xD0DA 0x4FD8
+0xD0DB 0x4FDB
+0xD0DC 0x4FD1
+0xD0DD 0x4FDA
+0xD0DE 0x4FD0
+0xD0DF 0x4FE4
+0xD0E0 0x4FE5
+0xD0E1 0x501A
+0xD0E2 0x5028
+0xD0E3 0x5014
+0xD0E4 0x502A
+0xD0E5 0x5025
+0xD0E6 0x5005
+0xD0E7 0x4F1C
+0xD0E8 0x4FF6
+0xD0E9 0x5021
+0xD0EA 0x5029
+0xD0EB 0x502C
+0xD0EC 0x4FFE
+0xD0ED 0x4FEF
+0xD0EE 0x5011
+0xD0EF 0x5006
+0xD0F0 0x5043
+0xD0F1 0x5047
+0xD0F2 0x6703
+0xD0F3 0x5055
+0xD0F4 0x5050
+0xD0F5 0x5048
+0xD0F6 0x505A
+0xD0F7 0x5056
+0xD0F8 0x506C
+0xD0F9 0x5078
+0xD0FA 0x5080
+0xD0FB 0x509A
+0xD0FC 0x5085
+0xD0FD 0x50B4
+0xD0FE 0x50B2
+0xD1A1 0x50C9
+0xD1A2 0x50CA
+0xD1A3 0x50B3
+0xD1A4 0x50C2
+0xD1A5 0x50D6
+0xD1A6 0x50DE
+0xD1A7 0x50E5
+0xD1A8 0x50ED
+0xD1A9 0x50E3
+0xD1AA 0x50EE
+0xD1AB 0x50F9
+0xD1AC 0x50F5
+0xD1AD 0x5109
+0xD1AE 0x5101
+0xD1AF 0x5102
+0xD1B0 0x5116
+0xD1B1 0x5115
+0xD1B2 0x5114
+0xD1B3 0x511A
+0xD1B4 0x5121
+0xD1B5 0x513A
+0xD1B6 0x5137
+0xD1B7 0x513C
+0xD1B8 0x513B
+0xD1B9 0x513F
+0xD1BA 0x5140
+0xD1BB 0x5152
+0xD1BC 0x514C
+0xD1BD 0x5154
+0xD1BE 0x5162
+0xD1BF 0x7AF8
+0xD1C0 0x5169
+0xD1C1 0x516A
+0xD1C2 0x516E
+0xD1C3 0x5180
+0xD1C4 0x5182
+0xD1C5 0x56D8
+0xD1C6 0x518C
+0xD1C7 0x5189
+0xD1C8 0x518F
+0xD1C9 0x5191
+0xD1CA 0x5193
+0xD1CB 0x5195
+0xD1CC 0x5196
+0xD1CD 0x51A4
+0xD1CE 0x51A6
+0xD1CF 0x51A2
+0xD1D0 0x51A9
+0xD1D1 0x51AA
+0xD1D2 0x51AB
+0xD1D3 0x51B3
+0xD1D4 0x51B1
+0xD1D5 0x51B2
+0xD1D6 0x51B0
+0xD1D7 0x51B5
+0xD1D8 0x51BD
+0xD1D9 0x51C5
+0xD1DA 0x51C9
+0xD1DB 0x51DB
+0xD1DC 0x51E0
+0xD1DD 0x8655
+0xD1DE 0x51E9
+0xD1DF 0x51ED
+0xD1E0 0x51F0
+0xD1E1 0x51F5
+0xD1E2 0x51FE
+0xD1E3 0x5204
+0xD1E4 0x520B
+0xD1E5 0x5214
+0xD1E6 0x520E
+0xD1E7 0x5227
+0xD1E8 0x522A
+0xD1E9 0x522E
+0xD1EA 0x5233
+0xD1EB 0x5239
+0xD1EC 0x524F
+0xD1ED 0x5244
+0xD1EE 0x524B
+0xD1EF 0x524C
+0xD1F0 0x525E
+0xD1F1 0x5254
+0xD1F2 0x526A
+0xD1F3 0x5274
+0xD1F4 0x5269
+0xD1F5 0x5273
+0xD1F6 0x527F
+0xD1F7 0x527D
+0xD1F8 0x528D
+0xD1F9 0x5294
+0xD1FA 0x5292
+0xD1FB 0x5271
+0xD1FC 0x5288
+0xD1FD 0x5291
+0xD1FE 0x8FA8
+0xD2A1 0x8FA7
+0xD2A2 0x52AC
+0xD2A3 0x52AD
+0xD2A4 0x52BC
+0xD2A5 0x52B5
+0xD2A6 0x52C1
+0xD2A7 0x52CD
+0xD2A8 0x52D7
+0xD2A9 0x52DE
+0xD2AA 0x52E3
+0xD2AB 0x52E6
+0xD2AC 0x98ED
+0xD2AD 0x52E0
+0xD2AE 0x52F3
+0xD2AF 0x52F5
+0xD2B0 0x52F8
+0xD2B1 0x52F9
+0xD2B2 0x5306
+0xD2B3 0x5308
+0xD2B4 0x7538
+0xD2B5 0x530D
+0xD2B6 0x5310
+0xD2B7 0x530F
+0xD2B8 0x5315
+0xD2B9 0x531A
+0xD2BA 0x5323
+0xD2BB 0x532F
+0xD2BC 0x5331
+0xD2BD 0x5333
+0xD2BE 0x5338
+0xD2BF 0x5340
+0xD2C0 0x5346
+0xD2C1 0x5345
+0xD2C2 0x4E17
+0xD2C3 0x5349
+0xD2C4 0x534D
+0xD2C5 0x51D6
+0xD2C6 0x535E
+0xD2C7 0x5369
+0xD2C8 0x536E
+0xD2C9 0x5918
+0xD2CA 0x537B
+0xD2CB 0x5377
+0xD2CC 0x5382
+0xD2CD 0x5396
+0xD2CE 0x53A0
+0xD2CF 0x53A6
+0xD2D0 0x53A5
+0xD2D1 0x53AE
+0xD2D2 0x53B0
+0xD2D3 0x53B6
+0xD2D4 0x53C3
+0xD2D5 0x7C12
+0xD2D6 0x96D9
+0xD2D7 0x53DF
+0xD2D8 0x66FC
+0xD2D9 0x71EE
+0xD2DA 0x53EE
+0xD2DB 0x53E8
+0xD2DC 0x53ED
+0xD2DD 0x53FA
+0xD2DE 0x5401
+0xD2DF 0x543D
+0xD2E0 0x5440
+0xD2E1 0x542C
+0xD2E2 0x542D
+0xD2E3 0x543C
+0xD2E4 0x542E
+0xD2E5 0x5436
+0xD2E6 0x5429
+0xD2E7 0x541D
+0xD2E8 0x544E
+0xD2E9 0x548F
+0xD2EA 0x5475
+0xD2EB 0x548E
+0xD2EC 0x545F
+0xD2ED 0x5471
+0xD2EE 0x5477
+0xD2EF 0x5470
+0xD2F0 0x5492
+0xD2F1 0x547B
+0xD2F2 0x5480
+0xD2F3 0x5476
+0xD2F4 0x5484
+0xD2F5 0x5490
+0xD2F6 0x5486
+0xD2F7 0x54C7
+0xD2F8 0x54A2
+0xD2F9 0x54B8
+0xD2FA 0x54A5
+0xD2FB 0x54AC
+0xD2FC 0x54C4
+0xD2FD 0x54C8
+0xD2FE 0x54A8
+0xD3A1 0x54AB
+0xD3A2 0x54C2
+0xD3A3 0x54A4
+0xD3A4 0x54BE
+0xD3A5 0x54BC
+0xD3A6 0x54D8
+0xD3A7 0x54E5
+0xD3A8 0x54E6
+0xD3A9 0x550F
+0xD3AA 0x5514
+0xD3AB 0x54FD
+0xD3AC 0x54EE
+0xD3AD 0x54ED
+0xD3AE 0x54FA
+0xD3AF 0x54E2
+0xD3B0 0x5539
+0xD3B1 0x5540
+0xD3B2 0x5563
+0xD3B3 0x554C
+0xD3B4 0x552E
+0xD3B5 0x555C
+0xD3B6 0x5545
+0xD3B7 0x5556
+0xD3B8 0x5557
+0xD3B9 0x5538
+0xD3BA 0x5533
+0xD3BB 0x555D
+0xD3BC 0x5599
+0xD3BD 0x5580
+0xD3BE 0x54AF
+0xD3BF 0x558A
+0xD3C0 0x559F
+0xD3C1 0x557B
+0xD3C2 0x557E
+0xD3C3 0x5598
+0xD3C4 0x559E
+0xD3C5 0x55AE
+0xD3C6 0x557C
+0xD3C7 0x5583
+0xD3C8 0x55A9
+0xD3C9 0x5587
+0xD3CA 0x55A8
+0xD3CB 0x55DA
+0xD3CC 0x55C5
+0xD3CD 0x55DF
+0xD3CE 0x55C4
+0xD3CF 0x55DC
+0xD3D0 0x55E4
+0xD3D1 0x55D4
+0xD3D2 0x5614
+0xD3D3 0x55F7
+0xD3D4 0x5616
+0xD3D5 0x55FE
+0xD3D6 0x55FD
+0xD3D7 0x561B
+0xD3D8 0x55F9
+0xD3D9 0x564E
+0xD3DA 0x5650
+0xD3DB 0x71DF
+0xD3DC 0x5634
+0xD3DD 0x5636
+0xD3DE 0x5632
+0xD3DF 0x5638
+0xD3E0 0x566B
+0xD3E1 0x5664
+0xD3E2 0x562F
+0xD3E3 0x566C
+0xD3E4 0x566A
+0xD3E5 0x5686
+0xD3E6 0x5680
+0xD3E7 0x568A
+0xD3E8 0x56A0
+0xD3E9 0x5694
+0xD3EA 0x568F
+0xD3EB 0x56A5
+0xD3EC 0x56AE
+0xD3ED 0x56B6
+0xD3EE 0x56B4
+0xD3EF 0x56C2
+0xD3F0 0x56BC
+0xD3F1 0x56C1
+0xD3F2 0x56C3
+0xD3F3 0x56C0
+0xD3F4 0x56C8
+0xD3F5 0x56CE
+0xD3F6 0x56D1
+0xD3F7 0x56D3
+0xD3F8 0x56D7
+0xD3F9 0x56EE
+0xD3FA 0x56F9
+0xD3FB 0x5700
+0xD3FC 0x56FF
+0xD3FD 0x5704
+0xD3FE 0x5709
+0xD4A1 0x5708
+0xD4A2 0x570B
+0xD4A3 0x570D
+0xD4A4 0x5713
+0xD4A5 0x5718
+0xD4A6 0x5716
+0xD4A7 0x55C7
+0xD4A8 0x571C
+0xD4A9 0x5726
+0xD4AA 0x5737
+0xD4AB 0x5738
+0xD4AC 0x574E
+0xD4AD 0x573B
+0xD4AE 0x5740
+0xD4AF 0x574F
+0xD4B0 0x5769
+0xD4B1 0x57C0
+0xD4B2 0x5788
+0xD4B3 0x5761
+0xD4B4 0x577F
+0xD4B5 0x5789
+0xD4B6 0x5793
+0xD4B7 0x57A0
+0xD4B8 0x57B3
+0xD4B9 0x57A4
+0xD4BA 0x57AA
+0xD4BB 0x57B0
+0xD4BC 0x57C3
+0xD4BD 0x57C6
+0xD4BE 0x57D4
+0xD4BF 0x57D2
+0xD4C0 0x57D3
+0xD4C1 0x580A
+0xD4C2 0x57D6
+0xD4C3 0x57E3
+0xD4C4 0x580B
+0xD4C5 0x5819
+0xD4C6 0x581D
+0xD4C7 0x5872
+0xD4C8 0x5821
+0xD4C9 0x5862
+0xD4CA 0x584B
+0xD4CB 0x5870
+0xD4CC 0x6BC0
+0xD4CD 0x5852
+0xD4CE 0x583D
+0xD4CF 0x5879
+0xD4D0 0x5885
+0xD4D1 0x58B9
+0xD4D2 0x589F
+0xD4D3 0x58AB
+0xD4D4 0x58BA
+0xD4D5 0x58DE
+0xD4D6 0x58BB
+0xD4D7 0x58B8
+0xD4D8 0x58AE
+0xD4D9 0x58C5
+0xD4DA 0x58D3
+0xD4DB 0x58D1
+0xD4DC 0x58D7
+0xD4DD 0x58D9
+0xD4DE 0x58D8
+0xD4DF 0x58E5
+0xD4E0 0x58DC
+0xD4E1 0x58E4
+0xD4E2 0x58DF
+0xD4E3 0x58EF
+0xD4E4 0x58FA
+0xD4E5 0x58F9
+0xD4E6 0x58FB
+0xD4E7 0x58FC
+0xD4E8 0x58FD
+0xD4E9 0x5902
+0xD4EA 0x590A
+0xD4EB 0x5910
+0xD4EC 0x591B
+0xD4ED 0x68A6
+0xD4EE 0x5925
+0xD4EF 0x592C
+0xD4F0 0x592D
+0xD4F1 0x5932
+0xD4F2 0x5938
+0xD4F3 0x593E
+0xD4F4 0x7AD2
+0xD4F5 0x5955
+0xD4F6 0x5950
+0xD4F7 0x594E
+0xD4F8 0x595A
+0xD4F9 0x5958
+0xD4FA 0x5962
+0xD4FB 0x5960
+0xD4FC 0x5967
+0xD4FD 0x596C
+0xD4FE 0x5969
+0xD5A1 0x5978
+0xD5A2 0x5981
+0xD5A3 0x599D
+0xD5A4 0x4F5E
+0xD5A5 0x4FAB
+0xD5A6 0x59A3
+0xD5A7 0x59B2
+0xD5A8 0x59C6
+0xD5A9 0x59E8
+0xD5AA 0x59DC
+0xD5AB 0x598D
+0xD5AC 0x59D9
+0xD5AD 0x59DA
+0xD5AE 0x5A25
+0xD5AF 0x5A1F
+0xD5B0 0x5A11
+0xD5B1 0x5A1C
+0xD5B2 0x5A09
+0xD5B3 0x5A1A
+0xD5B4 0x5A40
+0xD5B5 0x5A6C
+0xD5B6 0x5A49
+0xD5B7 0x5A35
+0xD5B8 0x5A36
+0xD5B9 0x5A62
+0xD5BA 0x5A6A
+0xD5BB 0x5A9A
+0xD5BC 0x5ABC
+0xD5BD 0x5ABE
+0xD5BE 0x5ACB
+0xD5BF 0x5AC2
+0xD5C0 0x5ABD
+0xD5C1 0x5AE3
+0xD5C2 0x5AD7
+0xD5C3 0x5AE6
+0xD5C4 0x5AE9
+0xD5C5 0x5AD6
+0xD5C6 0x5AFA
+0xD5C7 0x5AFB
+0xD5C8 0x5B0C
+0xD5C9 0x5B0B
+0xD5CA 0x5B16
+0xD5CB 0x5B32
+0xD5CC 0x5AD0
+0xD5CD 0x5B2A
+0xD5CE 0x5B36
+0xD5CF 0x5B3E
+0xD5D0 0x5B43
+0xD5D1 0x5B45
+0xD5D2 0x5B40
+0xD5D3 0x5B51
+0xD5D4 0x5B55
+0xD5D5 0x5B5A
+0xD5D6 0x5B5B
+0xD5D7 0x5B65
+0xD5D8 0x5B69
+0xD5D9 0x5B70
+0xD5DA 0x5B73
+0xD5DB 0x5B75
+0xD5DC 0x5B78
+0xD5DD 0x6588
+0xD5DE 0x5B7A
+0xD5DF 0x5B80
+0xD5E0 0x5B83
+0xD5E1 0x5BA6
+0xD5E2 0x5BB8
+0xD5E3 0x5BC3
+0xD5E4 0x5BC7
+0xD5E5 0x5BC9
+0xD5E6 0x5BD4
+0xD5E7 0x5BD0
+0xD5E8 0x5BE4
+0xD5E9 0x5BE6
+0xD5EA 0x5BE2
+0xD5EB 0x5BDE
+0xD5EC 0x5BE5
+0xD5ED 0x5BEB
+0xD5EE 0x5BF0
+0xD5EF 0x5BF6
+0xD5F0 0x5BF3
+0xD5F1 0x5C05
+0xD5F2 0x5C07
+0xD5F3 0x5C08
+0xD5F4 0x5C0D
+0xD5F5 0x5C13
+0xD5F6 0x5C20
+0xD5F7 0x5C22
+0xD5F8 0x5C28
+0xD5F9 0x5C38
+0xD5FA 0x5C39
+0xD5FB 0x5C41
+0xD5FC 0x5C46
+0xD5FD 0x5C4E
+0xD5FE 0x5C53
+0xD6A1 0x5C50
+0xD6A2 0x5C4F
+0xD6A3 0x5B71
+0xD6A4 0x5C6C
+0xD6A5 0x5C6E
+0xD6A6 0x4E62
+0xD6A7 0x5C76
+0xD6A8 0x5C79
+0xD6A9 0x5C8C
+0xD6AA 0x5C91
+0xD6AB 0x5C94
+0xD6AC 0x599B
+0xD6AD 0x5CAB
+0xD6AE 0x5CBB
+0xD6AF 0x5CB6
+0xD6B0 0x5CBC
+0xD6B1 0x5CB7
+0xD6B2 0x5CC5
+0xD6B3 0x5CBE
+0xD6B4 0x5CC7
+0xD6B5 0x5CD9
+0xD6B6 0x5CE9
+0xD6B7 0x5CFD
+0xD6B8 0x5CFA
+0xD6B9 0x5CED
+0xD6BA 0x5D8C
+0xD6BB 0x5CEA
+0xD6BC 0x5D0B
+0xD6BD 0x5D15
+0xD6BE 0x5D17
+0xD6BF 0x5D5C
+0xD6C0 0x5D1F
+0xD6C1 0x5D1B
+0xD6C2 0x5D11
+0xD6C3 0x5D14
+0xD6C4 0x5D22
+0xD6C5 0x5D1A
+0xD6C6 0x5D19
+0xD6C7 0x5D18
+0xD6C8 0x5D4C
+0xD6C9 0x5D52
+0xD6CA 0x5D4E
+0xD6CB 0x5D4B
+0xD6CC 0x5D6C
+0xD6CD 0x5D73
+0xD6CE 0x5D76
+0xD6CF 0x5D87
+0xD6D0 0x5D84
+0xD6D1 0x5D82
+0xD6D2 0x5DA2
+0xD6D3 0x5D9D
+0xD6D4 0x5DAC
+0xD6D5 0x5DAE
+0xD6D6 0x5DBD
+0xD6D7 0x5D90
+0xD6D8 0x5DB7
+0xD6D9 0x5DBC
+0xD6DA 0x5DC9
+0xD6DB 0x5DCD
+0xD6DC 0x5DD3
+0xD6DD 0x5DD2
+0xD6DE 0x5DD6
+0xD6DF 0x5DDB
+0xD6E0 0x5DEB
+0xD6E1 0x5DF2
+0xD6E2 0x5DF5
+0xD6E3 0x5E0B
+0xD6E4 0x5E1A
+0xD6E5 0x5E19
+0xD6E6 0x5E11
+0xD6E7 0x5E1B
+0xD6E8 0x5E36
+0xD6E9 0x5E37
+0xD6EA 0x5E44
+0xD6EB 0x5E43
+0xD6EC 0x5E40
+0xD6ED 0x5E4E
+0xD6EE 0x5E57
+0xD6EF 0x5E54
+0xD6F0 0x5E5F
+0xD6F1 0x5E62
+0xD6F2 0x5E64
+0xD6F3 0x5E47
+0xD6F4 0x5E75
+0xD6F5 0x5E76
+0xD6F6 0x5E7A
+0xD6F7 0x9EBC
+0xD6F8 0x5E7F
+0xD6F9 0x5EA0
+0xD6FA 0x5EC1
+0xD6FB 0x5EC2
+0xD6FC 0x5EC8
+0xD6FD 0x5ED0
+0xD6FE 0x5ECF
+0xD7A1 0x5ED6
+0xD7A2 0x5EE3
+0xD7A3 0x5EDD
+0xD7A4 0x5EDA
+0xD7A5 0x5EDB
+0xD7A6 0x5EE2
+0xD7A7 0x5EE1
+0xD7A8 0x5EE8
+0xD7A9 0x5EE9
+0xD7AA 0x5EEC
+0xD7AB 0x5EF1
+0xD7AC 0x5EF3
+0xD7AD 0x5EF0
+0xD7AE 0x5EF4
+0xD7AF 0x5EF8
+0xD7B0 0x5EFE
+0xD7B1 0x5F03
+0xD7B2 0x5F09
+0xD7B3 0x5F5D
+0xD7B4 0x5F5C
+0xD7B5 0x5F0B
+0xD7B6 0x5F11
+0xD7B7 0x5F16
+0xD7B8 0x5F29
+0xD7B9 0x5F2D
+0xD7BA 0x5F38
+0xD7BB 0x5F41
+0xD7BC 0x5F48
+0xD7BD 0x5F4C
+0xD7BE 0x5F4E
+0xD7BF 0x5F2F
+0xD7C0 0x5F51
+0xD7C1 0x5F56
+0xD7C2 0x5F57
+0xD7C3 0x5F59
+0xD7C4 0x5F61
+0xD7C5 0x5F6D
+0xD7C6 0x5F73
+0xD7C7 0x5F77
+0xD7C8 0x5F83
+0xD7C9 0x5F82
+0xD7CA 0x5F7F
+0xD7CB 0x5F8A
+0xD7CC 0x5F88
+0xD7CD 0x5F91
+0xD7CE 0x5F87
+0xD7CF 0x5F9E
+0xD7D0 0x5F99
+0xD7D1 0x5F98
+0xD7D2 0x5FA0
+0xD7D3 0x5FA8
+0xD7D4 0x5FAD
+0xD7D5 0x5FBC
+0xD7D6 0x5FD6
+0xD7D7 0x5FFB
+0xD7D8 0x5FE4
+0xD7D9 0x5FF8
+0xD7DA 0x5FF1
+0xD7DB 0x5FDD
+0xD7DC 0x60B3
+0xD7DD 0x5FFF
+0xD7DE 0x6021
+0xD7DF 0x6060
+0xD7E0 0x6019
+0xD7E1 0x6010
+0xD7E2 0x6029
+0xD7E3 0x600E
+0xD7E4 0x6031
+0xD7E5 0x601B
+0xD7E6 0x6015
+0xD7E7 0x602B
+0xD7E8 0x6026
+0xD7E9 0x600F
+0xD7EA 0x603A
+0xD7EB 0x605A
+0xD7EC 0x6041
+0xD7ED 0x606A
+0xD7EE 0x6077
+0xD7EF 0x605F
+0xD7F0 0x604A
+0xD7F1 0x6046
+0xD7F2 0x604D
+0xD7F3 0x6063
+0xD7F4 0x6043
+0xD7F5 0x6064
+0xD7F6 0x6042
+0xD7F7 0x606C
+0xD7F8 0x606B
+0xD7F9 0x6059
+0xD7FA 0x6081
+0xD7FB 0x608D
+0xD7FC 0x60E7
+0xD7FD 0x6083
+0xD7FE 0x609A
+0xD8A1 0x6084
+0xD8A2 0x609B
+0xD8A3 0x6096
+0xD8A4 0x6097
+0xD8A5 0x6092
+0xD8A6 0x60A7
+0xD8A7 0x608B
+0xD8A8 0x60E1
+0xD8A9 0x60B8
+0xD8AA 0x60E0
+0xD8AB 0x60D3
+0xD8AC 0x60B4
+0xD8AD 0x5FF0
+0xD8AE 0x60BD
+0xD8AF 0x60C6
+0xD8B0 0x60B5
+0xD8B1 0x60D8
+0xD8B2 0x614D
+0xD8B3 0x6115
+0xD8B4 0x6106
+0xD8B5 0x60F6
+0xD8B6 0x60F7
+0xD8B7 0x6100
+0xD8B8 0x60F4
+0xD8B9 0x60FA
+0xD8BA 0x6103
+0xD8BB 0x6121
+0xD8BC 0x60FB
+0xD8BD 0x60F1
+0xD8BE 0x610D
+0xD8BF 0x610E
+0xD8C0 0x6147
+0xD8C1 0x613E
+0xD8C2 0x6128
+0xD8C3 0x6127
+0xD8C4 0x614A
+0xD8C5 0x613F
+0xD8C6 0x613C
+0xD8C7 0x612C
+0xD8C8 0x6134
+0xD8C9 0x613D
+0xD8CA 0x6142
+0xD8CB 0x6144
+0xD8CC 0x6173
+0xD8CD 0x6177
+0xD8CE 0x6158
+0xD8CF 0x6159
+0xD8D0 0x615A
+0xD8D1 0x616B
+0xD8D2 0x6174
+0xD8D3 0x616F
+0xD8D4 0x6165
+0xD8D5 0x6171
+0xD8D6 0x615F
+0xD8D7 0x615D
+0xD8D8 0x6153
+0xD8D9 0x6175
+0xD8DA 0x6199
+0xD8DB 0x6196
+0xD8DC 0x6187
+0xD8DD 0x61AC
+0xD8DE 0x6194
+0xD8DF 0x619A
+0xD8E0 0x618A
+0xD8E1 0x6191
+0xD8E2 0x61AB
+0xD8E3 0x61AE
+0xD8E4 0x61CC
+0xD8E5 0x61CA
+0xD8E6 0x61C9
+0xD8E7 0x61F7
+0xD8E8 0x61C8
+0xD8E9 0x61C3
+0xD8EA 0x61C6
+0xD8EB 0x61BA
+0xD8EC 0x61CB
+0xD8ED 0x7F79
+0xD8EE 0x61CD
+0xD8EF 0x61E6
+0xD8F0 0x61E3
+0xD8F1 0x61F6
+0xD8F2 0x61FA
+0xD8F3 0x61F4
+0xD8F4 0x61FF
+0xD8F5 0x61FD
+0xD8F6 0x61FC
+0xD8F7 0x61FE
+0xD8F8 0x6200
+0xD8F9 0x6208
+0xD8FA 0x6209
+0xD8FB 0x620D
+0xD8FC 0x620C
+0xD8FD 0x6214
+0xD8FE 0x621B
+0xD9A1 0x621E
+0xD9A2 0x6221
+0xD9A3 0x622A
+0xD9A4 0x622E
+0xD9A5 0x6230
+0xD9A6 0x6232
+0xD9A7 0x6233
+0xD9A8 0x6241
+0xD9A9 0x624E
+0xD9AA 0x625E
+0xD9AB 0x6263
+0xD9AC 0x625B
+0xD9AD 0x6260
+0xD9AE 0x6268
+0xD9AF 0x627C
+0xD9B0 0x6282
+0xD9B1 0x6289
+0xD9B2 0x627E
+0xD9B3 0x6292
+0xD9B4 0x6293
+0xD9B5 0x6296
+0xD9B6 0x62D4
+0xD9B7 0x6283
+0xD9B8 0x6294
+0xD9B9 0x62D7
+0xD9BA 0x62D1
+0xD9BB 0x62BB
+0xD9BC 0x62CF
+0xD9BD 0x62FF
+0xD9BE 0x62C6
+0xD9BF 0x64D4
+0xD9C0 0x62C8
+0xD9C1 0x62DC
+0xD9C2 0x62CC
+0xD9C3 0x62CA
+0xD9C4 0x62C2
+0xD9C5 0x62C7
+0xD9C6 0x629B
+0xD9C7 0x62C9
+0xD9C8 0x630C
+0xD9C9 0x62EE
+0xD9CA 0x62F1
+0xD9CB 0x6327
+0xD9CC 0x6302
+0xD9CD 0x6308
+0xD9CE 0x62EF
+0xD9CF 0x62F5
+0xD9D0 0x6350
+0xD9D1 0x633E
+0xD9D2 0x634D
+0xD9D3 0x641C
+0xD9D4 0x634F
+0xD9D5 0x6396
+0xD9D6 0x638E
+0xD9D7 0x6380
+0xD9D8 0x63AB
+0xD9D9 0x6376
+0xD9DA 0x63A3
+0xD9DB 0x638F
+0xD9DC 0x6389
+0xD9DD 0x639F
+0xD9DE 0x63B5
+0xD9DF 0x636B
+0xD9E0 0x6369
+0xD9E1 0x63BE
+0xD9E2 0x63E9
+0xD9E3 0x63C0
+0xD9E4 0x63C6
+0xD9E5 0x63E3
+0xD9E6 0x63C9
+0xD9E7 0x63D2
+0xD9E8 0x63F6
+0xD9E9 0x63C4
+0xD9EA 0x6416
+0xD9EB 0x6434
+0xD9EC 0x6406
+0xD9ED 0x6413
+0xD9EE 0x6426
+0xD9EF 0x6436
+0xD9F0 0x651D
+0xD9F1 0x6417
+0xD9F2 0x6428
+0xD9F3 0x640F
+0xD9F4 0x6467
+0xD9F5 0x646F
+0xD9F6 0x6476
+0xD9F7 0x644E
+0xD9F8 0x652A
+0xD9F9 0x6495
+0xD9FA 0x6493
+0xD9FB 0x64A5
+0xD9FC 0x64A9
+0xD9FD 0x6488
+0xD9FE 0x64BC
+0xDAA1 0x64DA
+0xDAA2 0x64D2
+0xDAA3 0x64C5
+0xDAA4 0x64C7
+0xDAA5 0x64BB
+0xDAA6 0x64D8
+0xDAA7 0x64C2
+0xDAA8 0x64F1
+0xDAA9 0x64E7
+0xDAAA 0x8209
+0xDAAB 0x64E0
+0xDAAC 0x64E1
+0xDAAD 0x62AC
+0xDAAE 0x64E3
+0xDAAF 0x64EF
+0xDAB0 0x652C
+0xDAB1 0x64F6
+0xDAB2 0x64F4
+0xDAB3 0x64F2
+0xDAB4 0x64FA
+0xDAB5 0x6500
+0xDAB6 0x64FD
+0xDAB7 0x6518
+0xDAB8 0x651C
+0xDAB9 0x6505
+0xDABA 0x6524
+0xDABB 0x6523
+0xDABC 0x652B
+0xDABD 0x6534
+0xDABE 0x6535
+0xDABF 0x6537
+0xDAC0 0x6536
+0xDAC1 0x6538
+0xDAC2 0x754B
+0xDAC3 0x6548
+0xDAC4 0x6556
+0xDAC5 0x6555
+0xDAC6 0x654D
+0xDAC7 0x6558
+0xDAC8 0x655E
+0xDAC9 0x655D
+0xDACA 0x6572
+0xDACB 0x6578
+0xDACC 0x6582
+0xDACD 0x6583
+0xDACE 0x8B8A
+0xDACF 0x659B
+0xDAD0 0x659F
+0xDAD1 0x65AB
+0xDAD2 0x65B7
+0xDAD3 0x65C3
+0xDAD4 0x65C6
+0xDAD5 0x65C1
+0xDAD6 0x65C4
+0xDAD7 0x65CC
+0xDAD8 0x65D2
+0xDAD9 0x65DB
+0xDADA 0x65D9
+0xDADB 0x65E0
+0xDADC 0x65E1
+0xDADD 0x65F1
+0xDADE 0x6772
+0xDADF 0x660A
+0xDAE0 0x6603
+0xDAE1 0x65FB
+0xDAE2 0x6773
+0xDAE3 0x6635
+0xDAE4 0x6636
+0xDAE5 0x6634
+0xDAE6 0x661C
+0xDAE7 0x664F
+0xDAE8 0x6644
+0xDAE9 0x6649
+0xDAEA 0x6641
+0xDAEB 0x665E
+0xDAEC 0x665D
+0xDAED 0x6664
+0xDAEE 0x6667
+0xDAEF 0x6668
+0xDAF0 0x665F
+0xDAF1 0x6662
+0xDAF2 0x6670
+0xDAF3 0x6683
+0xDAF4 0x6688
+0xDAF5 0x668E
+0xDAF6 0x6689
+0xDAF7 0x6684
+0xDAF8 0x6698
+0xDAF9 0x669D
+0xDAFA 0x66C1
+0xDAFB 0x66B9
+0xDAFC 0x66C9
+0xDAFD 0x66BE
+0xDAFE 0x66BC
+0xDBA1 0x66C4
+0xDBA2 0x66B8
+0xDBA3 0x66D6
+0xDBA4 0x66DA
+0xDBA5 0x66E0
+0xDBA6 0x663F
+0xDBA7 0x66E6
+0xDBA8 0x66E9
+0xDBA9 0x66F0
+0xDBAA 0x66F5
+0xDBAB 0x66F7
+0xDBAC 0x670F
+0xDBAD 0x6716
+0xDBAE 0x671E
+0xDBAF 0x6726
+0xDBB0 0x6727
+0xDBB1 0x9738
+0xDBB2 0x672E
+0xDBB3 0x673F
+0xDBB4 0x6736
+0xDBB5 0x6741
+0xDBB6 0x6738
+0xDBB7 0x6737
+0xDBB8 0x6746
+0xDBB9 0x675E
+0xDBBA 0x6760
+0xDBBB 0x6759
+0xDBBC 0x6763
+0xDBBD 0x6764
+0xDBBE 0x6789
+0xDBBF 0x6770
+0xDBC0 0x67A9
+0xDBC1 0x677C
+0xDBC2 0x676A
+0xDBC3 0x678C
+0xDBC4 0x678B
+0xDBC5 0x67A6
+0xDBC6 0x67A1
+0xDBC7 0x6785
+0xDBC8 0x67B7
+0xDBC9 0x67EF
+0xDBCA 0x67B4
+0xDBCB 0x67EC
+0xDBCC 0x67B3
+0xDBCD 0x67E9
+0xDBCE 0x67B8
+0xDBCF 0x67E4
+0xDBD0 0x67DE
+0xDBD1 0x67DD
+0xDBD2 0x67E2
+0xDBD3 0x67EE
+0xDBD4 0x67B9
+0xDBD5 0x67CE
+0xDBD6 0x67C6
+0xDBD7 0x67E7
+0xDBD8 0x6A9C
+0xDBD9 0x681E
+0xDBDA 0x6846
+0xDBDB 0x6829
+0xDBDC 0x6840
+0xDBDD 0x684D
+0xDBDE 0x6832
+0xDBDF 0x684E
+0xDBE0 0x68B3
+0xDBE1 0x682B
+0xDBE2 0x6859
+0xDBE3 0x6863
+0xDBE4 0x6877
+0xDBE5 0x687F
+0xDBE6 0x689F
+0xDBE7 0x688F
+0xDBE8 0x68AD
+0xDBE9 0x6894
+0xDBEA 0x689D
+0xDBEB 0x689B
+0xDBEC 0x6883
+0xDBED 0x6AAE
+0xDBEE 0x68B9
+0xDBEF 0x6874
+0xDBF0 0x68B5
+0xDBF1 0x68A0
+0xDBF2 0x68BA
+0xDBF3 0x690F
+0xDBF4 0x688D
+0xDBF5 0x687E
+0xDBF6 0x6901
+0xDBF7 0x68CA
+0xDBF8 0x6908
+0xDBF9 0x68D8
+0xDBFA 0x6922
+0xDBFB 0x6926
+0xDBFC 0x68E1
+0xDBFD 0x690C
+0xDBFE 0x68CD
+0xDCA1 0x68D4
+0xDCA2 0x68E7
+0xDCA3 0x68D5
+0xDCA4 0x6936
+0xDCA5 0x6912
+0xDCA6 0x6904
+0xDCA7 0x68D7
+0xDCA8 0x68E3
+0xDCA9 0x6925
+0xDCAA 0x68F9
+0xDCAB 0x68E0
+0xDCAC 0x68EF
+0xDCAD 0x6928
+0xDCAE 0x692A
+0xDCAF 0x691A
+0xDCB0 0x6923
+0xDCB1 0x6921
+0xDCB2 0x68C6
+0xDCB3 0x6979
+0xDCB4 0x6977
+0xDCB5 0x695C
+0xDCB6 0x6978
+0xDCB7 0x696B
+0xDCB8 0x6954
+0xDCB9 0x697E
+0xDCBA 0x696E
+0xDCBB 0x6939
+0xDCBC 0x6974
+0xDCBD 0x693D
+0xDCBE 0x6959
+0xDCBF 0x6930
+0xDCC0 0x6961
+0xDCC1 0x695E
+0xDCC2 0x695D
+0xDCC3 0x6981
+0xDCC4 0x696A
+0xDCC5 0x69B2
+0xDCC6 0x69AE
+0xDCC7 0x69D0
+0xDCC8 0x69BF
+0xDCC9 0x69C1
+0xDCCA 0x69D3
+0xDCCB 0x69BE
+0xDCCC 0x69CE
+0xDCCD 0x5BE8
+0xDCCE 0x69CA
+0xDCCF 0x69DD
+0xDCD0 0x69BB
+0xDCD1 0x69C3
+0xDCD2 0x69A7
+0xDCD3 0x6A2E
+0xDCD4 0x6991
+0xDCD5 0x69A0
+0xDCD6 0x699C
+0xDCD7 0x6995
+0xDCD8 0x69B4
+0xDCD9 0x69DE
+0xDCDA 0x69E8
+0xDCDB 0x6A02
+0xDCDC 0x6A1B
+0xDCDD 0x69FF
+0xDCDE 0x6B0A
+0xDCDF 0x69F9
+0xDCE0 0x69F2
+0xDCE1 0x69E7
+0xDCE2 0x6A05
+0xDCE3 0x69B1
+0xDCE4 0x6A1E
+0xDCE5 0x69ED
+0xDCE6 0x6A14
+0xDCE7 0x69EB
+0xDCE8 0x6A0A
+0xDCE9 0x6A12
+0xDCEA 0x6AC1
+0xDCEB 0x6A23
+0xDCEC 0x6A13
+0xDCED 0x6A44
+0xDCEE 0x6A0C
+0xDCEF 0x6A72
+0xDCF0 0x6A36
+0xDCF1 0x6A78
+0xDCF2 0x6A47
+0xDCF3 0x6A62
+0xDCF4 0x6A59
+0xDCF5 0x6A66
+0xDCF6 0x6A48
+0xDCF7 0x6A38
+0xDCF8 0x6A22
+0xDCF9 0x6A90
+0xDCFA 0x6A8D
+0xDCFB 0x6AA0
+0xDCFC 0x6A84
+0xDCFD 0x6AA2
+0xDCFE 0x6AA3
+0xDDA1 0x6A97
+0xDDA2 0x8617
+0xDDA3 0x6ABB
+0xDDA4 0x6AC3
+0xDDA5 0x6AC2
+0xDDA6 0x6AB8
+0xDDA7 0x6AB3
+0xDDA8 0x6AAC
+0xDDA9 0x6ADE
+0xDDAA 0x6AD1
+0xDDAB 0x6ADF
+0xDDAC 0x6AAA
+0xDDAD 0x6ADA
+0xDDAE 0x6AEA
+0xDDAF 0x6AFB
+0xDDB0 0x6B05
+0xDDB1 0x8616
+0xDDB2 0x6AFA
+0xDDB3 0x6B12
+0xDDB4 0x6B16
+0xDDB5 0x9B31
+0xDDB6 0x6B1F
+0xDDB7 0x6B38
+0xDDB8 0x6B37
+0xDDB9 0x76DC
+0xDDBA 0x6B39
+0xDDBB 0x98EE
+0xDDBC 0x6B47
+0xDDBD 0x6B43
+0xDDBE 0x6B49
+0xDDBF 0x6B50
+0xDDC0 0x6B59
+0xDDC1 0x6B54
+0xDDC2 0x6B5B
+0xDDC3 0x6B5F
+0xDDC4 0x6B61
+0xDDC5 0x6B78
+0xDDC6 0x6B79
+0xDDC7 0x6B7F
+0xDDC8 0x6B80
+0xDDC9 0x6B84
+0xDDCA 0x6B83
+0xDDCB 0x6B8D
+0xDDCC 0x6B98
+0xDDCD 0x6B95
+0xDDCE 0x6B9E
+0xDDCF 0x6BA4
+0xDDD0 0x6BAA
+0xDDD1 0x6BAB
+0xDDD2 0x6BAF
+0xDDD3 0x6BB2
+0xDDD4 0x6BB1
+0xDDD5 0x6BB3
+0xDDD6 0x6BB7
+0xDDD7 0x6BBC
+0xDDD8 0x6BC6
+0xDDD9 0x6BCB
+0xDDDA 0x6BD3
+0xDDDB 0x6BDF
+0xDDDC 0x6BEC
+0xDDDD 0x6BEB
+0xDDDE 0x6BF3
+0xDDDF 0x6BEF
+0xDDE0 0x9EBE
+0xDDE1 0x6C08
+0xDDE2 0x6C13
+0xDDE3 0x6C14
+0xDDE4 0x6C1B
+0xDDE5 0x6C24
+0xDDE6 0x6C23
+0xDDE7 0x6C5E
+0xDDE8 0x6C55
+0xDDE9 0x6C62
+0xDDEA 0x6C6A
+0xDDEB 0x6C82
+0xDDEC 0x6C8D
+0xDDED 0x6C9A
+0xDDEE 0x6C81
+0xDDEF 0x6C9B
+0xDDF0 0x6C7E
+0xDDF1 0x6C68
+0xDDF2 0x6C73
+0xDDF3 0x6C92
+0xDDF4 0x6C90
+0xDDF5 0x6CC4
+0xDDF6 0x6CF1
+0xDDF7 0x6CD3
+0xDDF8 0x6CBD
+0xDDF9 0x6CD7
+0xDDFA 0x6CC5
+0xDDFB 0x6CDD
+0xDDFC 0x6CAE
+0xDDFD 0x6CB1
+0xDDFE 0x6CBE
+0xDEA1 0x6CBA
+0xDEA2 0x6CDB
+0xDEA3 0x6CEF
+0xDEA4 0x6CD9
+0xDEA5 0x6CEA
+0xDEA6 0x6D1F
+0xDEA7 0x884D
+0xDEA8 0x6D36
+0xDEA9 0x6D2B
+0xDEAA 0x6D3D
+0xDEAB 0x6D38
+0xDEAC 0x6D19
+0xDEAD 0x6D35
+0xDEAE 0x6D33
+0xDEAF 0x6D12
+0xDEB0 0x6D0C
+0xDEB1 0x6D63
+0xDEB2 0x6D93
+0xDEB3 0x6D64
+0xDEB4 0x6D5A
+0xDEB5 0x6D79
+0xDEB6 0x6D59
+0xDEB7 0x6D8E
+0xDEB8 0x6D95
+0xDEB9 0x6FE4
+0xDEBA 0x6D85
+0xDEBB 0x6DF9
+0xDEBC 0x6E15
+0xDEBD 0x6E0A
+0xDEBE 0x6DB5
+0xDEBF 0x6DC7
+0xDEC0 0x6DE6
+0xDEC1 0x6DB8
+0xDEC2 0x6DC6
+0xDEC3 0x6DEC
+0xDEC4 0x6DDE
+0xDEC5 0x6DCC
+0xDEC6 0x6DE8
+0xDEC7 0x6DD2
+0xDEC8 0x6DC5
+0xDEC9 0x6DFA
+0xDECA 0x6DD9
+0xDECB 0x6DE4
+0xDECC 0x6DD5
+0xDECD 0x6DEA
+0xDECE 0x6DEE
+0xDECF 0x6E2D
+0xDED0 0x6E6E
+0xDED1 0x6E2E
+0xDED2 0x6E19
+0xDED3 0x6E72
+0xDED4 0x6E5F
+0xDED5 0x6E3E
+0xDED6 0x6E23
+0xDED7 0x6E6B
+0xDED8 0x6E2B
+0xDED9 0x6E76
+0xDEDA 0x6E4D
+0xDEDB 0x6E1F
+0xDEDC 0x6E43
+0xDEDD 0x6E3A
+0xDEDE 0x6E4E
+0xDEDF 0x6E24
+0xDEE0 0x6EFF
+0xDEE1 0x6E1D
+0xDEE2 0x6E38
+0xDEE3 0x6E82
+0xDEE4 0x6EAA
+0xDEE5 0x6E98
+0xDEE6 0x6EC9
+0xDEE7 0x6EB7
+0xDEE8 0x6ED3
+0xDEE9 0x6EBD
+0xDEEA 0x6EAF
+0xDEEB 0x6EC4
+0xDEEC 0x6EB2
+0xDEED 0x6ED4
+0xDEEE 0x6ED5
+0xDEEF 0x6E8F
+0xDEF0 0x6EA5
+0xDEF1 0x6EC2
+0xDEF2 0x6E9F
+0xDEF3 0x6F41
+0xDEF4 0x6F11
+0xDEF5 0x704C
+0xDEF6 0x6EEC
+0xDEF7 0x6EF8
+0xDEF8 0x6EFE
+0xDEF9 0x6F3F
+0xDEFA 0x6EF2
+0xDEFB 0x6F31
+0xDEFC 0x6EEF
+0xDEFD 0x6F32
+0xDEFE 0x6ECC
+0xDFA1 0x6F3E
+0xDFA2 0x6F13
+0xDFA3 0x6EF7
+0xDFA4 0x6F86
+0xDFA5 0x6F7A
+0xDFA6 0x6F78
+0xDFA7 0x6F81
+0xDFA8 0x6F80
+0xDFA9 0x6F6F
+0xDFAA 0x6F5B
+0xDFAB 0x6FF3
+0xDFAC 0x6F6D
+0xDFAD 0x6F82
+0xDFAE 0x6F7C
+0xDFAF 0x6F58
+0xDFB0 0x6F8E
+0xDFB1 0x6F91
+0xDFB2 0x6FC2
+0xDFB3 0x6F66
+0xDFB4 0x6FB3
+0xDFB5 0x6FA3
+0xDFB6 0x6FA1
+0xDFB7 0x6FA4
+0xDFB8 0x6FB9
+0xDFB9 0x6FC6
+0xDFBA 0x6FAA
+0xDFBB 0x6FDF
+0xDFBC 0x6FD5
+0xDFBD 0x6FEC
+0xDFBE 0x6FD4
+0xDFBF 0x6FD8
+0xDFC0 0x6FF1
+0xDFC1 0x6FEE
+0xDFC2 0x6FDB
+0xDFC3 0x7009
+0xDFC4 0x700B
+0xDFC5 0x6FFA
+0xDFC6 0x7011
+0xDFC7 0x7001
+0xDFC8 0x700F
+0xDFC9 0x6FFE
+0xDFCA 0x701B
+0xDFCB 0x701A
+0xDFCC 0x6F74
+0xDFCD 0x701D
+0xDFCE 0x7018
+0xDFCF 0x701F
+0xDFD0 0x7030
+0xDFD1 0x703E
+0xDFD2 0x7032
+0xDFD3 0x7051
+0xDFD4 0x7063
+0xDFD5 0x7099
+0xDFD6 0x7092
+0xDFD7 0x70AF
+0xDFD8 0x70F1
+0xDFD9 0x70AC
+0xDFDA 0x70B8
+0xDFDB 0x70B3
+0xDFDC 0x70AE
+0xDFDD 0x70DF
+0xDFDE 0x70CB
+0xDFDF 0x70DD
+0xDFE0 0x70D9
+0xDFE1 0x7109
+0xDFE2 0x70FD
+0xDFE3 0x711C
+0xDFE4 0x7119
+0xDFE5 0x7165
+0xDFE6 0x7155
+0xDFE7 0x7188
+0xDFE8 0x7166
+0xDFE9 0x7162
+0xDFEA 0x714C
+0xDFEB 0x7156
+0xDFEC 0x716C
+0xDFED 0x718F
+0xDFEE 0x71FB
+0xDFEF 0x7184
+0xDFF0 0x7195
+0xDFF1 0x71A8
+0xDFF2 0x71AC
+0xDFF3 0x71D7
+0xDFF4 0x71B9
+0xDFF5 0x71BE
+0xDFF6 0x71D2
+0xDFF7 0x71C9
+0xDFF8 0x71D4
+0xDFF9 0x71CE
+0xDFFA 0x71E0
+0xDFFB 0x71EC
+0xDFFC 0x71E7
+0xDFFD 0x71F5
+0xDFFE 0x71FC
+0xE0A1 0x71F9
+0xE0A2 0x71FF
+0xE0A3 0x720D
+0xE0A4 0x7210
+0xE0A5 0x721B
+0xE0A6 0x7228
+0xE0A7 0x722D
+0xE0A8 0x722C
+0xE0A9 0x7230
+0xE0AA 0x7232
+0xE0AB 0x723B
+0xE0AC 0x723C
+0xE0AD 0x723F
+0xE0AE 0x7240
+0xE0AF 0x7246
+0xE0B0 0x724B
+0xE0B1 0x7258
+0xE0B2 0x7274
+0xE0B3 0x727E
+0xE0B4 0x7282
+0xE0B5 0x7281
+0xE0B6 0x7287
+0xE0B7 0x7292
+0xE0B8 0x7296
+0xE0B9 0x72A2
+0xE0BA 0x72A7
+0xE0BB 0x72B9
+0xE0BC 0x72B2
+0xE0BD 0x72C3
+0xE0BE 0x72C6
+0xE0BF 0x72C4
+0xE0C0 0x72CE
+0xE0C1 0x72D2
+0xE0C2 0x72E2
+0xE0C3 0x72E0
+0xE0C4 0x72E1
+0xE0C5 0x72F9
+0xE0C6 0x72F7
+0xE0C7 0x500F
+0xE0C8 0x7317
+0xE0C9 0x730A
+0xE0CA 0x731C
+0xE0CB 0x7316
+0xE0CC 0x731D
+0xE0CD 0x7334
+0xE0CE 0x732F
+0xE0CF 0x7329
+0xE0D0 0x7325
+0xE0D1 0x733E
+0xE0D2 0x734E
+0xE0D3 0x734F
+0xE0D4 0x9ED8
+0xE0D5 0x7357
+0xE0D6 0x736A
+0xE0D7 0x7368
+0xE0D8 0x7370
+0xE0D9 0x7378
+0xE0DA 0x7375
+0xE0DB 0x737B
+0xE0DC 0x737A
+0xE0DD 0x73C8
+0xE0DE 0x73B3
+0xE0DF 0x73CE
+0xE0E0 0x73BB
+0xE0E1 0x73C0
+0xE0E2 0x73E5
+0xE0E3 0x73EE
+0xE0E4 0x73DE
+0xE0E5 0x74A2
+0xE0E6 0x7405
+0xE0E7 0x746F
+0xE0E8 0x7425
+0xE0E9 0x73F8
+0xE0EA 0x7432
+0xE0EB 0x743A
+0xE0EC 0x7455
+0xE0ED 0x743F
+0xE0EE 0x745F
+0xE0EF 0x7459
+0xE0F0 0x7441
+0xE0F1 0x745C
+0xE0F2 0x7469
+0xE0F3 0x7470
+0xE0F4 0x7463
+0xE0F5 0x746A
+0xE0F6 0x7476
+0xE0F7 0x747E
+0xE0F8 0x748B
+0xE0F9 0x749E
+0xE0FA 0x74A7
+0xE0FB 0x74CA
+0xE0FC 0x74CF
+0xE0FD 0x74D4
+0xE0FE 0x73F1
+0xE1A1 0x74E0
+0xE1A2 0x74E3
+0xE1A3 0x74E7
+0xE1A4 0x74E9
+0xE1A5 0x74EE
+0xE1A6 0x74F2
+0xE1A7 0x74F0
+0xE1A8 0x74F1
+0xE1A9 0x74F8
+0xE1AA 0x74F7
+0xE1AB 0x7504
+0xE1AC 0x7503
+0xE1AD 0x7505
+0xE1AE 0x750C
+0xE1AF 0x750E
+0xE1B0 0x750D
+0xE1B1 0x7515
+0xE1B2 0x7513
+0xE1B3 0x751E
+0xE1B4 0x7526
+0xE1B5 0x752C
+0xE1B6 0x753C
+0xE1B7 0x7544
+0xE1B8 0x754D
+0xE1B9 0x754A
+0xE1BA 0x7549
+0xE1BB 0x755B
+0xE1BC 0x7546
+0xE1BD 0x755A
+0xE1BE 0x7569
+0xE1BF 0x7564
+0xE1C0 0x7567
+0xE1C1 0x756B
+0xE1C2 0x756D
+0xE1C3 0x7578
+0xE1C4 0x7576
+0xE1C5 0x7586
+0xE1C6 0x7587
+0xE1C7 0x7574
+0xE1C8 0x758A
+0xE1C9 0x7589
+0xE1CA 0x7582
+0xE1CB 0x7594
+0xE1CC 0x759A
+0xE1CD 0x759D
+0xE1CE 0x75A5
+0xE1CF 0x75A3
+0xE1D0 0x75C2
+0xE1D1 0x75B3
+0xE1D2 0x75C3
+0xE1D3 0x75B5
+0xE1D4 0x75BD
+0xE1D5 0x75B8
+0xE1D6 0x75BC
+0xE1D7 0x75B1
+0xE1D8 0x75CD
+0xE1D9 0x75CA
+0xE1DA 0x75D2
+0xE1DB 0x75D9
+0xE1DC 0x75E3
+0xE1DD 0x75DE
+0xE1DE 0x75FE
+0xE1DF 0x75FF
+0xE1E0 0x75FC
+0xE1E1 0x7601
+0xE1E2 0x75F0
+0xE1E3 0x75FA
+0xE1E4 0x75F2
+0xE1E5 0x75F3
+0xE1E6 0x760B
+0xE1E7 0x760D
+0xE1E8 0x7609
+0xE1E9 0x761F
+0xE1EA 0x7627
+0xE1EB 0x7620
+0xE1EC 0x7621
+0xE1ED 0x7622
+0xE1EE 0x7624
+0xE1EF 0x7634
+0xE1F0 0x7630
+0xE1F1 0x763B
+0xE1F2 0x7647
+0xE1F3 0x7648
+0xE1F4 0x7646
+0xE1F5 0x765C
+0xE1F6 0x7658
+0xE1F7 0x7661
+0xE1F8 0x7662
+0xE1F9 0x7668
+0xE1FA 0x7669
+0xE1FB 0x766A
+0xE1FC 0x7667
+0xE1FD 0x766C
+0xE1FE 0x7670
+0xE2A1 0x7672
+0xE2A2 0x7676
+0xE2A3 0x7678
+0xE2A4 0x767C
+0xE2A5 0x7680
+0xE2A6 0x7683
+0xE2A7 0x7688
+0xE2A8 0x768B
+0xE2A9 0x768E
+0xE2AA 0x7696
+0xE2AB 0x7693
+0xE2AC 0x7699
+0xE2AD 0x769A
+0xE2AE 0x76B0
+0xE2AF 0x76B4
+0xE2B0 0x76B8
+0xE2B1 0x76B9
+0xE2B2 0x76BA
+0xE2B3 0x76C2
+0xE2B4 0x76CD
+0xE2B5 0x76D6
+0xE2B6 0x76D2
+0xE2B7 0x76DE
+0xE2B8 0x76E1
+0xE2B9 0x76E5
+0xE2BA 0x76E7
+0xE2BB 0x76EA
+0xE2BC 0x862F
+0xE2BD 0x76FB
+0xE2BE 0x7708
+0xE2BF 0x7707
+0xE2C0 0x7704
+0xE2C1 0x7729
+0xE2C2 0x7724
+0xE2C3 0x771E
+0xE2C4 0x7725
+0xE2C5 0x7726
+0xE2C6 0x771B
+0xE2C7 0x7737
+0xE2C8 0x7738
+0xE2C9 0x7747
+0xE2CA 0x775A
+0xE2CB 0x7768
+0xE2CC 0x776B
+0xE2CD 0x775B
+0xE2CE 0x7765
+0xE2CF 0x777F
+0xE2D0 0x777E
+0xE2D1 0x7779
+0xE2D2 0x778E
+0xE2D3 0x778B
+0xE2D4 0x7791
+0xE2D5 0x77A0
+0xE2D6 0x779E
+0xE2D7 0x77B0
+0xE2D8 0x77B6
+0xE2D9 0x77B9
+0xE2DA 0x77BF
+0xE2DB 0x77BC
+0xE2DC 0x77BD
+0xE2DD 0x77BB
+0xE2DE 0x77C7
+0xE2DF 0x77CD
+0xE2E0 0x77D7
+0xE2E1 0x77DA
+0xE2E2 0x77DC
+0xE2E3 0x77E3
+0xE2E4 0x77EE
+0xE2E5 0x77FC
+0xE2E6 0x780C
+0xE2E7 0x7812
+0xE2E8 0x7926
+0xE2E9 0x7820
+0xE2EA 0x792A
+0xE2EB 0x7845
+0xE2EC 0x788E
+0xE2ED 0x7874
+0xE2EE 0x7886
+0xE2EF 0x787C
+0xE2F0 0x789A
+0xE2F1 0x788C
+0xE2F2 0x78A3
+0xE2F3 0x78B5
+0xE2F4 0x78AA
+0xE2F5 0x78AF
+0xE2F6 0x78D1
+0xE2F7 0x78C6
+0xE2F8 0x78CB
+0xE2F9 0x78D4
+0xE2FA 0x78BE
+0xE2FB 0x78BC
+0xE2FC 0x78C5
+0xE2FD 0x78CA
+0xE2FE 0x78EC
+0xE3A1 0x78E7
+0xE3A2 0x78DA
+0xE3A3 0x78FD
+0xE3A4 0x78F4
+0xE3A5 0x7907
+0xE3A6 0x7912
+0xE3A7 0x7911
+0xE3A8 0x7919
+0xE3A9 0x792C
+0xE3AA 0x792B
+0xE3AB 0x7940
+0xE3AC 0x7960
+0xE3AD 0x7957
+0xE3AE 0x795F
+0xE3AF 0x795A
+0xE3B0 0x7955
+0xE3B1 0x7953
+0xE3B2 0x797A
+0xE3B3 0x797F
+0xE3B4 0x798A
+0xE3B5 0x799D
+0xE3B6 0x79A7
+0xE3B7 0x9F4B
+0xE3B8 0x79AA
+0xE3B9 0x79AE
+0xE3BA 0x79B3
+0xE3BB 0x79B9
+0xE3BC 0x79BA
+0xE3BD 0x79C9
+0xE3BE 0x79D5
+0xE3BF 0x79E7
+0xE3C0 0x79EC
+0xE3C1 0x79E1
+0xE3C2 0x79E3
+0xE3C3 0x7A08
+0xE3C4 0x7A0D
+0xE3C5 0x7A18
+0xE3C6 0x7A19
+0xE3C7 0x7A20
+0xE3C8 0x7A1F
+0xE3C9 0x7980
+0xE3CA 0x7A31
+0xE3CB 0x7A3B
+0xE3CC 0x7A3E
+0xE3CD 0x7A37
+0xE3CE 0x7A43
+0xE3CF 0x7A57
+0xE3D0 0x7A49
+0xE3D1 0x7A61
+0xE3D2 0x7A62
+0xE3D3 0x7A69
+0xE3D4 0x9F9D
+0xE3D5 0x7A70
+0xE3D6 0x7A79
+0xE3D7 0x7A7D
+0xE3D8 0x7A88
+0xE3D9 0x7A97
+0xE3DA 0x7A95
+0xE3DB 0x7A98
+0xE3DC 0x7A96
+0xE3DD 0x7AA9
+0xE3DE 0x7AC8
+0xE3DF 0x7AB0
+0xE3E0 0x7AB6
+0xE3E1 0x7AC5
+0xE3E2 0x7AC4
+0xE3E3 0x7ABF
+0xE3E4 0x9083
+0xE3E5 0x7AC7
+0xE3E6 0x7ACA
+0xE3E7 0x7ACD
+0xE3E8 0x7ACF
+0xE3E9 0x7AD5
+0xE3EA 0x7AD3
+0xE3EB 0x7AD9
+0xE3EC 0x7ADA
+0xE3ED 0x7ADD
+0xE3EE 0x7AE1
+0xE3EF 0x7AE2
+0xE3F0 0x7AE6
+0xE3F1 0x7AED
+0xE3F2 0x7AF0
+0xE3F3 0x7B02
+0xE3F4 0x7B0F
+0xE3F5 0x7B0A
+0xE3F6 0x7B06
+0xE3F7 0x7B33
+0xE3F8 0x7B18
+0xE3F9 0x7B19
+0xE3FA 0x7B1E
+0xE3FB 0x7B35
+0xE3FC 0x7B28
+0xE3FD 0x7B36
+0xE3FE 0x7B50
+0xE4A1 0x7B7A
+0xE4A2 0x7B04
+0xE4A3 0x7B4D
+0xE4A4 0x7B0B
+0xE4A5 0x7B4C
+0xE4A6 0x7B45
+0xE4A7 0x7B75
+0xE4A8 0x7B65
+0xE4A9 0x7B74
+0xE4AA 0x7B67
+0xE4AB 0x7B70
+0xE4AC 0x7B71
+0xE4AD 0x7B6C
+0xE4AE 0x7B6E
+0xE4AF 0x7B9D
+0xE4B0 0x7B98
+0xE4B1 0x7B9F
+0xE4B2 0x7B8D
+0xE4B3 0x7B9C
+0xE4B4 0x7B9A
+0xE4B5 0x7B8B
+0xE4B6 0x7B92
+0xE4B7 0x7B8F
+0xE4B8 0x7B5D
+0xE4B9 0x7B99
+0xE4BA 0x7BCB
+0xE4BB 0x7BC1
+0xE4BC 0x7BCC
+0xE4BD 0x7BCF
+0xE4BE 0x7BB4
+0xE4BF 0x7BC6
+0xE4C0 0x7BDD
+0xE4C1 0x7BE9
+0xE4C2 0x7C11
+0xE4C3 0x7C14
+0xE4C4 0x7BE6
+0xE4C5 0x7BE5
+0xE4C6 0x7C60
+0xE4C7 0x7C00
+0xE4C8 0x7C07
+0xE4C9 0x7C13
+0xE4CA 0x7BF3
+0xE4CB 0x7BF7
+0xE4CC 0x7C17
+0xE4CD 0x7C0D
+0xE4CE 0x7BF6
+0xE4CF 0x7C23
+0xE4D0 0x7C27
+0xE4D1 0x7C2A
+0xE4D2 0x7C1F
+0xE4D3 0x7C37
+0xE4D4 0x7C2B
+0xE4D5 0x7C3D
+0xE4D6 0x7C4C
+0xE4D7 0x7C43
+0xE4D8 0x7C54
+0xE4D9 0x7C4F
+0xE4DA 0x7C40
+0xE4DB 0x7C50
+0xE4DC 0x7C58
+0xE4DD 0x7C5F
+0xE4DE 0x7C64
+0xE4DF 0x7C56
+0xE4E0 0x7C65
+0xE4E1 0x7C6C
+0xE4E2 0x7C75
+0xE4E3 0x7C83
+0xE4E4 0x7C90
+0xE4E5 0x7CA4
+0xE4E6 0x7CAD
+0xE4E7 0x7CA2
+0xE4E8 0x7CAB
+0xE4E9 0x7CA1
+0xE4EA 0x7CA8
+0xE4EB 0x7CB3
+0xE4EC 0x7CB2
+0xE4ED 0x7CB1
+0xE4EE 0x7CAE
+0xE4EF 0x7CB9
+0xE4F0 0x7CBD
+0xE4F1 0x7CC0
+0xE4F2 0x7CC5
+0xE4F3 0x7CC2
+0xE4F4 0x7CD8
+0xE4F5 0x7CD2
+0xE4F6 0x7CDC
+0xE4F7 0x7CE2
+0xE4F8 0x9B3B
+0xE4F9 0x7CEF
+0xE4FA 0x7CF2
+0xE4FB 0x7CF4
+0xE4FC 0x7CF6
+0xE4FD 0x7CFA
+0xE4FE 0x7D06
+0xE5A1 0x7D02
+0xE5A2 0x7D1C
+0xE5A3 0x7D15
+0xE5A4 0x7D0A
+0xE5A5 0x7D45
+0xE5A6 0x7D4B
+0xE5A7 0x7D2E
+0xE5A8 0x7D32
+0xE5A9 0x7D3F
+0xE5AA 0x7D35
+0xE5AB 0x7D46
+0xE5AC 0x7D73
+0xE5AD 0x7D56
+0xE5AE 0x7D4E
+0xE5AF 0x7D72
+0xE5B0 0x7D68
+0xE5B1 0x7D6E
+0xE5B2 0x7D4F
+0xE5B3 0x7D63
+0xE5B4 0x7D93
+0xE5B5 0x7D89
+0xE5B6 0x7D5B
+0xE5B7 0x7D8F
+0xE5B8 0x7D7D
+0xE5B9 0x7D9B
+0xE5BA 0x7DBA
+0xE5BB 0x7DAE
+0xE5BC 0x7DA3
+0xE5BD 0x7DB5
+0xE5BE 0x7DC7
+0xE5BF 0x7DBD
+0xE5C0 0x7DAB
+0xE5C1 0x7E3D
+0xE5C2 0x7DA2
+0xE5C3 0x7DAF
+0xE5C4 0x7DDC
+0xE5C5 0x7DB8
+0xE5C6 0x7D9F
+0xE5C7 0x7DB0
+0xE5C8 0x7DD8
+0xE5C9 0x7DDD
+0xE5CA 0x7DE4
+0xE5CB 0x7DDE
+0xE5CC 0x7DFB
+0xE5CD 0x7DF2
+0xE5CE 0x7DE1
+0xE5CF 0x7E05
+0xE5D0 0x7E0A
+0xE5D1 0x7E23
+0xE5D2 0x7E21
+0xE5D3 0x7E12
+0xE5D4 0x7E31
+0xE5D5 0x7E1F
+0xE5D6 0x7E09
+0xE5D7 0x7E0B
+0xE5D8 0x7E22
+0xE5D9 0x7E46
+0xE5DA 0x7E66
+0xE5DB 0x7E3B
+0xE5DC 0x7E35
+0xE5DD 0x7E39
+0xE5DE 0x7E43
+0xE5DF 0x7E37
+0xE5E0 0x7E32
+0xE5E1 0x7E3A
+0xE5E2 0x7E67
+0xE5E3 0x7E5D
+0xE5E4 0x7E56
+0xE5E5 0x7E5E
+0xE5E6 0x7E59
+0xE5E7 0x7E5A
+0xE5E8 0x7E79
+0xE5E9 0x7E6A
+0xE5EA 0x7E69
+0xE5EB 0x7E7C
+0xE5EC 0x7E7B
+0xE5ED 0x7E83
+0xE5EE 0x7DD5
+0xE5EF 0x7E7D
+0xE5F0 0x8FAE
+0xE5F1 0x7E7F
+0xE5F2 0x7E88
+0xE5F3 0x7E89
+0xE5F4 0x7E8C
+0xE5F5 0x7E92
+0xE5F6 0x7E90
+0xE5F7 0x7E93
+0xE5F8 0x7E94
+0xE5F9 0x7E96
+0xE5FA 0x7E8E
+0xE5FB 0x7E9B
+0xE5FC 0x7E9C
+0xE5FD 0x7F38
+0xE5FE 0x7F3A
+0xE6A1 0x7F45
+0xE6A2 0x7F4C
+0xE6A3 0x7F4D
+0xE6A4 0x7F4E
+0xE6A5 0x7F50
+0xE6A6 0x7F51
+0xE6A7 0x7F55
+0xE6A8 0x7F54
+0xE6A9 0x7F58
+0xE6AA 0x7F5F
+0xE6AB 0x7F60
+0xE6AC 0x7F68
+0xE6AD 0x7F69
+0xE6AE 0x7F67
+0xE6AF 0x7F78
+0xE6B0 0x7F82
+0xE6B1 0x7F86
+0xE6B2 0x7F83
+0xE6B3 0x7F88
+0xE6B4 0x7F87
+0xE6B5 0x7F8C
+0xE6B6 0x7F94
+0xE6B7 0x7F9E
+0xE6B8 0x7F9D
+0xE6B9 0x7F9A
+0xE6BA 0x7FA3
+0xE6BB 0x7FAF
+0xE6BC 0x7FB2
+0xE6BD 0x7FB9
+0xE6BE 0x7FAE
+0xE6BF 0x7FB6
+0xE6C0 0x7FB8
+0xE6C1 0x8B71
+0xE6C2 0x7FC5
+0xE6C3 0x7FC6
+0xE6C4 0x7FCA
+0xE6C5 0x7FD5
+0xE6C6 0x7FD4
+0xE6C7 0x7FE1
+0xE6C8 0x7FE6
+0xE6C9 0x7FE9
+0xE6CA 0x7FF3
+0xE6CB 0x7FF9
+0xE6CC 0x98DC
+0xE6CD 0x8006
+0xE6CE 0x8004
+0xE6CF 0x800B
+0xE6D0 0x8012
+0xE6D1 0x8018
+0xE6D2 0x8019
+0xE6D3 0x801C
+0xE6D4 0x8021
+0xE6D5 0x8028
+0xE6D6 0x803F
+0xE6D7 0x803B
+0xE6D8 0x804A
+0xE6D9 0x8046
+0xE6DA 0x8052
+0xE6DB 0x8058
+0xE6DC 0x805A
+0xE6DD 0x805F
+0xE6DE 0x8062
+0xE6DF 0x8068
+0xE6E0 0x8073
+0xE6E1 0x8072
+0xE6E2 0x8070
+0xE6E3 0x8076
+0xE6E4 0x8079
+0xE6E5 0x807D
+0xE6E6 0x807F
+0xE6E7 0x8084
+0xE6E8 0x8086
+0xE6E9 0x8085
+0xE6EA 0x809B
+0xE6EB 0x8093
+0xE6EC 0x809A
+0xE6ED 0x80AD
+0xE6EE 0x5190
+0xE6EF 0x80AC
+0xE6F0 0x80DB
+0xE6F1 0x80E5
+0xE6F2 0x80D9
+0xE6F3 0x80DD
+0xE6F4 0x80C4
+0xE6F5 0x80DA
+0xE6F6 0x80D6
+0xE6F7 0x8109
+0xE6F8 0x80EF
+0xE6F9 0x80F1
+0xE6FA 0x811B
+0xE6FB 0x8129
+0xE6FC 0x8123
+0xE6FD 0x812F
+0xE6FE 0x814B
+0xE7A1 0x968B
+0xE7A2 0x8146
+0xE7A3 0x813E
+0xE7A4 0x8153
+0xE7A5 0x8151
+0xE7A6 0x80FC
+0xE7A7 0x8171
+0xE7A8 0x816E
+0xE7A9 0x8165
+0xE7AA 0x8166
+0xE7AB 0x8174
+0xE7AC 0x8183
+0xE7AD 0x8188
+0xE7AE 0x818A
+0xE7AF 0x8180
+0xE7B0 0x8182
+0xE7B1 0x81A0
+0xE7B2 0x8195
+0xE7B3 0x81A4
+0xE7B4 0x81A3
+0xE7B5 0x815F
+0xE7B6 0x8193
+0xE7B7 0x81A9
+0xE7B8 0x81B0
+0xE7B9 0x81B5
+0xE7BA 0x81BE
+0xE7BB 0x81B8
+0xE7BC 0x81BD
+0xE7BD 0x81C0
+0xE7BE 0x81C2
+0xE7BF 0x81BA
+0xE7C0 0x81C9
+0xE7C1 0x81CD
+0xE7C2 0x81D1
+0xE7C3 0x81D9
+0xE7C4 0x81D8
+0xE7C5 0x81C8
+0xE7C6 0x81DA
+0xE7C7 0x81DF
+0xE7C8 0x81E0
+0xE7C9 0x81E7
+0xE7CA 0x81FA
+0xE7CB 0x81FB
+0xE7CC 0x81FE
+0xE7CD 0x8201
+0xE7CE 0x8202
+0xE7CF 0x8205
+0xE7D0 0x8207
+0xE7D1 0x820A
+0xE7D2 0x820D
+0xE7D3 0x8210
+0xE7D4 0x8216
+0xE7D5 0x8229
+0xE7D6 0x822B
+0xE7D7 0x8238
+0xE7D8 0x8233
+0xE7D9 0x8240
+0xE7DA 0x8259
+0xE7DB 0x8258
+0xE7DC 0x825D
+0xE7DD 0x825A
+0xE7DE 0x825F
+0xE7DF 0x8264
+0xE7E0 0x8262
+0xE7E1 0x8268
+0xE7E2 0x826A
+0xE7E3 0x826B
+0xE7E4 0x822E
+0xE7E5 0x8271
+0xE7E6 0x8277
+0xE7E7 0x8278
+0xE7E8 0x827E
+0xE7E9 0x828D
+0xE7EA 0x8292
+0xE7EB 0x82AB
+0xE7EC 0x829F
+0xE7ED 0x82BB
+0xE7EE 0x82AC
+0xE7EF 0x82E1
+0xE7F0 0x82E3
+0xE7F1 0x82DF
+0xE7F2 0x82D2
+0xE7F3 0x82F4
+0xE7F4 0x82F3
+0xE7F5 0x82FA
+0xE7F6 0x8393
+0xE7F7 0x8303
+0xE7F8 0x82FB
+0xE7F9 0x82F9
+0xE7FA 0x82DE
+0xE7FB 0x8306
+0xE7FC 0x82DC
+0xE7FD 0x8309
+0xE7FE 0x82D9
+0xE8A1 0x8335
+0xE8A2 0x8334
+0xE8A3 0x8316
+0xE8A4 0x8332
+0xE8A5 0x8331
+0xE8A6 0x8340
+0xE8A7 0x8339
+0xE8A8 0x8350
+0xE8A9 0x8345
+0xE8AA 0x832F
+0xE8AB 0x832B
+0xE8AC 0x8317
+0xE8AD 0x8318
+0xE8AE 0x8385
+0xE8AF 0x839A
+0xE8B0 0x83AA
+0xE8B1 0x839F
+0xE8B2 0x83A2
+0xE8B3 0x8396
+0xE8B4 0x8323
+0xE8B5 0x838E
+0xE8B6 0x8387
+0xE8B7 0x838A
+0xE8B8 0x837C
+0xE8B9 0x83B5
+0xE8BA 0x8373
+0xE8BB 0x8375
+0xE8BC 0x83A0
+0xE8BD 0x8389
+0xE8BE 0x83A8
+0xE8BF 0x83F4
+0xE8C0 0x8413
+0xE8C1 0x83EB
+0xE8C2 0x83CE
+0xE8C3 0x83FD
+0xE8C4 0x8403
+0xE8C5 0x83D8
+0xE8C6 0x840B
+0xE8C7 0x83C1
+0xE8C8 0x83F7
+0xE8C9 0x8407
+0xE8CA 0x83E0
+0xE8CB 0x83F2
+0xE8CC 0x840D
+0xE8CD 0x8422
+0xE8CE 0x8420
+0xE8CF 0x83BD
+0xE8D0 0x8438
+0xE8D1 0x8506
+0xE8D2 0x83FB
+0xE8D3 0x846D
+0xE8D4 0x842A
+0xE8D5 0x843C
+0xE8D6 0x855A
+0xE8D7 0x8484
+0xE8D8 0x8477
+0xE8D9 0x846B
+0xE8DA 0x84AD
+0xE8DB 0x846E
+0xE8DC 0x8482
+0xE8DD 0x8469
+0xE8DE 0x8446
+0xE8DF 0x842C
+0xE8E0 0x846F
+0xE8E1 0x8479
+0xE8E2 0x8435
+0xE8E3 0x84CA
+0xE8E4 0x8462
+0xE8E5 0x84B9
+0xE8E6 0x84BF
+0xE8E7 0x849F
+0xE8E8 0x84D9
+0xE8E9 0x84CD
+0xE8EA 0x84BB
+0xE8EB 0x84DA
+0xE8EC 0x84D0
+0xE8ED 0x84C1
+0xE8EE 0x84C6
+0xE8EF 0x84D6
+0xE8F0 0x84A1
+0xE8F1 0x8521
+0xE8F2 0x84FF
+0xE8F3 0x84F4
+0xE8F4 0x8517
+0xE8F5 0x8518
+0xE8F6 0x852C
+0xE8F7 0x851F
+0xE8F8 0x8515
+0xE8F9 0x8514
+0xE8FA 0x84FC
+0xE8FB 0x8540
+0xE8FC 0x8563
+0xE8FD 0x8558
+0xE8FE 0x8548
+0xE9A1 0x8541
+0xE9A2 0x8602
+0xE9A3 0x854B
+0xE9A4 0x8555
+0xE9A5 0x8580
+0xE9A6 0x85A4
+0xE9A7 0x8588
+0xE9A8 0x8591
+0xE9A9 0x858A
+0xE9AA 0x85A8
+0xE9AB 0x856D
+0xE9AC 0x8594
+0xE9AD 0x859B
+0xE9AE 0x85EA
+0xE9AF 0x8587
+0xE9B0 0x859C
+0xE9B1 0x8577
+0xE9B2 0x857E
+0xE9B3 0x8590
+0xE9B4 0x85C9
+0xE9B5 0x85BA
+0xE9B6 0x85CF
+0xE9B7 0x85B9
+0xE9B8 0x85D0
+0xE9B9 0x85D5
+0xE9BA 0x85DD
+0xE9BB 0x85E5
+0xE9BC 0x85DC
+0xE9BD 0x85F9
+0xE9BE 0x860A
+0xE9BF 0x8613
+0xE9C0 0x860B
+0xE9C1 0x85FE
+0xE9C2 0x85FA
+0xE9C3 0x8606
+0xE9C4 0x8622
+0xE9C5 0x861A
+0xE9C6 0x8630
+0xE9C7 0x863F
+0xE9C8 0x864D
+0xE9C9 0x4E55
+0xE9CA 0x8654
+0xE9CB 0x865F
+0xE9CC 0x8667
+0xE9CD 0x8671
+0xE9CE 0x8693
+0xE9CF 0x86A3
+0xE9D0 0x86A9
+0xE9D1 0x86AA
+0xE9D2 0x868B
+0xE9D3 0x868C
+0xE9D4 0x86B6
+0xE9D5 0x86AF
+0xE9D6 0x86C4
+0xE9D7 0x86C6
+0xE9D8 0x86B0
+0xE9D9 0x86C9
+0xE9DA 0x8823
+0xE9DB 0x86AB
+0xE9DC 0x86D4
+0xE9DD 0x86DE
+0xE9DE 0x86E9
+0xE9DF 0x86EC
+0xE9E0 0x86DF
+0xE9E1 0x86DB
+0xE9E2 0x86EF
+0xE9E3 0x8712
+0xE9E4 0x8706
+0xE9E5 0x8708
+0xE9E6 0x8700
+0xE9E7 0x8703
+0xE9E8 0x86FB
+0xE9E9 0x8711
+0xE9EA 0x8709
+0xE9EB 0x870D
+0xE9EC 0x86F9
+0xE9ED 0x870A
+0xE9EE 0x8734
+0xE9EF 0x873F
+0xE9F0 0x8737
+0xE9F1 0x873B
+0xE9F2 0x8725
+0xE9F3 0x8729
+0xE9F4 0x871A
+0xE9F5 0x8760
+0xE9F6 0x875F
+0xE9F7 0x8778
+0xE9F8 0x874C
+0xE9F9 0x874E
+0xE9FA 0x8774
+0xE9FB 0x8757
+0xE9FC 0x8768
+0xE9FD 0x876E
+0xE9FE 0x8759
+0xEAA1 0x8753
+0xEAA2 0x8763
+0xEAA3 0x876A
+0xEAA4 0x8805
+0xEAA5 0x87A2
+0xEAA6 0x879F
+0xEAA7 0x8782
+0xEAA8 0x87AF
+0xEAA9 0x87CB
+0xEAAA 0x87BD
+0xEAAB 0x87C0
+0xEAAC 0x87D0
+0xEAAD 0x96D6
+0xEAAE 0x87AB
+0xEAAF 0x87C4
+0xEAB0 0x87B3
+0xEAB1 0x87C7
+0xEAB2 0x87C6
+0xEAB3 0x87BB
+0xEAB4 0x87EF
+0xEAB5 0x87F2
+0xEAB6 0x87E0
+0xEAB7 0x880F
+0xEAB8 0x880D
+0xEAB9 0x87FE
+0xEABA 0x87F6
+0xEABB 0x87F7
+0xEABC 0x880E
+0xEABD 0x87D2
+0xEABE 0x8811
+0xEABF 0x8816
+0xEAC0 0x8815
+0xEAC1 0x8822
+0xEAC2 0x8821
+0xEAC3 0x8831
+0xEAC4 0x8836
+0xEAC5 0x8839
+0xEAC6 0x8827
+0xEAC7 0x883B
+0xEAC8 0x8844
+0xEAC9 0x8842
+0xEACA 0x8852
+0xEACB 0x8859
+0xEACC 0x885E
+0xEACD 0x8862
+0xEACE 0x886B
+0xEACF 0x8881
+0xEAD0 0x887E
+0xEAD1 0x889E
+0xEAD2 0x8875
+0xEAD3 0x887D
+0xEAD4 0x88B5
+0xEAD5 0x8872
+0xEAD6 0x8882
+0xEAD7 0x8897
+0xEAD8 0x8892
+0xEAD9 0x88AE
+0xEADA 0x8899
+0xEADB 0x88A2
+0xEADC 0x888D
+0xEADD 0x88A4
+0xEADE 0x88B0
+0xEADF 0x88BF
+0xEAE0 0x88B1
+0xEAE1 0x88C3
+0xEAE2 0x88C4
+0xEAE3 0x88D4
+0xEAE4 0x88D8
+0xEAE5 0x88D9
+0xEAE6 0x88DD
+0xEAE7 0x88F9
+0xEAE8 0x8902
+0xEAE9 0x88FC
+0xEAEA 0x88F4
+0xEAEB 0x88E8
+0xEAEC 0x88F2
+0xEAED 0x8904
+0xEAEE 0x890C
+0xEAEF 0x890A
+0xEAF0 0x8913
+0xEAF1 0x8943
+0xEAF2 0x891E
+0xEAF3 0x8925
+0xEAF4 0x892A
+0xEAF5 0x892B
+0xEAF6 0x8941
+0xEAF7 0x8944
+0xEAF8 0x893B
+0xEAF9 0x8936
+0xEAFA 0x8938
+0xEAFB 0x894C
+0xEAFC 0x891D
+0xEAFD 0x8960
+0xEAFE 0x895E
+0xEBA1 0x8966
+0xEBA2 0x8964
+0xEBA3 0x896D
+0xEBA4 0x896A
+0xEBA5 0x896F
+0xEBA6 0x8974
+0xEBA7 0x8977
+0xEBA8 0x897E
+0xEBA9 0x8983
+0xEBAA 0x8988
+0xEBAB 0x898A
+0xEBAC 0x8993
+0xEBAD 0x8998
+0xEBAE 0x89A1
+0xEBAF 0x89A9
+0xEBB0 0x89A6
+0xEBB1 0x89AC
+0xEBB2 0x89AF
+0xEBB3 0x89B2
+0xEBB4 0x89BA
+0xEBB5 0x89BD
+0xEBB6 0x89BF
+0xEBB7 0x89C0
+0xEBB8 0x89DA
+0xEBB9 0x89DC
+0xEBBA 0x89DD
+0xEBBB 0x89E7
+0xEBBC 0x89F4
+0xEBBD 0x89F8
+0xEBBE 0x8A03
+0xEBBF 0x8A16
+0xEBC0 0x8A10
+0xEBC1 0x8A0C
+0xEBC2 0x8A1B
+0xEBC3 0x8A1D
+0xEBC4 0x8A25
+0xEBC5 0x8A36
+0xEBC6 0x8A41
+0xEBC7 0x8A5B
+0xEBC8 0x8A52
+0xEBC9 0x8A46
+0xEBCA 0x8A48
+0xEBCB 0x8A7C
+0xEBCC 0x8A6D
+0xEBCD 0x8A6C
+0xEBCE 0x8A62
+0xEBCF 0x8A85
+0xEBD0 0x8A82
+0xEBD1 0x8A84
+0xEBD2 0x8AA8
+0xEBD3 0x8AA1
+0xEBD4 0x8A91
+0xEBD5 0x8AA5
+0xEBD6 0x8AA6
+0xEBD7 0x8A9A
+0xEBD8 0x8AA3
+0xEBD9 0x8AC4
+0xEBDA 0x8ACD
+0xEBDB 0x8AC2
+0xEBDC 0x8ADA
+0xEBDD 0x8AEB
+0xEBDE 0x8AF3
+0xEBDF 0x8AE7
+0xEBE0 0x8AE4
+0xEBE1 0x8AF1
+0xEBE2 0x8B14
+0xEBE3 0x8AE0
+0xEBE4 0x8AE2
+0xEBE5 0x8AF7
+0xEBE6 0x8ADE
+0xEBE7 0x8ADB
+0xEBE8 0x8B0C
+0xEBE9 0x8B07
+0xEBEA 0x8B1A
+0xEBEB 0x8AE1
+0xEBEC 0x8B16
+0xEBED 0x8B10
+0xEBEE 0x8B17
+0xEBEF 0x8B20
+0xEBF0 0x8B33
+0xEBF1 0x97AB
+0xEBF2 0x8B26
+0xEBF3 0x8B2B
+0xEBF4 0x8B3E
+0xEBF5 0x8B28
+0xEBF6 0x8B41
+0xEBF7 0x8B4C
+0xEBF8 0x8B4F
+0xEBF9 0x8B4E
+0xEBFA 0x8B49
+0xEBFB 0x8B56
+0xEBFC 0x8B5B
+0xEBFD 0x8B5A
+0xEBFE 0x8B6B
+0xECA1 0x8B5F
+0xECA2 0x8B6C
+0xECA3 0x8B6F
+0xECA4 0x8B74
+0xECA5 0x8B7D
+0xECA6 0x8B80
+0xECA7 0x8B8C
+0xECA8 0x8B8E
+0xECA9 0x8B92
+0xECAA 0x8B93
+0xECAB 0x8B96
+0xECAC 0x8B99
+0xECAD 0x8B9A
+0xECAE 0x8C3A
+0xECAF 0x8C41
+0xECB0 0x8C3F
+0xECB1 0x8C48
+0xECB2 0x8C4C
+0xECB3 0x8C4E
+0xECB4 0x8C50
+0xECB5 0x8C55
+0xECB6 0x8C62
+0xECB7 0x8C6C
+0xECB8 0x8C78
+0xECB9 0x8C7A
+0xECBA 0x8C82
+0xECBB 0x8C89
+0xECBC 0x8C85
+0xECBD 0x8C8A
+0xECBE 0x8C8D
+0xECBF 0x8C8E
+0xECC0 0x8C94
+0xECC1 0x8C7C
+0xECC2 0x8C98
+0xECC3 0x621D
+0xECC4 0x8CAD
+0xECC5 0x8CAA
+0xECC6 0x8CBD
+0xECC7 0x8CB2
+0xECC8 0x8CB3
+0xECC9 0x8CAE
+0xECCA 0x8CB6
+0xECCB 0x8CC8
+0xECCC 0x8CC1
+0xECCD 0x8CE4
+0xECCE 0x8CE3
+0xECCF 0x8CDA
+0xECD0 0x8CFD
+0xECD1 0x8CFA
+0xECD2 0x8CFB
+0xECD3 0x8D04
+0xECD4 0x8D05
+0xECD5 0x8D0A
+0xECD6 0x8D07
+0xECD7 0x8D0F
+0xECD8 0x8D0D
+0xECD9 0x8D10
+0xECDA 0x9F4E
+0xECDB 0x8D13
+0xECDC 0x8CCD
+0xECDD 0x8D14
+0xECDE 0x8D16
+0xECDF 0x8D67
+0xECE0 0x8D6D
+0xECE1 0x8D71
+0xECE2 0x8D73
+0xECE3 0x8D81
+0xECE4 0x8D99
+0xECE5 0x8DC2
+0xECE6 0x8DBE
+0xECE7 0x8DBA
+0xECE8 0x8DCF
+0xECE9 0x8DDA
+0xECEA 0x8DD6
+0xECEB 0x8DCC
+0xECEC 0x8DDB
+0xECED 0x8DCB
+0xECEE 0x8DEA
+0xECEF 0x8DEB
+0xECF0 0x8DDF
+0xECF1 0x8DE3
+0xECF2 0x8DFC
+0xECF3 0x8E08
+0xECF4 0x8E09
+0xECF5 0x8DFF
+0xECF6 0x8E1D
+0xECF7 0x8E1E
+0xECF8 0x8E10
+0xECF9 0x8E1F
+0xECFA 0x8E42
+0xECFB 0x8E35
+0xECFC 0x8E30
+0xECFD 0x8E34
+0xECFE 0x8E4A
+0xEDA1 0x8E47
+0xEDA2 0x8E49
+0xEDA3 0x8E4C
+0xEDA4 0x8E50
+0xEDA5 0x8E48
+0xEDA6 0x8E59
+0xEDA7 0x8E64
+0xEDA8 0x8E60
+0xEDA9 0x8E2A
+0xEDAA 0x8E63
+0xEDAB 0x8E55
+0xEDAC 0x8E76
+0xEDAD 0x8E72
+0xEDAE 0x8E7C
+0xEDAF 0x8E81
+0xEDB0 0x8E87
+0xEDB1 0x8E85
+0xEDB2 0x8E84
+0xEDB3 0x8E8B
+0xEDB4 0x8E8A
+0xEDB5 0x8E93
+0xEDB6 0x8E91
+0xEDB7 0x8E94
+0xEDB8 0x8E99
+0xEDB9 0x8EAA
+0xEDBA 0x8EA1
+0xEDBB 0x8EAC
+0xEDBC 0x8EB0
+0xEDBD 0x8EC6
+0xEDBE 0x8EB1
+0xEDBF 0x8EBE
+0xEDC0 0x8EC5
+0xEDC1 0x8EC8
+0xEDC2 0x8ECB
+0xEDC3 0x8EDB
+0xEDC4 0x8EE3
+0xEDC5 0x8EFC
+0xEDC6 0x8EFB
+0xEDC7 0x8EEB
+0xEDC8 0x8EFE
+0xEDC9 0x8F0A
+0xEDCA 0x8F05
+0xEDCB 0x8F15
+0xEDCC 0x8F12
+0xEDCD 0x8F19
+0xEDCE 0x8F13
+0xEDCF 0x8F1C
+0xEDD0 0x8F1F
+0xEDD1 0x8F1B
+0xEDD2 0x8F0C
+0xEDD3 0x8F26
+0xEDD4 0x8F33
+0xEDD5 0x8F3B
+0xEDD6 0x8F39
+0xEDD7 0x8F45
+0xEDD8 0x8F42
+0xEDD9 0x8F3E
+0xEDDA 0x8F4C
+0xEDDB 0x8F49
+0xEDDC 0x8F46
+0xEDDD 0x8F4E
+0xEDDE 0x8F57
+0xEDDF 0x8F5C
+0xEDE0 0x8F62
+0xEDE1 0x8F63
+0xEDE2 0x8F64
+0xEDE3 0x8F9C
+0xEDE4 0x8F9F
+0xEDE5 0x8FA3
+0xEDE6 0x8FAD
+0xEDE7 0x8FAF
+0xEDE8 0x8FB7
+0xEDE9 0x8FDA
+0xEDEA 0x8FE5
+0xEDEB 0x8FE2
+0xEDEC 0x8FEA
+0xEDED 0x8FEF
+0xEDEE 0x9087
+0xEDEF 0x8FF4
+0xEDF0 0x9005
+0xEDF1 0x8FF9
+0xEDF2 0x8FFA
+0xEDF3 0x9011
+0xEDF4 0x9015
+0xEDF5 0x9021
+0xEDF6 0x900D
+0xEDF7 0x901E
+0xEDF8 0x9016
+0xEDF9 0x900B
+0xEDFA 0x9027
+0xEDFB 0x9036
+0xEDFC 0x9035
+0xEDFD 0x9039
+0xEDFE 0x8FF8
+0xEEA1 0x904F
+0xEEA2 0x9050
+0xEEA3 0x9051
+0xEEA4 0x9052
+0xEEA5 0x900E
+0xEEA6 0x9049
+0xEEA7 0x903E
+0xEEA8 0x9056
+0xEEA9 0x9058
+0xEEAA 0x905E
+0xEEAB 0x9068
+0xEEAC 0x906F
+0xEEAD 0x9076
+0xEEAE 0x96A8
+0xEEAF 0x9072
+0xEEB0 0x9082
+0xEEB1 0x907D
+0xEEB2 0x9081
+0xEEB3 0x9080
+0xEEB4 0x908A
+0xEEB5 0x9089
+0xEEB6 0x908F
+0xEEB7 0x90A8
+0xEEB8 0x90AF
+0xEEB9 0x90B1
+0xEEBA 0x90B5
+0xEEBB 0x90E2
+0xEEBC 0x90E4
+0xEEBD 0x6248
+0xEEBE 0x90DB
+0xEEBF 0x9102
+0xEEC0 0x9112
+0xEEC1 0x9119
+0xEEC2 0x9132
+0xEEC3 0x9130
+0xEEC4 0x914A
+0xEEC5 0x9156
+0xEEC6 0x9158
+0xEEC7 0x9163
+0xEEC8 0x9165
+0xEEC9 0x9169
+0xEECA 0x9173
+0xEECB 0x9172
+0xEECC 0x918B
+0xEECD 0x9189
+0xEECE 0x9182
+0xEECF 0x91A2
+0xEED0 0x91AB
+0xEED1 0x91AF
+0xEED2 0x91AA
+0xEED3 0x91B5
+0xEED4 0x91B4
+0xEED5 0x91BA
+0xEED6 0x91C0
+0xEED7 0x91C1
+0xEED8 0x91C9
+0xEED9 0x91CB
+0xEEDA 0x91D0
+0xEEDB 0x91D6
+0xEEDC 0x91DF
+0xEEDD 0x91E1
+0xEEDE 0x91DB
+0xEEDF 0x91FC
+0xEEE0 0x91F5
+0xEEE1 0x91F6
+0xEEE2 0x921E
+0xEEE3 0x91FF
+0xEEE4 0x9214
+0xEEE5 0x922C
+0xEEE6 0x9215
+0xEEE7 0x9211
+0xEEE8 0x925E
+0xEEE9 0x9257
+0xEEEA 0x9245
+0xEEEB 0x9249
+0xEEEC 0x9264
+0xEEED 0x9248
+0xEEEE 0x9295
+0xEEEF 0x923F
+0xEEF0 0x924B
+0xEEF1 0x9250
+0xEEF2 0x929C
+0xEEF3 0x9296
+0xEEF4 0x9293
+0xEEF5 0x929B
+0xEEF6 0x925A
+0xEEF7 0x92CF
+0xEEF8 0x92B9
+0xEEF9 0x92B7
+0xEEFA 0x92E9
+0xEEFB 0x930F
+0xEEFC 0x92FA
+0xEEFD 0x9344
+0xEEFE 0x932E
+0xEFA1 0x9319
+0xEFA2 0x9322
+0xEFA3 0x931A
+0xEFA4 0x9323
+0xEFA5 0x933A
+0xEFA6 0x9335
+0xEFA7 0x933B
+0xEFA8 0x935C
+0xEFA9 0x9360
+0xEFAA 0x937C
+0xEFAB 0x936E
+0xEFAC 0x9356
+0xEFAD 0x93B0
+0xEFAE 0x93AC
+0xEFAF 0x93AD
+0xEFB0 0x9394
+0xEFB1 0x93B9
+0xEFB2 0x93D6
+0xEFB3 0x93D7
+0xEFB4 0x93E8
+0xEFB5 0x93E5
+0xEFB6 0x93D8
+0xEFB7 0x93C3
+0xEFB8 0x93DD
+0xEFB9 0x93D0
+0xEFBA 0x93C8
+0xEFBB 0x93E4
+0xEFBC 0x941A
+0xEFBD 0x9414
+0xEFBE 0x9413
+0xEFBF 0x9403
+0xEFC0 0x9407
+0xEFC1 0x9410
+0xEFC2 0x9436
+0xEFC3 0x942B
+0xEFC4 0x9435
+0xEFC5 0x9421
+0xEFC6 0x943A
+0xEFC7 0x9441
+0xEFC8 0x9452
+0xEFC9 0x9444
+0xEFCA 0x945B
+0xEFCB 0x9460
+0xEFCC 0x9462
+0xEFCD 0x945E
+0xEFCE 0x946A
+0xEFCF 0x9229
+0xEFD0 0x9470
+0xEFD1 0x9475
+0xEFD2 0x9477
+0xEFD3 0x947D
+0xEFD4 0x945A
+0xEFD5 0x947C
+0xEFD6 0x947E
+0xEFD7 0x9481
+0xEFD8 0x947F
+0xEFD9 0x9582
+0xEFDA 0x9587
+0xEFDB 0x958A
+0xEFDC 0x9594
+0xEFDD 0x9596
+0xEFDE 0x9598
+0xEFDF 0x9599
+0xEFE0 0x95A0
+0xEFE1 0x95A8
+0xEFE2 0x95A7
+0xEFE3 0x95AD
+0xEFE4 0x95BC
+0xEFE5 0x95BB
+0xEFE6 0x95B9
+0xEFE7 0x95BE
+0xEFE8 0x95CA
+0xEFE9 0x6FF6
+0xEFEA 0x95C3
+0xEFEB 0x95CD
+0xEFEC 0x95CC
+0xEFED 0x95D5
+0xEFEE 0x95D4
+0xEFEF 0x95D6
+0xEFF0 0x95DC
+0xEFF1 0x95E1
+0xEFF2 0x95E5
+0xEFF3 0x95E2
+0xEFF4 0x9621
+0xEFF5 0x9628
+0xEFF6 0x962E
+0xEFF7 0x962F
+0xEFF8 0x9642
+0xEFF9 0x964C
+0xEFFA 0x964F
+0xEFFB 0x964B
+0xEFFC 0x9677
+0xEFFD 0x965C
+0xEFFE 0x965E
+0xF0A1 0x965D
+0xF0A2 0x965F
+0xF0A3 0x9666
+0xF0A4 0x9672
+0xF0A5 0x966C
+0xF0A6 0x968D
+0xF0A7 0x9698
+0xF0A8 0x9695
+0xF0A9 0x9697
+0xF0AA 0x96AA
+0xF0AB 0x96A7
+0xF0AC 0x96B1
+0xF0AD 0x96B2
+0xF0AE 0x96B0
+0xF0AF 0x96B4
+0xF0B0 0x96B6
+0xF0B1 0x96B8
+0xF0B2 0x96B9
+0xF0B3 0x96CE
+0xF0B4 0x96CB
+0xF0B5 0x96C9
+0xF0B6 0x96CD
+0xF0B7 0x894D
+0xF0B8 0x96DC
+0xF0B9 0x970D
+0xF0BA 0x96D5
+0xF0BB 0x96F9
+0xF0BC 0x9704
+0xF0BD 0x9706
+0xF0BE 0x9708
+0xF0BF 0x9713
+0xF0C0 0x970E
+0xF0C1 0x9711
+0xF0C2 0x970F
+0xF0C3 0x9716
+0xF0C4 0x9719
+0xF0C5 0x9724
+0xF0C6 0x972A
+0xF0C7 0x9730
+0xF0C8 0x9739
+0xF0C9 0x973D
+0xF0CA 0x973E
+0xF0CB 0x9744
+0xF0CC 0x9746
+0xF0CD 0x9748
+0xF0CE 0x9742
+0xF0CF 0x9749
+0xF0D0 0x975C
+0xF0D1 0x9760
+0xF0D2 0x9764
+0xF0D3 0x9766
+0xF0D4 0x9768
+0xF0D5 0x52D2
+0xF0D6 0x976B
+0xF0D7 0x9771
+0xF0D8 0x9779
+0xF0D9 0x9785
+0xF0DA 0x977C
+0xF0DB 0x9781
+0xF0DC 0x977A
+0xF0DD 0x9786
+0xF0DE 0x978B
+0xF0DF 0x978F
+0xF0E0 0x9790
+0xF0E1 0x979C
+0xF0E2 0x97A8
+0xF0E3 0x97A6
+0xF0E4 0x97A3
+0xF0E5 0x97B3
+0xF0E6 0x97B4
+0xF0E7 0x97C3
+0xF0E8 0x97C6
+0xF0E9 0x97C8
+0xF0EA 0x97CB
+0xF0EB 0x97DC
+0xF0EC 0x97ED
+0xF0ED 0x9F4F
+0xF0EE 0x97F2
+0xF0EF 0x7ADF
+0xF0F0 0x97F6
+0xF0F1 0x97F5
+0xF0F2 0x980F
+0xF0F3 0x980C
+0xF0F4 0x9838
+0xF0F5 0x9824
+0xF0F6 0x9821
+0xF0F7 0x9837
+0xF0F8 0x983D
+0xF0F9 0x9846
+0xF0FA 0x984F
+0xF0FB 0x984B
+0xF0FC 0x986B
+0xF0FD 0x986F
+0xF0FE 0x9870
+0xF1A1 0x9871
+0xF1A2 0x9874
+0xF1A3 0x9873
+0xF1A4 0x98AA
+0xF1A5 0x98AF
+0xF1A6 0x98B1
+0xF1A7 0x98B6
+0xF1A8 0x98C4
+0xF1A9 0x98C3
+0xF1AA 0x98C6
+0xF1AB 0x98E9
+0xF1AC 0x98EB
+0xF1AD 0x9903
+0xF1AE 0x9909
+0xF1AF 0x9912
+0xF1B0 0x9914
+0xF1B1 0x9918
+0xF1B2 0x9921
+0xF1B3 0x991D
+0xF1B4 0x991E
+0xF1B5 0x9924
+0xF1B6 0x9920
+0xF1B7 0x992C
+0xF1B8 0x992E
+0xF1B9 0x993D
+0xF1BA 0x993E
+0xF1BB 0x9942
+0xF1BC 0x9949
+0xF1BD 0x9945
+0xF1BE 0x9950
+0xF1BF 0x994B
+0xF1C0 0x9951
+0xF1C1 0x9952
+0xF1C2 0x994C
+0xF1C3 0x9955
+0xF1C4 0x9997
+0xF1C5 0x9998
+0xF1C6 0x99A5
+0xF1C7 0x99AD
+0xF1C8 0x99AE
+0xF1C9 0x99BC
+0xF1CA 0x99DF
+0xF1CB 0x99DB
+0xF1CC 0x99DD
+0xF1CD 0x99D8
+0xF1CE 0x99D1
+0xF1CF 0x99ED
+0xF1D0 0x99EE
+0xF1D1 0x99F1
+0xF1D2 0x99F2
+0xF1D3 0x99FB
+0xF1D4 0x99F8
+0xF1D5 0x9A01
+0xF1D6 0x9A0F
+0xF1D7 0x9A05
+0xF1D8 0x99E2
+0xF1D9 0x9A19
+0xF1DA 0x9A2B
+0xF1DB 0x9A37
+0xF1DC 0x9A45
+0xF1DD 0x9A42
+0xF1DE 0x9A40
+0xF1DF 0x9A43
+0xF1E0 0x9A3E
+0xF1E1 0x9A55
+0xF1E2 0x9A4D
+0xF1E3 0x9A5B
+0xF1E4 0x9A57
+0xF1E5 0x9A5F
+0xF1E6 0x9A62
+0xF1E7 0x9A65
+0xF1E8 0x9A64
+0xF1E9 0x9A69
+0xF1EA 0x9A6B
+0xF1EB 0x9A6A
+0xF1EC 0x9AAD
+0xF1ED 0x9AB0
+0xF1EE 0x9ABC
+0xF1EF 0x9AC0
+0xF1F0 0x9ACF
+0xF1F1 0x9AD1
+0xF1F2 0x9AD3
+0xF1F3 0x9AD4
+0xF1F4 0x9ADE
+0xF1F5 0x9ADF
+0xF1F6 0x9AE2
+0xF1F7 0x9AE3
+0xF1F8 0x9AE6
+0xF1F9 0x9AEF
+0xF1FA 0x9AEB
+0xF1FB 0x9AEE
+0xF1FC 0x9AF4
+0xF1FD 0x9AF1
+0xF1FE 0x9AF7
+0xF2A1 0x9AFB
+0xF2A2 0x9B06
+0xF2A3 0x9B18
+0xF2A4 0x9B1A
+0xF2A5 0x9B1F
+0xF2A6 0x9B22
+0xF2A7 0x9B23
+0xF2A8 0x9B25
+0xF2A9 0x9B27
+0xF2AA 0x9B28
+0xF2AB 0x9B29
+0xF2AC 0x9B2A
+0xF2AD 0x9B2E
+0xF2AE 0x9B2F
+0xF2AF 0x9B32
+0xF2B0 0x9B44
+0xF2B1 0x9B43
+0xF2B2 0x9B4F
+0xF2B3 0x9B4D
+0xF2B4 0x9B4E
+0xF2B5 0x9B51
+0xF2B6 0x9B58
+0xF2B7 0x9B74
+0xF2B8 0x9B93
+0xF2B9 0x9B83
+0xF2BA 0x9B91
+0xF2BB 0x9B96
+0xF2BC 0x9B97
+0xF2BD 0x9B9F
+0xF2BE 0x9BA0
+0xF2BF 0x9BA8
+0xF2C0 0x9BB4
+0xF2C1 0x9BC0
+0xF2C2 0x9BCA
+0xF2C3 0x9BB9
+0xF2C4 0x9BC6
+0xF2C5 0x9BCF
+0xF2C6 0x9BD1
+0xF2C7 0x9BD2
+0xF2C8 0x9BE3
+0xF2C9 0x9BE2
+0xF2CA 0x9BE4
+0xF2CB 0x9BD4
+0xF2CC 0x9BE1
+0xF2CD 0x9C3A
+0xF2CE 0x9BF2
+0xF2CF 0x9BF1
+0xF2D0 0x9BF0
+0xF2D1 0x9C15
+0xF2D2 0x9C14
+0xF2D3 0x9C09
+0xF2D4 0x9C13
+0xF2D5 0x9C0C
+0xF2D6 0x9C06
+0xF2D7 0x9C08
+0xF2D8 0x9C12
+0xF2D9 0x9C0A
+0xF2DA 0x9C04
+0xF2DB 0x9C2E
+0xF2DC 0x9C1B
+0xF2DD 0x9C25
+0xF2DE 0x9C24
+0xF2DF 0x9C21
+0xF2E0 0x9C30
+0xF2E1 0x9C47
+0xF2E2 0x9C32
+0xF2E3 0x9C46
+0xF2E4 0x9C3E
+0xF2E5 0x9C5A
+0xF2E6 0x9C60
+0xF2E7 0x9C67
+0xF2E8 0x9C76
+0xF2E9 0x9C78
+0xF2EA 0x9CE7
+0xF2EB 0x9CEC
+0xF2EC 0x9CF0
+0xF2ED 0x9D09
+0xF2EE 0x9D08
+0xF2EF 0x9CEB
+0xF2F0 0x9D03
+0xF2F1 0x9D06
+0xF2F2 0x9D2A
+0xF2F3 0x9D26
+0xF2F4 0x9DAF
+0xF2F5 0x9D23
+0xF2F6 0x9D1F
+0xF2F7 0x9D44
+0xF2F8 0x9D15
+0xF2F9 0x9D12
+0xF2FA 0x9D41
+0xF2FB 0x9D3F
+0xF2FC 0x9D3E
+0xF2FD 0x9D46
+0xF2FE 0x9D48
+0xF3A1 0x9D5D
+0xF3A2 0x9D5E
+0xF3A3 0x9D64
+0xF3A4 0x9D51
+0xF3A5 0x9D50
+0xF3A6 0x9D59
+0xF3A7 0x9D72
+0xF3A8 0x9D89
+0xF3A9 0x9D87
+0xF3AA 0x9DAB
+0xF3AB 0x9D6F
+0xF3AC 0x9D7A
+0xF3AD 0x9D9A
+0xF3AE 0x9DA4
+0xF3AF 0x9DA9
+0xF3B0 0x9DB2
+0xF3B1 0x9DC4
+0xF3B2 0x9DC1
+0xF3B3 0x9DBB
+0xF3B4 0x9DB8
+0xF3B5 0x9DBA
+0xF3B6 0x9DC6
+0xF3B7 0x9DCF
+0xF3B8 0x9DC2
+0xF3B9 0x9DD9
+0xF3BA 0x9DD3
+0xF3BB 0x9DF8
+0xF3BC 0x9DE6
+0xF3BD 0x9DED
+0xF3BE 0x9DEF
+0xF3BF 0x9DFD
+0xF3C0 0x9E1A
+0xF3C1 0x9E1B
+0xF3C2 0x9E1E
+0xF3C3 0x9E75
+0xF3C4 0x9E79
+0xF3C5 0x9E7D
+0xF3C6 0x9E81
+0xF3C7 0x9E88
+0xF3C8 0x9E8B
+0xF3C9 0x9E8C
+0xF3CA 0x9E92
+0xF3CB 0x9E95
+0xF3CC 0x9E91
+0xF3CD 0x9E9D
+0xF3CE 0x9EA5
+0xF3CF 0x9EA9
+0xF3D0 0x9EB8
+0xF3D1 0x9EAA
+0xF3D2 0x9EAD
+0xF3D3 0x9761
+0xF3D4 0x9ECC
+0xF3D5 0x9ECE
+0xF3D6 0x9ECF
+0xF3D7 0x9ED0
+0xF3D8 0x9ED4
+0xF3D9 0x9EDC
+0xF3DA 0x9EDE
+0xF3DB 0x9EDD
+0xF3DC 0x9EE0
+0xF3DD 0x9EE5
+0xF3DE 0x9EE8
+0xF3DF 0x9EEF
+0xF3E0 0x9EF4
+0xF3E1 0x9EF6
+0xF3E2 0x9EF7
+0xF3E3 0x9EF9
+0xF3E4 0x9EFB
+0xF3E5 0x9EFC
+0xF3E6 0x9EFD
+0xF3E7 0x9F07
+0xF3E8 0x9F08
+0xF3E9 0x76B7
+0xF3EA 0x9F15
+0xF3EB 0x9F21
+0xF3EC 0x9F2C
+0xF3ED 0x9F3E
+0xF3EE 0x9F4A
+0xF3EF 0x9F52
+0xF3F0 0x9F54
+0xF3F1 0x9F63
+0xF3F2 0x9F5F
+0xF3F3 0x9F60
+0xF3F4 0x9F61
+0xF3F5 0x9F66
+0xF3F6 0x9F67
+0xF3F7 0x9F6C
+0xF3F8 0x9F6A
+0xF3F9 0x9F77
+0xF3FA 0x9F72
+0xF3FB 0x9F76
+0xF3FC 0x9F95
+0xF3FD 0x9F9C
+0xF3FE 0x9FA0
+0xF4A1 0x582F
+0xF4A2 0x69C7
+0xF4A3 0x9059
+0xF4A4 0x7464
+0xF4A5 0x51DC
+0xF4A6 0x7199
diff --git a/ext/mbstring/tests/data/KOI8-R.txt b/ext/mbstring/tests/data/KOI8-R.txt
new file mode 100644
index 0000000000..2a1afb70d9
--- /dev/null
+++ b/ext/mbstring/tests/data/KOI8-R.txt
@@ -0,0 +1,294 @@
+# KOI8-R.TXT
+# Date: 2016-01-04 23:05:00 GMT [KW]
+# © 2016 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: KOI8-R (RFC1489) to Unicode
+# Unicode version: 3.0
+# Table version: 2.0
+# Table format: Format A
+# Date: 18 August 1999 (header updated: 2016-January-04)
+# Authors: Helmut Richter <richter@lrz.de>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# KOI8-R characters map into Unicode. The underlying document is the
+# mapping described in RFC 1489. No statements are made as to whether
+# this mapping is the same as the mapping defined as "Code Page 878"
+# with some vendors.
+#
+# Format: Three tab-separated columns
+# Column #1 is the KOI8-R code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in KOI8-R order.
+#
+# Version history
+# 1.0 version: created.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# http://www.unicode.org/Public/MAPPINGS/
+#
+# Any comments or problems, contact us at:
+# http://www.unicode.org/reporting.html
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x81 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x82 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x83 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x85 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x86 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x87 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x88 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x89 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x8A 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x8B 0x2580 # UPPER HALF BLOCK
+0x8C 0x2584 # LOWER HALF BLOCK
+0x8D 0x2588 # FULL BLOCK
+0x8E 0x258C # LEFT HALF BLOCK
+0x8F 0x2590 # RIGHT HALF BLOCK
+0x90 0x2591 # LIGHT SHADE
+0x91 0x2592 # MEDIUM SHADE
+0x92 0x2593 # DARK SHADE
+0x93 0x2320 # TOP HALF INTEGRAL
+0x94 0x25A0 # BLACK SQUARE
+0x95 0x2219 # BULLET OPERATOR
+0x96 0x221A # SQUARE ROOT
+0x97 0x2248 # ALMOST EQUAL TO
+0x98 0x2264 # LESS-THAN OR EQUAL TO
+0x99 0x2265 # GREATER-THAN OR EQUAL TO
+0x9A 0x00A0 # NO-BREAK SPACE
+0x9B 0x2321 # BOTTOM HALF INTEGRAL
+0x9C 0x00B0 # DEGREE SIGN
+0x9D 0x00B2 # SUPERSCRIPT TWO
+0x9E 0x00B7 # MIDDLE DOT
+0x9F 0x00F7 # DIVISION SIGN
+0xA0 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL
+0xA1 0x2551 # BOX DRAWINGS DOUBLE VERTICAL
+0xA2 0x2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xA3 0x0451 # CYRILLIC SMALL LETTER IO
+0xA4 0x2553 # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+0xA5 0x2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xA6 0x2555 # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+0xA7 0x2556 # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+0xA8 0x2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xA9 0x2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xAA 0x2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xAB 0x255A # BOX DRAWINGS DOUBLE UP AND RIGHT
+0xAC 0x255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xAD 0x255C # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+0xAE 0x255D # BOX DRAWINGS DOUBLE UP AND LEFT
+0xAF 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xB0 0x255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xB1 0x2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xB2 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xB3 0x0401 # CYRILLIC CAPITAL LETTER IO
+0xB4 0x2562 # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+0xB5 0x2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xB6 0x2564 # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+0xB7 0x2565 # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+0xB8 0x2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xB9 0x2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xBA 0x2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xBB 0x2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xBC 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xBD 0x256B # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+0xBE 0x256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xBF 0x00A9 # COPYRIGHT SIGN
+0xC0 0x044E # CYRILLIC SMALL LETTER YU
+0xC1 0x0430 # CYRILLIC SMALL LETTER A
+0xC2 0x0431 # CYRILLIC SMALL LETTER BE
+0xC3 0x0446 # CYRILLIC SMALL LETTER TSE
+0xC4 0x0434 # CYRILLIC SMALL LETTER DE
+0xC5 0x0435 # CYRILLIC SMALL LETTER IE
+0xC6 0x0444 # CYRILLIC SMALL LETTER EF
+0xC7 0x0433 # CYRILLIC SMALL LETTER GHE
+0xC8 0x0445 # CYRILLIC SMALL LETTER HA
+0xC9 0x0438 # CYRILLIC SMALL LETTER I
+0xCA 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0xCB 0x043A # CYRILLIC SMALL LETTER KA
+0xCC 0x043B # CYRILLIC SMALL LETTER EL
+0xCD 0x043C # CYRILLIC SMALL LETTER EM
+0xCE 0x043D # CYRILLIC SMALL LETTER EN
+0xCF 0x043E # CYRILLIC SMALL LETTER O
+0xD0 0x043F # CYRILLIC SMALL LETTER PE
+0xD1 0x044F # CYRILLIC SMALL LETTER YA
+0xD2 0x0440 # CYRILLIC SMALL LETTER ER
+0xD3 0x0441 # CYRILLIC SMALL LETTER ES
+0xD4 0x0442 # CYRILLIC SMALL LETTER TE
+0xD5 0x0443 # CYRILLIC SMALL LETTER U
+0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE
+0xD7 0x0432 # CYRILLIC SMALL LETTER VE
+0xD8 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xD9 0x044B # CYRILLIC SMALL LETTER YERU
+0xDA 0x0437 # CYRILLIC SMALL LETTER ZE
+0xDB 0x0448 # CYRILLIC SMALL LETTER SHA
+0xDC 0x044D # CYRILLIC SMALL LETTER E
+0xDD 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0xDE 0x0447 # CYRILLIC SMALL LETTER CHE
+0xDF 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0xE0 0x042E # CYRILLIC CAPITAL LETTER YU
+0xE1 0x0410 # CYRILLIC CAPITAL LETTER A
+0xE2 0x0411 # CYRILLIC CAPITAL LETTER BE
+0xE3 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0xE4 0x0414 # CYRILLIC CAPITAL LETTER DE
+0xE5 0x0415 # CYRILLIC CAPITAL LETTER IE
+0xE6 0x0424 # CYRILLIC CAPITAL LETTER EF
+0xE7 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0xE8 0x0425 # CYRILLIC CAPITAL LETTER HA
+0xE9 0x0418 # CYRILLIC CAPITAL LETTER I
+0xEA 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xEB 0x041A # CYRILLIC CAPITAL LETTER KA
+0xEC 0x041B # CYRILLIC CAPITAL LETTER EL
+0xED 0x041C # CYRILLIC CAPITAL LETTER EM
+0xEE 0x041D # CYRILLIC CAPITAL LETTER EN
+0xEF 0x041E # CYRILLIC CAPITAL LETTER O
+0xF0 0x041F # CYRILLIC CAPITAL LETTER PE
+0xF1 0x042F # CYRILLIC CAPITAL LETTER YA
+0xF2 0x0420 # CYRILLIC CAPITAL LETTER ER
+0xF3 0x0421 # CYRILLIC CAPITAL LETTER ES
+0xF4 0x0422 # CYRILLIC CAPITAL LETTER TE
+0xF5 0x0423 # CYRILLIC CAPITAL LETTER U
+0xF6 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0xF7 0x0412 # CYRILLIC CAPITAL LETTER VE
+0xF8 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xF9 0x042B # CYRILLIC CAPITAL LETTER YERU
+0xFA 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0xFB 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0xFC 0x042D # CYRILLIC CAPITAL LETTER E
+0xFD 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xFE 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0xFF 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
diff --git a/ext/mbstring/tests/data/KOI8-U.txt b/ext/mbstring/tests/data/KOI8-U.txt
new file mode 100644
index 0000000000..c533b39409
--- /dev/null
+++ b/ext/mbstring/tests/data/KOI8-U.txt
@@ -0,0 +1,301 @@
+# KOI8-U.TXT
+# Date: 2016-01-04 23:09:00 GMT [KW]
+# © 2016 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+#
+# Name: KOI8-U (RFC2319) to Unicode
+# Unicode version: 5.1
+# Table version: 2.0
+# Table format: Format A
+# Date: 13 October 2008 (header updated: 2016-January-04)
+# Authors: Philippe Verdy <verdy_p AT wanadoo.fr>,
+# Helmut Richter <richter@lrz.de>
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# KOI8-U characters map into Unicode. The underlying document is the
+# mapping described in RFC 2319. No statements are made as to whether
+# this mapping is the same as the mapping defined as "Code Page 878"
+# with some vendors.
+#
+# The KOI8-U (RFC2319) encoding is a variant based on KOI8-R (RFC1489),
+# where the support for four additional Cyrillic letters was added (both small
+# and capital letters), replacing 8 box-drawing characters. It is still widely
+# used to encode texts in Ukrainian, Byelorussian and Bulgarian.
+#
+# Format: Three tab-separated columns
+# Column #1 is the KOI8-U code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in KOI8-U order.
+#
+# Version history
+# 1.0 version: created.
+# 2.0 version: updates to copyright notice and terms of use; no
+# changes to character mappings
+#
+# Updated versions of this file may be found in:
+# <http://www.unicode.org/Public/MAPPINGS/>
+#
+# Any comments or problems, contact the Unicode Consortium at:
+# <http://www.unicode.org/reporting.html>
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x81 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x82 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x83 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x85 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x86 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x87 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x88 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x89 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x8A 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x8B 0x2580 # UPPER HALF BLOCK
+0x8C 0x2584 # LOWER HALF BLOCK
+0x8D 0x2588 # FULL BLOCK
+0x8E 0x258C # LEFT HALF BLOCK
+0x8F 0x2590 # RIGHT HALF BLOCK
+0x90 0x2591 # LIGHT SHADE
+0x91 0x2592 # MEDIUM SHADE
+0x92 0x2593 # DARK SHADE
+0x93 0x2320 # TOP HALF INTEGRAL
+0x94 0x25A0 # BLACK SQUARE
+0x95 0x2219 # BULLET OPERATOR
+0x96 0x221A # SQUARE ROOT
+0x97 0x2248 # ALMOST EQUAL TO
+0x98 0x2264 # LESS-THAN OR EQUAL TO
+0x99 0x2265 # GREATER-THAN OR EQUAL TO
+0x9A 0x00A0 # NO-BREAK SPACE
+0x9B 0x2321 # BOTTOM HALF INTEGRAL
+0x9C 0x00B0 # DEGREE SIGN
+0x9D 0x00B2 # SUPERSCRIPT TWO
+0x9E 0x00B7 # MIDDLE DOT
+0x9F 0x00F7 # DIVISION SIGN
+0xA0 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL
+0xA1 0x2551 # BOX DRAWINGS DOUBLE VERTICAL
+0xA2 0x2552 # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+0xA3 0x0451 # CYRILLIC SMALL LETTER IO
+0xA4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE
+0xA5 0x2554 # BOX DRAWINGS DOUBLE DOWN AND RIGHT
+0xA6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+0xA7 0x0457 # CYRILLIC SMALL LETTER YI (UKRAINIAN)
+0xA8 0x2557 # BOX DRAWINGS DOUBLE DOWN AND LEFT
+0xA9 0x2558 # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+0xAA 0x2559 # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+0xAB 0x255A # BOX DRAWINGS DOUBLE UP AND RIGHT
+0xAC 0x255B # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+0xAD 0x0491 # CYRILLIC SMALL LETTER GHE WITH UPTURN
+0xAE 0x255D # BOX DRAWINGS DOUBLE UP AND LEFT
+0xAF 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+0xB0 0x255F # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+0xB1 0x2560 # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+0xB2 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+0xB3 0x0401 # CYRILLIC CAPITAL LETTER IO
+0xB4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0xB5 0x2563 # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+0xB6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0xB7 0x0407 # CYRILLIC CAPITAL LETTER YI (UKRAINIAN)
+0xB8 0x2566 # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+0xB9 0x2567 # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+0xBA 0x2568 # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+0xBB 0x2569 # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+0xBC 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+0xBD 0x0490 # CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0xBE 0x256C # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+0xBF 0x00A9 # COPYRIGHT SIGN
+0xC0 0x044E # CYRILLIC SMALL LETTER YU
+0xC1 0x0430 # CYRILLIC SMALL LETTER A
+0xC2 0x0431 # CYRILLIC SMALL LETTER BE
+0xC3 0x0446 # CYRILLIC SMALL LETTER TSE
+0xC4 0x0434 # CYRILLIC SMALL LETTER DE
+0xC5 0x0435 # CYRILLIC SMALL LETTER IE
+0xC6 0x0444 # CYRILLIC SMALL LETTER EF
+0xC7 0x0433 # CYRILLIC SMALL LETTER GHE
+0xC8 0x0445 # CYRILLIC SMALL LETTER HA
+0xC9 0x0438 # CYRILLIC SMALL LETTER I
+0xCA 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0xCB 0x043A # CYRILLIC SMALL LETTER KA
+0xCC 0x043B # CYRILLIC SMALL LETTER EL
+0xCD 0x043C # CYRILLIC SMALL LETTER EM
+0xCE 0x043D # CYRILLIC SMALL LETTER EN
+0xCF 0x043E # CYRILLIC SMALL LETTER O
+0xD0 0x043F # CYRILLIC SMALL LETTER PE
+0xD1 0x044F # CYRILLIC SMALL LETTER YA
+0xD2 0x0440 # CYRILLIC SMALL LETTER ER
+0xD3 0x0441 # CYRILLIC SMALL LETTER ES
+0xD4 0x0442 # CYRILLIC SMALL LETTER TE
+0xD5 0x0443 # CYRILLIC SMALL LETTER U
+0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE
+0xD7 0x0432 # CYRILLIC SMALL LETTER VE
+0xD8 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0xD9 0x044B # CYRILLIC SMALL LETTER YERU
+0xDA 0x0437 # CYRILLIC SMALL LETTER ZE
+0xDB 0x0448 # CYRILLIC SMALL LETTER SHA
+0xDC 0x044D # CYRILLIC SMALL LETTER E
+0xDD 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0xDE 0x0447 # CYRILLIC SMALL LETTER CHE
+0xDF 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0xE0 0x042E # CYRILLIC CAPITAL LETTER YU
+0xE1 0x0410 # CYRILLIC CAPITAL LETTER A
+0xE2 0x0411 # CYRILLIC CAPITAL LETTER BE
+0xE3 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0xE4 0x0414 # CYRILLIC CAPITAL LETTER DE
+0xE5 0x0415 # CYRILLIC CAPITAL LETTER IE
+0xE6 0x0424 # CYRILLIC CAPITAL LETTER EF
+0xE7 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0xE8 0x0425 # CYRILLIC CAPITAL LETTER HA
+0xE9 0x0418 # CYRILLIC CAPITAL LETTER I
+0xEA 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0xEB 0x041A # CYRILLIC CAPITAL LETTER KA
+0xEC 0x041B # CYRILLIC CAPITAL LETTER EL
+0xED 0x041C # CYRILLIC CAPITAL LETTER EM
+0xEE 0x041D # CYRILLIC CAPITAL LETTER EN
+0xEF 0x041E # CYRILLIC CAPITAL LETTER O
+0xF0 0x041F # CYRILLIC CAPITAL LETTER PE
+0xF1 0x042F # CYRILLIC CAPITAL LETTER YA
+0xF2 0x0420 # CYRILLIC CAPITAL LETTER ER
+0xF3 0x0421 # CYRILLIC CAPITAL LETTER ES
+0xF4 0x0422 # CYRILLIC CAPITAL LETTER TE
+0xF5 0x0423 # CYRILLIC CAPITAL LETTER U
+0xF6 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0xF7 0x0412 # CYRILLIC CAPITAL LETTER VE
+0xF8 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0xF9 0x042B # CYRILLIC CAPITAL LETTER YERU
+0xFA 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0xFB 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0xFC 0x042D # CYRILLIC CAPITAL LETTER E
+0xFD 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0xFE 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0xFF 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
diff --git a/ext/mbstring/tests/data/MacJapanese-SJIS.txt b/ext/mbstring/tests/data/MacJapanese-SJIS.txt
new file mode 100644
index 0000000000..a604c019aa
--- /dev/null
+++ b/ext/mbstring/tests/data/MacJapanese-SJIS.txt
@@ -0,0 +1,7728 @@
+#=======================================================================
+# File name: JAPANESE.TXT
+#
+# Contents: Map (external version) from Mac OS Japanese
+# encoding to Unicode 2.1 and later.
+#
+# Copyright: (c) 1994-2002, 2005 by Apple Computer, Inc., all rights
+# reserved.
+#
+# Contact: charsets@apple.com
+#
+# Changes:
+#
+# c02 2005-Apr-05 Update header comments. Matches internal xml
+# <c1.4+1.5> and Text Encoding Converter 2.0.
+# b4,c1 2002-Dec-19 Update URLs. Matches internal utom<b18>.
+# b03 1999-Sep-22 Change mappings for 0xFF, 0x8150, 0x8163,
+# 0xEB50, and 0xEB63 to reduce problems in
+# interconversion with CP 932. Update contact
+# e-mail address. Matches internal utom<b9>,
+# ufrm<b10>, and Text Encoding Converter
+# version 1.5.
+# b02 1998-Aug-18 Update the mappings for Mac OS Japanese
+# 0x8650 and 0x8855. Update the description of
+# the PostScript screen variant. Matches
+# internal utom<b7>, ufrm<b7>.
+# n06 1998-Feb-05 Update to match internal utom<n10>, ufrm<n27>
+# and Text Encoding Converter version 1.3:
+# Use standard Unicodes plus transcoding hints
+# instead of single corporate characters; see
+# details below. Also reorder into single list
+# with all one-byte characters at the
+# beginning, and rewrite all the initial
+# comments.
+# n03 1995-Apr-15 Matches internal ufrm<n11>.
+#
+# Standard header:
+# ----------------
+#
+# Apple, the Apple logo, and Macintosh are trademarks of Apple
+# Computer, Inc., registered in the United States and other countries.
+# Unicode is a trademark of Unicode Inc. For the sake of brevity,
+# throughout this document, "Macintosh" can be used to refer to
+# Macintosh computers and "Unicode" can be used to refer to the
+# Unicode standard.
+#
+# Apple Computer, Inc. ("Apple") makes no warranty or representation,
+# either express or implied, with respect to this document and the
+# included data, its quality, accuracy, or fitness for a particular
+# purpose. In no event will Apple be liable for direct, indirect,
+# special, incidental, or consequential damages resulting from any
+# defect or inaccuracy in this document or the included data.
+#
+# These mapping tables and character lists are subject to change.
+# The latest tables should be available from the following:
+#
+# <http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/>
+#
+# For general information about Mac OS encodings and these mapping
+# tables, see the file "README.TXT".
+#
+# Format:
+# -------
+#
+# Three tab-separated columns;
+# '#' begins a comment which continues to the end of the line.
+# Column #1 is the Mac OS Japanese code (in hex as 0xNN or 0xNNNN)
+# Column #2 is the corresponding Unicode or Unicode sequence (in
+# hex as 0xNNNN, 0xNNNN+0xNNNN, etc.). Sequences of up to 5
+# Unicode characters are used here.
+# Column #3 is a comment containing the Unicode name.
+# In some cases an additional comment follows the Unicode name.
+#
+# The entries are in Mac OS Japanese code order.
+# All one-byte characters are at the beginning.
+#
+# Some of these mappings require the use of corporate characters.
+# See the file "CORPCHAR.TXT" and notes below.
+#
+# Control character mappings are not shown in this table, following
+# the conventions of the standard UTC mapping tables. However, the
+# Mac OS Japanese encoding uses the standard control characters at
+# 0x00-0x1F and 0x7F.
+#
+# Notes on Mac OS Japanese:
+# -------------------------
+#
+# This is a legacy Mac OS encoding; in the Mac OS X Carbon and Cocoa
+# environments, it is only supported directly in programming
+# interfaces for QuickDraw Text, the Script Manager, and related
+# Text Utilities. For other purposes it is supported via transcoding
+# to and from Unicode.
+#
+# This table covers the standard Mac OS Japanese encoding used
+# in Mac OS versions 7.1 and later. The Mac OS Japanese encoding is
+# based on Shift-JIS, but adds another 300 or so characters using
+# code points that are unassigned in Shift-JIS. Certain Mac OS
+# Japanese fonts are based on a modified version of the Mac OS
+# Japanese encoding; see below.
+#
+# Some of the information below comes from Ken Lunde's book
+# "Understanding Japanese Information Processing", O'Reilly & Assoc.,
+# 1993.
+#
+# 1. Conventional Shift-JIS
+#
+# Most Shift-JIS implementations include the following characters:
+#
+# a) One-byte characters from JIS X0201-1976. This has two parts:
+#
+# - JIS-Roman, the Japanese national variant of ISO 646 (the
+# international version of ASCII). This is identical to ASCII
+# except that 0x5C is YEN SIGN instead of REVERSE SOLIDUS,
+# 0x7E is OVERLINE instead of TILDE, and usually 0x7C is
+# BROKEN BAR instead of VERTICAL LINE (although this last
+# difference is sometimes seen as just a glyph variant).
+#
+# - "Halfwidth" katakana and punctuation characters with codes
+# 0xA1-0xDF.
+#
+# c) Two-byte characters with first/lead/high byte in the range
+# 0x81-0x9F or 0xE0-0xFC, and second/trail/low byte in the
+# range 0x40-0x7E or 0x80-0xFC. The first byte range was chosen
+# to avoid any JIS X0201 characters. The two-byte characters
+# include:
+#
+# - Characters from JIS X0208-1990, transformed so they map
+# onto Shift-JIS code points 0x8140-0xEFFC. The original JIS
+# X0208 characters have code points in the range 0x2121 to
+# 0x7E7E (corresponding to "ku-ten" codes in the range 1,1 to
+# 94,94 - i.e. row and column on a JIS X0208 chart).
+#
+# - A user-defined range using Shift-JIS code points
+# 0xF040-0xFCFC, providing 2444 code points.
+#
+# Note: PostScript fonts are based on JIS X0208-1983 (formerly
+# known as JIS C6226-1983). This earlier version of JIS X0208
+# lacks two Kanji characters that were added for JIS X0208-1990;
+# these have Shift-JIS codes xEAA3 and 0xEAA4.
+#
+# 2. Mac OS Japanese changes and additions
+#
+# a) One-byte changes and additions
+#
+# - Changes to JIS-Roman: In Mac OS Japanese, 0x7C and 0x7E
+# are assigned as in ASCII, not as in JIS-Roman:
+# 0x7C VERTICAL LINE (can be considered a glyph difference)
+# 0x7E TILDE
+#
+# - Additional one-byte characters: basic Shift-JIS leaves
+# five one-byte code points unassigned. Mac OS Japanese assigns
+# these as follows:
+# 0x80 REVERSE SOLIDUS (the character at 0x5C in ASCII)
+# 0xA0 NO-BREAK SPACE ("halfwidth"; common Shift-JIS addition)
+# 0xFD COPYRIGHT SIGN
+# 0xFE TRADE MARK SIGN
+# 0xFF halfwidth horizontal ellipsis
+#
+# b) Two-byte additions
+#
+# Many JIS X0208 code points are unassigned; these correspond to
+# many unassigned code points in Shift-JIS. Many implementations
+# of Shift-JIS, including Mac OS Japanese, add characters using
+# these code points. The standard Mac OS Japanese additions are:
+#
+# - 260 symbols and dingbat-like number and letter forms using
+# Shift-JIS codes in the range 0x8540-0x886D. These include
+# circled and parenthesized numbers and letters, square katakana
+# and Kanji forms, etc.
+#
+# - 53 vertical forms for hiragana, katakana, and punctuation,
+# using Shift-JIS codes in the range 0xEB41-0xED96. These are
+# so-called "ku+84" vertical forms, since their ku-ten code is
+# derived from that of the corresponding abstract or horizontal
+# form character by adding 84 to the ku (row) number.
+#
+# Most of these additional characters are found in other vendor
+# implementations of Shift-JIS, although often with different
+# code points, and so most of these characters are also found
+# in Unicode. However, some of these additional characters do
+# not correspond to any standard single Unicode character.
+#
+# 3. Mac OS Japanese font variants
+#
+# Some fonts used with Mac OS Japanese implement variants of the
+# encoding described above.
+#
+# a) Basic variant
+#
+# This is used with the fonts TohabaGothic and TohabaMincho. This
+# variant has none of the two-byte additions described in section 2b
+# above, but it does have all the one-byte changes and additions
+# described in section 2a.
+#
+# These fonts also lack glyphs for the Kanji characters at 0xEAA3
+# and 0xEAA4.
+#
+# b) PostScript screen variant
+#
+# This is used with the screen fonts ChuGothic and SaiMincho. This
+# variant does not have the Apple 260 symbols and dingbat-like
+# additions in the range 0x8540-0x886D; instead it has a different
+# set of about 160 symbols and dingbat-like additions in the range
+# 0x86A2-0x879C. Like the standard variant, it does have the ku+84
+# vertical forms in the range 0xEB41-0xED96; it also has additional
+# vertical forms in the ranges 0xEE5F-0xEE6E and 0xEE80-0xEE81
+# (although many fonts do not have glyphs for these additional
+# vertical forms). This variant also has the one-byte changes at
+# 0x7C and 0x7E and the additions at 0x80 and 0xA0, but these fonts
+# lack glyphs for the one-byte additions at 0xFD-0xFF. These fonts
+# also lack glyphs for the Kanji characters at 0xEAA3 and 0xEAA4.
+#
+# c) PostScript printer variant
+#
+# When the screen fonts ChuGothic and SaiMincho are printed on
+# certain printers such as Apple's LaserWriter NTX-J, the printer
+# will use a built-in font that is supposed to match the screen font.
+# In fact, the printer fonts implement a superset of the screen
+# variant described above; the PostScript printer variant adds a
+# set of about 440 additional characters in the range 0x8540-0x879C.
+# This is a different set of additions than the 260 in standard
+# Mac OS Japanese, and is similar to the "NEC" additions found in
+# some other implementations. It includes circled and parenthesized
+# numbers and letters and square katakana, as well as many two-byte
+# "halfwidth" forms for Latin, katakana, punctuation, and box
+# drawing characters. It also includes several duplicates of
+# standard JIS X0208 characters.
+#
+# d) Old ku+10 verticals variant
+#
+# This is used with certain old versions of the fonts MaruGothic and
+# HonMincho - only the versions of those fonts used in the Japanese
+# localized versions of System 7.1.
+#
+# This variant has none of the two-byte additions described in
+# section 2b above. Instead, it has a set of "ku+10" vertical forms
+# for hiragana, katakana, and punctuation, using Shift-JIS codes in
+# the range 0x8641-0x8896.
+#
+# Unicode mapping issues and notes:
+# ---------------------------------
+#
+# 1. Mapping the user-defined range
+#
+# The table below covers only the standard Mac OS Japanese encoding.
+# It does not include mappings for the Shift-JIS user-defined range;
+# this is mapped onto Unicodes 0xE000-0xE98B as follows:
+# 0xF040-0xF07E -> 0xE000-0xE03E
+# 0xF080-0xF0FC -> 0xE03F-0xE0BB
+# 0xF140-0xF17E -> 0xE0BC-0xE0FA
+# 0xF180-0xF1FC -> 0xE0FB-0xE177
+# ...
+# 0xFC40-0xFC7E -> 0xE8D0-0xE90E
+# 0xFC80-0xFCFC -> 0xE90F-0xE98B
+#
+# 2. Mapping the Apple two-byte additions
+#
+# The goals in the mappings provided here are:
+# - Ensure roundtrip mapping from every character in Mac OS Japanese
+# to Unicode and back
+# - Use standard Unicode characters as much as possible, to maximize
+# interchangeability of the resulting Unicode text. Whenever possible,
+# avoid having content carried by private-use characters.
+#
+# Since not all of the Mac OS Japanese characters correspond to
+# distinct, single Unicode characters, we employ various strategies.
+#
+# a) Map a single Mac OS Japanese character to a sequence of Unicode
+# characters
+#
+# For example, the character 0x8791 in the Apple extensions is a
+# circled Kanji for "big". There is no single Unicode character for
+# this. However, this can be mapped to the Unicode sequence
+# 0x5927+0x20DD, ideograph "big" + COMBINING ENCLOSING CIRCLE.
+#
+# b) Use private use characters to mark variants or groupings that
+# are similar to a sequence of one or more standard Unicode
+# characters.
+#
+# Apple has defined a block of 32 corporate characters as "transcoding
+# hints." These are used in combination with standard Unicode characters
+# to force them to be treated in a special way for mapping to other
+# encodings; they have no other effect. Sixteen of these transcoding
+# hints are "grouping hints" - they indicate that the next 2-4 Unicode
+# characters should be treated as a single entity for transcoding. The
+# other sixteen transcoding hints are "variant tags" - they are like
+# combining characters, and can follow a standard Unicode (or a sequence
+# consisting of a base character and other combining characters) to
+# cause it to be treated in a special way for transcoding. These always
+# terminate a combining-character sequence.
+#
+# The transcoding coding hints used in this mapping table are:
+#
+# 0xF860 group next 2 characters as a single entity for transcoding
+# 0xF861 group next 3 characters as a single entity for transcoding
+# 0xF862 group next 4 characters as a single entity for transcoding
+# 0xF87A variant tag for "negative" (i.e. black & white reversed)
+# 0xF87E variant tag for vertical form
+# 0xF87F variant tag for other alternate form
+#
+# For example, the Apple addition character 0x85AB is Roman numeral
+# thirteen. There is no single Unicode for this (although there are
+# standard Unicodes for Roman numerals 1-12). Using the grouping hint
+# 0xF862 in combination with standard Unicodes, we can map this as
+# 0xF862+0x0058+0x0049+0x0049+0x0049 (i.e. X + I + I + I).
+#
+# 3. Mapping the basic Shift-JIS characters and Apple one-byte additions
+#
+# The mappings for basic Shift-JIS are based on the UTC mappings for
+# Shift-JIS dated 8 March 1994, by Glenn Adams and John H. Jenkins.
+#
+# There were adjusted as necessary to accommodate the Apple one-byte
+# changes and additions. They were also adjusted to accommodate some
+# changes to the UTC mapping suggested by the Japanese Standards
+# Association.
+#
+# code UTC Apple reason
+# point mapping mapping for change
+# ----- ------- ------- ----------
+# 0x7E 0x203E 0x007E Mac OS Japanese has TILDE here, not
+# OVERLINE
+# 0x815C 0x2015 0x2014 Suggested by JSA
+# 0x815F 0x005C 0xFF3C Avoid conflict with Apple one-byte
+# addition 0x80, which maps to 0x005C.
+# (CP 932 also maps 0x815F to 0xFF3C).
+#
+# Details of mapping changes in each version:
+# -------------------------------------------
+#
+# Changes from version b02 to version b03:
+#
+# - Change the mapping for 0x8150 from 0x203E to 0xFFE3; change the
+# mapping of the corresponding vertical form 0xEB50 from
+# 0x203E+0xF87E to 0xFFE3+0xF87E. Change the mapping of 0x8163 from
+# 0x22EF to 0x2026; change the mapping of the corresponding vertical
+# form 0xEB63 from 0x22EF+0xF87E to 0x2026+0xF87E. These changes
+# reduce problems in interconversion with CP 932.
+# - Consequently, change the mapping of 0xFF from 0x2026 to
+# 0x2026+0xF87F to avoid conflict with the new mapping of 0x8163.
+#
+# Changes from version n06 to version b02:
+#
+# - Change the mapping for 0x8650 from 0xFF4C+0xF87F to 0x2113; change
+# the mapping for 0x8855 from 0x301E to 0x301F. Update the description
+# of the PostScript screen variant to include the 160 characters in the
+# range 0x86A2-0x879C.
+#
+# Changes from version n03 to version n06:
+#
+# - Changed mappings of several Apple additions from single corporate
+# character to standard Unicodes + transcoding hint:
+# 0x8591, 0x85AB-AD, 0x85BF-C1, 0x8645, 0x864B, 0x8650, 0x865D, 0x869E,
+# 0x86CE, 0x86D3-D6, 0x87FB-FC.
+# - Changed mapping of one Apple addition from single corporate character
+# to standard Unicode: 0x8855.
+# - Changed mappings of several Apple vertical forms additions from
+# single corporate character to standard Unicodes + transcoding hint:
+# 0xEB41-42, 0xEB50, 0xEB5B, 0xEB5D, 0xEB60-63, 0xEB6D-6E, 0xEB81,
+# plus all vertical forms in the range 0xEC9F-ED96.
+#
+##################
+
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x00A5 # YEN SIGN
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE # Apple change from standard Shift-JIS
+#
+0x80 0x005C # REVERSE SOLIDUS # Apple addition; changes mapping of 0x815F
+#
+0xA0 0x00A0 # NO-BREAK SPACE # Apple addition
+0xA1 0xFF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 0xFF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 0xFF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 0xFF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 0xFF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 0xFF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 0xFF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 0xFF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA 0xFF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB 0xFF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC 0xFF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD 0xFF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE 0xFF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF 0xFF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 0xFF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 0xFF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 0xFF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 0xFF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 0xFF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 0xFF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 0xFF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 0xFF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 0xFF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 0xFF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA 0xFF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB 0xFF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC 0xFF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD 0xFF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE 0xFF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF 0xFF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 0xFF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 0xFF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 0xFF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 0xFF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 0xFF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 0xFF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 0xFF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 0xFF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 0xFF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 0xFF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA 0xFF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB 0xFF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC 0xFF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD 0xFF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE 0xFF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF 0xFF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 0xFF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 0xFF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 0xFF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 0xFF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 0xFF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 0xFF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 0xFF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 0xFF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 0xFF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 0xFF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA 0xFF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB 0xFF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC 0xFF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD 0xFF9D # HALFWIDTH KATAKANA LETTER N
+0xDE 0xFF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF 0xFF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+#
+0xFD 0x00A9 # COPYRIGHT SIGN # Apple addition
+0xFE 0x2122 # TRADE MARK SIGN # Apple addition
+0xFF 0x2026+0xF87F # halfwidth horizontal ellipsis # Apple addition
+#
+0x8140 0x3000 # IDEOGRAPHIC SPACE
+0x8141 0x3001 # IDEOGRAPHIC COMMA
+0x8142 0x3002 # IDEOGRAPHIC FULL STOP
+0x8143 0xFF0C # FULLWIDTH COMMA
+0x8144 0xFF0E # FULLWIDTH FULL STOP
+0x8145 0x30FB # KATAKANA MIDDLE DOT
+0x8146 0xFF1A # FULLWIDTH COLON
+0x8147 0xFF1B # FULLWIDTH SEMICOLON
+0x8148 0xFF1F # FULLWIDTH QUESTION MARK
+0x8149 0xFF01 # FULLWIDTH EXCLAMATION MARK
+0x814A 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C 0x00B4 # ACUTE ACCENT
+0x814D 0xFF40 # FULLWIDTH GRAVE ACCENT
+0x814E 0x00A8 # DIAERESIS
+0x814F 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 0xFFE3 # FULLWIDTH MACRON
+0x8151 0xFF3F # FULLWIDTH LOW LINE
+0x8152 0x30FD # KATAKANA ITERATION MARK
+0x8153 0x30FE # KATAKANA VOICED ITERATION MARK
+0x8154 0x309D # HIRAGANA ITERATION MARK
+0x8155 0x309E # HIRAGANA VOICED ITERATION MARK
+0x8156 0x3003 # DITTO MARK
+0x8157 0x4EDD # <CJK>
+0x8158 0x3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 0x3006 # IDEOGRAPHIC CLOSING MARK
+0x815A 0x3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C 0x2014 # EM DASH # change UTC mapping to match JIS spec
+0x815D 0x2010 # HYPHEN
+0x815E 0xFF0F # FULLWIDTH SOLIDUS
+0x815F 0xFF3C # FULLWIDTH REVERSE SOLIDUS # change UTC mapping to separate from 0x80
+0x8160 0x301C # WAVE DASH
+0x8161 0x2016 # DOUBLE VERTICAL LINE
+0x8162 0xFF5C # FULLWIDTH VERTICAL LINE
+0x8163 0x2026 # HORIZONTAL ELLIPSIS
+0x8164 0x2025 # TWO DOT LEADER
+0x8165 0x2018 # LEFT SINGLE QUOTATION MARK
+0x8166 0x2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 0x201C # LEFT DOUBLE QUOTATION MARK
+0x8168 0x201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 0xFF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A 0xFF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B 0x3014 # LEFT TORTOISE SHELL BRACKET
+0x816C 0x3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F 0xFF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 0x3008 # LEFT ANGLE BRACKET
+0x8172 0x3009 # RIGHT ANGLE BRACKET
+0x8173 0x300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 0x300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 0x300C # LEFT CORNER BRACKET
+0x8176 0x300D # RIGHT CORNER BRACKET
+0x8177 0x300E # LEFT WHITE CORNER BRACKET
+0x8178 0x300F # RIGHT WHITE CORNER BRACKET
+0x8179 0x3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A 0x3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B 0xFF0B # FULLWIDTH PLUS SIGN
+0x817C 0x2212 # MINUS SIGN
+0x817D 0x00B1 # PLUS-MINUS SIGN
+0x817E 0x00D7 # MULTIPLICATION SIGN
+0x8180 0x00F7 # DIVISION SIGN
+0x8181 0xFF1D # FULLWIDTH EQUALS SIGN
+0x8182 0x2260 # NOT EQUAL TO
+0x8183 0xFF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 0xFF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 0x2266 # LESS-THAN OVER EQUAL TO
+0x8186 0x2267 # GREATER-THAN OVER EQUAL TO
+0x8187 0x221E # INFINITY
+0x8188 0x2234 # THEREFORE
+0x8189 0x2642 # MALE SIGN
+0x818A 0x2640 # FEMALE SIGN
+0x818B 0x00B0 # DEGREE SIGN
+0x818C 0x2032 # PRIME
+0x818D 0x2033 # DOUBLE PRIME
+0x818E 0x2103 # DEGREE CELSIUS
+0x818F 0xFFE5 # FULLWIDTH YEN SIGN
+0x8190 0xFF04 # FULLWIDTH DOLLAR SIGN
+0x8191 0x00A2 # CENT SIGN
+0x8192 0x00A3 # POUND SIGN
+0x8193 0xFF05 # FULLWIDTH PERCENT SIGN
+0x8194 0xFF03 # FULLWIDTH NUMBER SIGN
+0x8195 0xFF06 # FULLWIDTH AMPERSAND
+0x8196 0xFF0A # FULLWIDTH ASTERISK
+0x8197 0xFF20 # FULLWIDTH COMMERCIAL AT
+0x8198 0x00A7 # SECTION SIGN
+0x8199 0x2606 # WHITE STAR
+0x819A 0x2605 # BLACK STAR
+0x819B 0x25CB # WHITE CIRCLE
+0x819C 0x25CF # BLACK CIRCLE
+0x819D 0x25CE # BULLSEYE
+0x819E 0x25C7 # WHITE DIAMOND
+0x819F 0x25C6 # BLACK DIAMOND
+0x81A0 0x25A1 # WHITE SQUARE
+0x81A1 0x25A0 # BLACK SQUARE
+0x81A2 0x25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 0x25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 0x25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 0x25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 0x203B # REFERENCE MARK
+0x81A7 0x3012 # POSTAL MARK
+0x81A8 0x2192 # RIGHTWARDS ARROW
+0x81A9 0x2190 # LEFTWARDS ARROW
+0x81AA 0x2191 # UPWARDS ARROW
+0x81AB 0x2193 # DOWNWARDS ARROW
+0x81AC 0x3013 # GETA MARK
+0x81B8 0x2208 # ELEMENT OF
+0x81B9 0x220B # CONTAINS AS MEMBER
+0x81BA 0x2286 # SUBSET OF OR EQUAL TO
+0x81BB 0x2287 # SUPERSET OF OR EQUAL TO
+0x81BC 0x2282 # SUBSET OF
+0x81BD 0x2283 # SUPERSET OF
+0x81BE 0x222A # UNION
+0x81BF 0x2229 # INTERSECTION
+0x81C8 0x2227 # LOGICAL AND
+0x81C9 0x2228 # LOGICAL OR
+0x81CA 0x00AC # NOT SIGN
+0x81CB 0x21D2 # RIGHTWARDS DOUBLE ARROW
+0x81CC 0x21D4 # LEFT RIGHT DOUBLE ARROW
+0x81CD 0x2200 # FOR ALL
+0x81CE 0x2203 # THERE EXISTS
+0x81DA 0x2220 # ANGLE
+0x81DB 0x22A5 # UP TACK
+0x81DC 0x2312 # ARC
+0x81DD 0x2202 # PARTIAL DIFFERENTIAL
+0x81DE 0x2207 # NABLA
+0x81DF 0x2261 # IDENTICAL TO
+0x81E0 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1 0x226A # MUCH LESS-THAN
+0x81E2 0x226B # MUCH GREATER-THAN
+0x81E3 0x221A # SQUARE ROOT
+0x81E4 0x223D # REVERSED TILDE # This UTC mapping is questionable
+0x81E5 0x221D # PROPORTIONAL TO
+0x81E6 0x2235 # BECAUSE
+0x81E7 0x222B # INTEGRAL
+0x81E8 0x222C # DOUBLE INTEGRAL
+0x81F0 0x212B # ANGSTROM SIGN
+0x81F1 0x2030 # PER MILLE SIGN
+0x81F2 0x266F # MUSIC SHARP SIGN
+0x81F3 0x266D # MUSIC FLAT SIGN
+0x81F4 0x266A # EIGHTH NOTE
+0x81F5 0x2020 # DAGGER
+0x81F6 0x2021 # DOUBLE DAGGER
+0x81F7 0x00B6 # PILCROW SIGN
+0x81FC 0x25EF # LARGE CIRCLE
+0x824F 0xFF10 # FULLWIDTH DIGIT ZERO
+0x8250 0xFF11 # FULLWIDTH DIGIT ONE
+0x8251 0xFF12 # FULLWIDTH DIGIT TWO
+0x8252 0xFF13 # FULLWIDTH DIGIT THREE
+0x8253 0xFF14 # FULLWIDTH DIGIT FOUR
+0x8254 0xFF15 # FULLWIDTH DIGIT FIVE
+0x8255 0xFF16 # FULLWIDTH DIGIT SIX
+0x8256 0xFF17 # FULLWIDTH DIGIT SEVEN
+0x8257 0xFF18 # FULLWIDTH DIGIT EIGHT
+0x8258 0xFF19 # FULLWIDTH DIGIT NINE
+0x8260 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281 0xFF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 0xFF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 0xFF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 0xFF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 0xFF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 0xFF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 0xFF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 0xFF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 0xFF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 0xFF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 0xFF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 0xFF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 0xFF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 0xFF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 0xFF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 0xFF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 0xFF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829F 0x3041 # HIRAGANA LETTER SMALL A
+0x82A0 0x3042 # HIRAGANA LETTER A
+0x82A1 0x3043 # HIRAGANA LETTER SMALL I
+0x82A2 0x3044 # HIRAGANA LETTER I
+0x82A3 0x3045 # HIRAGANA LETTER SMALL U
+0x82A4 0x3046 # HIRAGANA LETTER U
+0x82A5 0x3047 # HIRAGANA LETTER SMALL E
+0x82A6 0x3048 # HIRAGANA LETTER E
+0x82A7 0x3049 # HIRAGANA LETTER SMALL O
+0x82A8 0x304A # HIRAGANA LETTER O
+0x82A9 0x304B # HIRAGANA LETTER KA
+0x82AA 0x304C # HIRAGANA LETTER GA
+0x82AB 0x304D # HIRAGANA LETTER KI
+0x82AC 0x304E # HIRAGANA LETTER GI
+0x82AD 0x304F # HIRAGANA LETTER KU
+0x82AE 0x3050 # HIRAGANA LETTER GU
+0x82AF 0x3051 # HIRAGANA LETTER KE
+0x82B0 0x3052 # HIRAGANA LETTER GE
+0x82B1 0x3053 # HIRAGANA LETTER KO
+0x82B2 0x3054 # HIRAGANA LETTER GO
+0x82B3 0x3055 # HIRAGANA LETTER SA
+0x82B4 0x3056 # HIRAGANA LETTER ZA
+0x82B5 0x3057 # HIRAGANA LETTER SI
+0x82B6 0x3058 # HIRAGANA LETTER ZI
+0x82B7 0x3059 # HIRAGANA LETTER SU
+0x82B8 0x305A # HIRAGANA LETTER ZU
+0x82B9 0x305B # HIRAGANA LETTER SE
+0x82BA 0x305C # HIRAGANA LETTER ZE
+0x82BB 0x305D # HIRAGANA LETTER SO
+0x82BC 0x305E # HIRAGANA LETTER ZO
+0x82BD 0x305F # HIRAGANA LETTER TA
+0x82BE 0x3060 # HIRAGANA LETTER DA
+0x82BF 0x3061 # HIRAGANA LETTER TI
+0x82C0 0x3062 # HIRAGANA LETTER DI
+0x82C1 0x3063 # HIRAGANA LETTER SMALL TU
+0x82C2 0x3064 # HIRAGANA LETTER TU
+0x82C3 0x3065 # HIRAGANA LETTER DU
+0x82C4 0x3066 # HIRAGANA LETTER TE
+0x82C5 0x3067 # HIRAGANA LETTER DE
+0x82C6 0x3068 # HIRAGANA LETTER TO
+0x82C7 0x3069 # HIRAGANA LETTER DO
+0x82C8 0x306A # HIRAGANA LETTER NA
+0x82C9 0x306B # HIRAGANA LETTER NI
+0x82CA 0x306C # HIRAGANA LETTER NU
+0x82CB 0x306D # HIRAGANA LETTER NE
+0x82CC 0x306E # HIRAGANA LETTER NO
+0x82CD 0x306F # HIRAGANA LETTER HA
+0x82CE 0x3070 # HIRAGANA LETTER BA
+0x82CF 0x3071 # HIRAGANA LETTER PA
+0x82D0 0x3072 # HIRAGANA LETTER HI
+0x82D1 0x3073 # HIRAGANA LETTER BI
+0x82D2 0x3074 # HIRAGANA LETTER PI
+0x82D3 0x3075 # HIRAGANA LETTER HU
+0x82D4 0x3076 # HIRAGANA LETTER BU
+0x82D5 0x3077 # HIRAGANA LETTER PU
+0x82D6 0x3078 # HIRAGANA LETTER HE
+0x82D7 0x3079 # HIRAGANA LETTER BE
+0x82D8 0x307A # HIRAGANA LETTER PE
+0x82D9 0x307B # HIRAGANA LETTER HO
+0x82DA 0x307C # HIRAGANA LETTER BO
+0x82DB 0x307D # HIRAGANA LETTER PO
+0x82DC 0x307E # HIRAGANA LETTER MA
+0x82DD 0x307F # HIRAGANA LETTER MI
+0x82DE 0x3080 # HIRAGANA LETTER MU
+0x82DF 0x3081 # HIRAGANA LETTER ME
+0x82E0 0x3082 # HIRAGANA LETTER MO
+0x82E1 0x3083 # HIRAGANA LETTER SMALL YA
+0x82E2 0x3084 # HIRAGANA LETTER YA
+0x82E3 0x3085 # HIRAGANA LETTER SMALL YU
+0x82E4 0x3086 # HIRAGANA LETTER YU
+0x82E5 0x3087 # HIRAGANA LETTER SMALL YO
+0x82E6 0x3088 # HIRAGANA LETTER YO
+0x82E7 0x3089 # HIRAGANA LETTER RA
+0x82E8 0x308A # HIRAGANA LETTER RI
+0x82E9 0x308B # HIRAGANA LETTER RU
+0x82EA 0x308C # HIRAGANA LETTER RE
+0x82EB 0x308D # HIRAGANA LETTER RO
+0x82EC 0x308E # HIRAGANA LETTER SMALL WA
+0x82ED 0x308F # HIRAGANA LETTER WA
+0x82EE 0x3090 # HIRAGANA LETTER WI
+0x82EF 0x3091 # HIRAGANA LETTER WE
+0x82F0 0x3092 # HIRAGANA LETTER WO
+0x82F1 0x3093 # HIRAGANA LETTER N
+0x8340 0x30A1 # KATAKANA LETTER SMALL A
+0x8341 0x30A2 # KATAKANA LETTER A
+0x8342 0x30A3 # KATAKANA LETTER SMALL I
+0x8343 0x30A4 # KATAKANA LETTER I
+0x8344 0x30A5 # KATAKANA LETTER SMALL U
+0x8345 0x30A6 # KATAKANA LETTER U
+0x8346 0x30A7 # KATAKANA LETTER SMALL E
+0x8347 0x30A8 # KATAKANA LETTER E
+0x8348 0x30A9 # KATAKANA LETTER SMALL O
+0x8349 0x30AA # KATAKANA LETTER O
+0x834A 0x30AB # KATAKANA LETTER KA
+0x834B 0x30AC # KATAKANA LETTER GA
+0x834C 0x30AD # KATAKANA LETTER KI
+0x834D 0x30AE # KATAKANA LETTER GI
+0x834E 0x30AF # KATAKANA LETTER KU
+0x834F 0x30B0 # KATAKANA LETTER GU
+0x8350 0x30B1 # KATAKANA LETTER KE
+0x8351 0x30B2 # KATAKANA LETTER GE
+0x8352 0x30B3 # KATAKANA LETTER KO
+0x8353 0x30B4 # KATAKANA LETTER GO
+0x8354 0x30B5 # KATAKANA LETTER SA
+0x8355 0x30B6 # KATAKANA LETTER ZA
+0x8356 0x30B7 # KATAKANA LETTER SI
+0x8357 0x30B8 # KATAKANA LETTER ZI
+0x8358 0x30B9 # KATAKANA LETTER SU
+0x8359 0x30BA # KATAKANA LETTER ZU
+0x835A 0x30BB # KATAKANA LETTER SE
+0x835B 0x30BC # KATAKANA LETTER ZE
+0x835C 0x30BD # KATAKANA LETTER SO
+0x835D 0x30BE # KATAKANA LETTER ZO
+0x835E 0x30BF # KATAKANA LETTER TA
+0x835F 0x30C0 # KATAKANA LETTER DA
+0x8360 0x30C1 # KATAKANA LETTER TI
+0x8361 0x30C2 # KATAKANA LETTER DI
+0x8362 0x30C3 # KATAKANA LETTER SMALL TU
+0x8363 0x30C4 # KATAKANA LETTER TU
+0x8364 0x30C5 # KATAKANA LETTER DU
+0x8365 0x30C6 # KATAKANA LETTER TE
+0x8366 0x30C7 # KATAKANA LETTER DE
+0x8367 0x30C8 # KATAKANA LETTER TO
+0x8368 0x30C9 # KATAKANA LETTER DO
+0x8369 0x30CA # KATAKANA LETTER NA
+0x836A 0x30CB # KATAKANA LETTER NI
+0x836B 0x30CC # KATAKANA LETTER NU
+0x836C 0x30CD # KATAKANA LETTER NE
+0x836D 0x30CE # KATAKANA LETTER NO
+0x836E 0x30CF # KATAKANA LETTER HA
+0x836F 0x30D0 # KATAKANA LETTER BA
+0x8370 0x30D1 # KATAKANA LETTER PA
+0x8371 0x30D2 # KATAKANA LETTER HI
+0x8372 0x30D3 # KATAKANA LETTER BI
+0x8373 0x30D4 # KATAKANA LETTER PI
+0x8374 0x30D5 # KATAKANA LETTER HU
+0x8375 0x30D6 # KATAKANA LETTER BU
+0x8376 0x30D7 # KATAKANA LETTER PU
+0x8377 0x30D8 # KATAKANA LETTER HE
+0x8378 0x30D9 # KATAKANA LETTER BE
+0x8379 0x30DA # KATAKANA LETTER PE
+0x837A 0x30DB # KATAKANA LETTER HO
+0x837B 0x30DC # KATAKANA LETTER BO
+0x837C 0x30DD # KATAKANA LETTER PO
+0x837D 0x30DE # KATAKANA LETTER MA
+0x837E 0x30DF # KATAKANA LETTER MI
+0x8380 0x30E0 # KATAKANA LETTER MU
+0x8381 0x30E1 # KATAKANA LETTER ME
+0x8382 0x30E2 # KATAKANA LETTER MO
+0x8383 0x30E3 # KATAKANA LETTER SMALL YA
+0x8384 0x30E4 # KATAKANA LETTER YA
+0x8385 0x30E5 # KATAKANA LETTER SMALL YU
+0x8386 0x30E6 # KATAKANA LETTER YU
+0x8387 0x30E7 # KATAKANA LETTER SMALL YO
+0x8388 0x30E8 # KATAKANA LETTER YO
+0x8389 0x30E9 # KATAKANA LETTER RA
+0x838A 0x30EA # KATAKANA LETTER RI
+0x838B 0x30EB # KATAKANA LETTER RU
+0x838C 0x30EC # KATAKANA LETTER RE
+0x838D 0x30ED # KATAKANA LETTER RO
+0x838E 0x30EE # KATAKANA LETTER SMALL WA
+0x838F 0x30EF # KATAKANA LETTER WA
+0x8390 0x30F0 # KATAKANA LETTER WI
+0x8391 0x30F1 # KATAKANA LETTER WE
+0x8392 0x30F2 # KATAKANA LETTER WO
+0x8393 0x30F3 # KATAKANA LETTER N
+0x8394 0x30F4 # KATAKANA LETTER VU
+0x8395 0x30F5 # KATAKANA LETTER SMALL KA
+0x8396 0x30F6 # KATAKANA LETTER SMALL KE
+0x839F 0x0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 0x0392 # GREEK CAPITAL LETTER BETA
+0x83A1 0x0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 0x0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 0x0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 0x0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 0x0397 # GREEK CAPITAL LETTER ETA
+0x83A6 0x0398 # GREEK CAPITAL LETTER THETA
+0x83A7 0x0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 0x039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 0x039B # GREEK CAPITAL LETTER LAMDA
+0x83AA 0x039C # GREEK CAPITAL LETTER MU
+0x83AB 0x039D # GREEK CAPITAL LETTER NU
+0x83AC 0x039E # GREEK CAPITAL LETTER XI
+0x83AD 0x039F # GREEK CAPITAL LETTER OMICRON
+0x83AE 0x03A0 # GREEK CAPITAL LETTER PI
+0x83AF 0x03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 0x03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 0x03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 0x03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 0x03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 0x03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 0x03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 0x03A9 # GREEK CAPITAL LETTER OMEGA
+0x83BF 0x03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 0x03B2 # GREEK SMALL LETTER BETA
+0x83C1 0x03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 0x03B4 # GREEK SMALL LETTER DELTA
+0x83C3 0x03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 0x03B6 # GREEK SMALL LETTER ZETA
+0x83C5 0x03B7 # GREEK SMALL LETTER ETA
+0x83C6 0x03B8 # GREEK SMALL LETTER THETA
+0x83C7 0x03B9 # GREEK SMALL LETTER IOTA
+0x83C8 0x03BA # GREEK SMALL LETTER KAPPA
+0x83C9 0x03BB # GREEK SMALL LETTER LAMDA
+0x83CA 0x03BC # GREEK SMALL LETTER MU
+0x83CB 0x03BD # GREEK SMALL LETTER NU
+0x83CC 0x03BE # GREEK SMALL LETTER XI
+0x83CD 0x03BF # GREEK SMALL LETTER OMICRON
+0x83CE 0x03C0 # GREEK SMALL LETTER PI
+0x83CF 0x03C1 # GREEK SMALL LETTER RHO
+0x83D0 0x03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 0x03C4 # GREEK SMALL LETTER TAU
+0x83D2 0x03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 0x03C6 # GREEK SMALL LETTER PHI
+0x83D4 0x03C7 # GREEK SMALL LETTER CHI
+0x83D5 0x03C8 # GREEK SMALL LETTER PSI
+0x83D6 0x03C9 # GREEK SMALL LETTER OMEGA
+0x8440 0x0410 # CYRILLIC CAPITAL LETTER A
+0x8441 0x0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 0x0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 0x0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 0x0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 0x0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 0x0418 # CYRILLIC CAPITAL LETTER I
+0x844A 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B 0x041A # CYRILLIC CAPITAL LETTER KA
+0x844C 0x041B # CYRILLIC CAPITAL LETTER EL
+0x844D 0x041C # CYRILLIC CAPITAL LETTER EM
+0x844E 0x041D # CYRILLIC CAPITAL LETTER EN
+0x844F 0x041E # CYRILLIC CAPITAL LETTER O
+0x8450 0x041F # CYRILLIC CAPITAL LETTER PE
+0x8451 0x0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 0x0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 0x0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 0x0423 # CYRILLIC CAPITAL LETTER U
+0x8455 0x0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 0x0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C 0x042B # CYRILLIC CAPITAL LETTER YERU
+0x845D 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E 0x042D # CYRILLIC CAPITAL LETTER E
+0x845F 0x042E # CYRILLIC CAPITAL LETTER YU
+0x8460 0x042F # CYRILLIC CAPITAL LETTER YA
+0x8470 0x0430 # CYRILLIC SMALL LETTER A
+0x8471 0x0431 # CYRILLIC SMALL LETTER BE
+0x8472 0x0432 # CYRILLIC SMALL LETTER VE
+0x8473 0x0433 # CYRILLIC SMALL LETTER GHE
+0x8474 0x0434 # CYRILLIC SMALL LETTER DE
+0x8475 0x0435 # CYRILLIC SMALL LETTER IE
+0x8476 0x0451 # CYRILLIC SMALL LETTER IO
+0x8477 0x0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 0x0437 # CYRILLIC SMALL LETTER ZE
+0x8479 0x0438 # CYRILLIC SMALL LETTER I
+0x847A 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B 0x043A # CYRILLIC SMALL LETTER KA
+0x847C 0x043B # CYRILLIC SMALL LETTER EL
+0x847D 0x043C # CYRILLIC SMALL LETTER EM
+0x847E 0x043D # CYRILLIC SMALL LETTER EN
+0x8480 0x043E # CYRILLIC SMALL LETTER O
+0x8481 0x043F # CYRILLIC SMALL LETTER PE
+0x8482 0x0440 # CYRILLIC SMALL LETTER ER
+0x8483 0x0441 # CYRILLIC SMALL LETTER ES
+0x8484 0x0442 # CYRILLIC SMALL LETTER TE
+0x8485 0x0443 # CYRILLIC SMALL LETTER U
+0x8486 0x0444 # CYRILLIC SMALL LETTER EF
+0x8487 0x0445 # CYRILLIC SMALL LETTER HA
+0x8488 0x0446 # CYRILLIC SMALL LETTER TSE
+0x8489 0x0447 # CYRILLIC SMALL LETTER CHE
+0x848A 0x0448 # CYRILLIC SMALL LETTER SHA
+0x848B 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D 0x044B # CYRILLIC SMALL LETTER YERU
+0x848E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F 0x044D # CYRILLIC SMALL LETTER E
+0x8490 0x044E # CYRILLIC SMALL LETTER YU
+0x8491 0x044F # CYRILLIC SMALL LETTER YA
+0x849F 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x84A1 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB 0x2503 # BOX DRAWINGS HEAVY VERTICAL
+0x84AC 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE 0x251B # BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+
+# Apple additions
+0x8540 0x2460 # CIRCLED DIGIT ONE
+0x8541 0x2461 # CIRCLED DIGIT TWO
+0x8542 0x2462 # CIRCLED DIGIT THREE
+0x8543 0x2463 # CIRCLED DIGIT FOUR
+0x8544 0x2464 # CIRCLED DIGIT FIVE
+0x8545 0x2465 # CIRCLED DIGIT SIX
+0x8546 0x2466 # CIRCLED DIGIT SEVEN
+0x8547 0x2467 # CIRCLED DIGIT EIGHT
+0x8548 0x2468 # CIRCLED DIGIT NINE
+0x8549 0x2469 # CIRCLED NUMBER TEN
+0x854A 0x246A # CIRCLED NUMBER ELEVEN
+0x854B 0x246B # CIRCLED NUMBER TWELVE
+0x854C 0x246C # CIRCLED NUMBER THIRTEEN
+0x854D 0x246D # CIRCLED NUMBER FOURTEEN
+0x854E 0x246E # CIRCLED NUMBER FIFTEEN
+0x854F 0x246F # CIRCLED NUMBER SIXTEEN
+0x8550 0x2470 # CIRCLED NUMBER SEVENTEEN
+0x8551 0x2471 # CIRCLED NUMBER EIGHTEEN
+0x8552 0x2472 # CIRCLED NUMBER NINETEEN
+0x8553 0x2473 # CIRCLED NUMBER TWENTY
+0x855E 0x2474 # PARENTHESIZED DIGIT ONE
+0x855F 0x2475 # PARENTHESIZED DIGIT TWO
+0x8560 0x2476 # PARENTHESIZED DIGIT THREE
+0x8561 0x2477 # PARENTHESIZED DIGIT FOUR
+0x8562 0x2478 # PARENTHESIZED DIGIT FIVE
+0x8563 0x2479 # PARENTHESIZED DIGIT SIX
+0x8564 0x247A # PARENTHESIZED DIGIT SEVEN
+0x8565 0x247B # PARENTHESIZED DIGIT EIGHT
+0x8566 0x247C # PARENTHESIZED DIGIT NINE
+0x8567 0x247D # PARENTHESIZED NUMBER TEN
+0x8568 0x247E # PARENTHESIZED NUMBER ELEVEN
+0x8569 0x247F # PARENTHESIZED NUMBER TWELVE
+0x856A 0x2480 # PARENTHESIZED NUMBER THIRTEEN
+0x856B 0x2481 # PARENTHESIZED NUMBER FOURTEEN
+0x856C 0x2482 # PARENTHESIZED NUMBER FIFTEEN
+0x856D 0x2483 # PARENTHESIZED NUMBER SIXTEEN
+0x856E 0x2484 # PARENTHESIZED NUMBER SEVENTEEN
+0x856F 0x2485 # PARENTHESIZED NUMBER EIGHTEEN
+0x8570 0x2486 # PARENTHESIZED NUMBER NINETEEN
+0x8571 0x2487 # PARENTHESIZED NUMBER TWENTY
+0x857C 0x2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE
+0x857D 0x2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO
+0x857E 0x2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE
+0x8580 0x2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR
+0x8581 0x277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE
+0x8582 0x277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX
+0x8583 0x277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN
+0x8584 0x277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT
+0x8585 0x277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE
+0x8591 0xF860+0x0030+0x002E # digit zero full stop
+0x8592 0x2488 # DIGIT ONE FULL STOP
+0x8593 0x2489 # DIGIT TWO FULL STOP
+0x8594 0x248A # DIGIT THREE FULL STOP
+0x8595 0x248B # DIGIT FOUR FULL STOP
+0x8596 0x248C # DIGIT FIVE FULL STOP
+0x8597 0x248D # DIGIT SIX FULL STOP
+0x8598 0x248E # DIGIT SEVEN FULL STOP
+0x8599 0x248F # DIGIT EIGHT FULL STOP
+0x859A 0x2490 # DIGIT NINE FULL STOP
+0x859F 0x2160 # ROMAN NUMERAL ONE
+0x85A0 0x2161 # ROMAN NUMERAL TWO
+0x85A1 0x2162 # ROMAN NUMERAL THREE
+0x85A2 0x2163 # ROMAN NUMERAL FOUR
+0x85A3 0x2164 # ROMAN NUMERAL FIVE
+0x85A4 0x2165 # ROMAN NUMERAL SIX
+0x85A5 0x2166 # ROMAN NUMERAL SEVEN
+0x85A6 0x2167 # ROMAN NUMERAL EIGHT
+0x85A7 0x2168 # ROMAN NUMERAL NINE
+0x85A8 0x2169 # ROMAN NUMERAL TEN
+0x85A9 0x216A # ROMAN NUMERAL ELEVEN
+0x85AA 0x216B # ROMAN NUMERAL TWELVE
+0x85AB 0xF862+0x0058+0x0049+0x0049+0x0049 # roman numeral thirteen
+0x85AC 0xF861+0x0058+0x0049+0x0056 # roman numeral fourteen
+0x85AD 0xF860+0x0058+0x0056 # roman numeral fifteen
+0x85B3 0x2170 # SMALL ROMAN NUMERAL ONE
+0x85B4 0x2171 # SMALL ROMAN NUMERAL TWO
+0x85B5 0x2172 # SMALL ROMAN NUMERAL THREE
+0x85B6 0x2173 # SMALL ROMAN NUMERAL FOUR
+0x85B7 0x2174 # SMALL ROMAN NUMERAL FIVE
+0x85B8 0x2175 # SMALL ROMAN NUMERAL SIX
+0x85B9 0x2176 # SMALL ROMAN NUMERAL SEVEN
+0x85BA 0x2177 # SMALL ROMAN NUMERAL EIGHT
+0x85BB 0x2178 # SMALL ROMAN NUMERAL NINE
+0x85BC 0x2179 # SMALL ROMAN NUMERAL TEN
+0x85BD 0x217A # SMALL ROMAN NUMERAL ELEVEN
+0x85BE 0x217B # SMALL ROMAN NUMERAL TWELVE
+0x85BF 0xF862+0x0078+0x0069+0x0069+0x0069 # small roman numeral thirteen
+0x85C0 0xF861+0x0078+0x0069+0x0076 # small roman numeral fourteen
+0x85C1 0xF860+0x0078+0x0076 # small roman numeral fifteen
+0x85DB 0x249C # PARENTHESIZED LATIN SMALL LETTER A
+0x85DC 0x249D # PARENTHESIZED LATIN SMALL LETTER B
+0x85DD 0x249E # PARENTHESIZED LATIN SMALL LETTER C
+0x85DE 0x249F # PARENTHESIZED LATIN SMALL LETTER D
+0x85DF 0x24A0 # PARENTHESIZED LATIN SMALL LETTER E
+0x85E0 0x24A1 # PARENTHESIZED LATIN SMALL LETTER F
+0x85E1 0x24A2 # PARENTHESIZED LATIN SMALL LETTER G
+0x85E2 0x24A3 # PARENTHESIZED LATIN SMALL LETTER H
+0x85E3 0x24A4 # PARENTHESIZED LATIN SMALL LETTER I
+0x85E4 0x24A5 # PARENTHESIZED LATIN SMALL LETTER J
+0x85E5 0x24A6 # PARENTHESIZED LATIN SMALL LETTER K
+0x85E6 0x24A7 # PARENTHESIZED LATIN SMALL LETTER L
+0x85E7 0x24A8 # PARENTHESIZED LATIN SMALL LETTER M
+0x85E8 0x24A9 # PARENTHESIZED LATIN SMALL LETTER N
+0x85E9 0x24AA # PARENTHESIZED LATIN SMALL LETTER O
+0x85EA 0x24AB # PARENTHESIZED LATIN SMALL LETTER P
+0x85EB 0x24AC # PARENTHESIZED LATIN SMALL LETTER Q
+0x85EC 0x24AD # PARENTHESIZED LATIN SMALL LETTER R
+0x85ED 0x24AE # PARENTHESIZED LATIN SMALL LETTER S
+0x85EE 0x24AF # PARENTHESIZED LATIN SMALL LETTER T
+0x85EF 0x24B0 # PARENTHESIZED LATIN SMALL LETTER U
+0x85F0 0x24B1 # PARENTHESIZED LATIN SMALL LETTER V
+0x85F1 0x24B2 # PARENTHESIZED LATIN SMALL LETTER W
+0x85F2 0x24B3 # PARENTHESIZED LATIN SMALL LETTER X
+0x85F3 0x24B4 # PARENTHESIZED LATIN SMALL LETTER Y
+0x85F4 0x24B5 # PARENTHESIZED LATIN SMALL LETTER Z
+0x8640 0x339C # SQUARE MM
+0x8641 0x339F # SQUARE MM SQUARED
+0x8642 0x339D # SQUARE CM
+0x8643 0x33A0 # SQUARE CM SQUARED
+0x8644 0x33A4 # SQUARE CM CUBED
+0x8645 0xFF4D+0xF87F # square m
+0x8646 0x33A1 # SQUARE M SQUARED
+0x8647 0x33A5 # SQUARE M CUBED
+0x8648 0x339E # SQUARE KM
+0x8649 0x33A2 # SQUARE KM SQUARED
+0x864A 0x338E # SQUARE MG
+0x864B 0xFF47+0xF87F # square g
+0x864C 0x338F # SQUARE KG
+0x864D 0x33C4 # SQUARE CC
+0x864E 0x3396 # SQUARE ML
+0x864F 0x3397 # SQUARE DL
+0x8650 0x2113 # SCRIPT SMALL L
+0x8651 0x3398 # SQUARE KL
+0x8652 0x33B3 # SQUARE MS
+0x8653 0x33B2 # SQUARE MU S
+0x8654 0x33B1 # SQUARE NS
+0x8655 0x33B0 # SQUARE PS
+0x8656 0x2109 # DEGREE FAHRENHEIT
+0x8657 0x33D4 # SQUARE MB SMALL
+0x8658 0x33CB # SQUARE HP
+0x8659 0x3390 # SQUARE HZ
+0x865A 0x3385 # SQUARE KB
+0x865B 0x3386 # SQUARE MB
+0x865C 0x3387 # SQUARE GB
+0x865D 0xF860+0x0054+0x0042 # square TB
+0x869B 0x2116 # NUMERO SIGN
+0x869C 0x33CD # SQUARE KK
+0x869D 0x2121 # TELEPHONE SIGN
+0x869E 0xF861+0x0046+0x0041+0x0058 # FAX sign # or for Unicode 4.0, 0x213B FACSIMILE SIGN
+0x869F 0x2664 # WHITE SPADE SUIT
+0x86A0 0x2667 # WHITE CLUB SUIT
+0x86A1 0x2661 # WHITE HEART SUIT
+0x86A2 0x2662 # WHITE DIAMOND SUIT
+0x86A3 0x2660 # BLACK SPADE SUIT
+0x86A4 0x2663 # BLACK CLUB SUIT
+0x86A5 0x2665 # BLACK HEART SUIT
+0x86A6 0x2666 # BLACK DIAMOND SUIT
+0x86B3 0x3020 # POSTAL MARK FACE
+0x86B4 0x260E # BLACK TELEPHONE
+0x86B5 0x3004 # JAPANESE INDUSTRIAL STANDARD SYMBOL
+0x86C7 0x261E # WHITE RIGHT POINTING INDEX
+0x86C8 0x261C # WHITE LEFT POINTING INDEX
+0x86C9 0x261D # WHITE UP POINTING INDEX
+0x86CA 0x261F # WHITE DOWN POINTING INDEX
+0x86CB 0x21C6 # LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+0x86CC 0x21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+0x86CD 0x21C5 # UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
+0x86CE 0xF860+0x2193+0x2191 # downwards arrow leftwards of upwards arrow
+0x86CF 0x21E8 # RIGHTWARDS WHITE ARROW
+0x86D0 0x21E6 # LEFTWARDS WHITE ARROW
+0x86D1 0x21E7 # UPWARDS WHITE ARROW
+0x86D2 0x21E9 # DOWNWARDS WHITE ARROW
+0x86D3 0x21E8+0xF87A # rightwards black arrow # or 0x27A1 BLACK RIGHTWARDS ARROW
+0x86D4 0x21E6+0xF87A # leftwards black arrow # or for Unicode 4.0, 0x2B05 LEFTWARDS BLACK ARROW
+0x86D5 0x21E7+0xF87A # upwards black arrow # or for Unicode 4.0, 0x2B06 UPWARDS BLACK ARROW
+0x86D6 0x21E9+0xF87A # downwards black arrow # or for Unicode 4.0, 0x2B07 DOWNWARDS BLACK ARROW
+0x8740 0x3230 # PARENTHESIZED IDEOGRAPH SUN
+0x8741 0x322A # PARENTHESIZED IDEOGRAPH MOON
+0x8742 0x322B # PARENTHESIZED IDEOGRAPH FIRE
+0x8743 0x322C # PARENTHESIZED IDEOGRAPH WATER
+0x8744 0x322D # PARENTHESIZED IDEOGRAPH WOOD
+0x8745 0x322E # PARENTHESIZED IDEOGRAPH METAL
+0x8746 0x322F # PARENTHESIZED IDEOGRAPH EARTH
+0x8747 0x3240 # PARENTHESIZED IDEOGRAPH FESTIVAL
+0x8748 0x3237 # PARENTHESIZED IDEOGRAPH CONGRATULATION
+0x8749 0x3242 # PARENTHESIZED IDEOGRAPH SELF
+0x874A 0x3243 # PARENTHESIZED IDEOGRAPH REACH
+0x874B 0x3239 # PARENTHESIZED IDEOGRAPH REPRESENT
+0x874C 0x323A # PARENTHESIZED IDEOGRAPH CALL
+0x874D 0x3231 # PARENTHESIZED IDEOGRAPH STOCK
+0x874E 0x323E # PARENTHESIZED IDEOGRAPH RESOURCE
+0x874F 0x3234 # PARENTHESIZED IDEOGRAPH NAME
+0x8750 0x3232 # PARENTHESIZED IDEOGRAPH HAVE
+0x8751 0x323B # PARENTHESIZED IDEOGRAPH STUDY
+0x8752 0x3236 # PARENTHESIZED IDEOGRAPH FINANCIAL
+0x8753 0x3233 # PARENTHESIZED IDEOGRAPH SOCIETY
+0x8754 0x3235 # PARENTHESIZED IDEOGRAPH SPECIAL
+0x8755 0x323C # PARENTHESIZED IDEOGRAPH SUPERVISE
+0x8756 0x323D # PARENTHESIZED IDEOGRAPH ENTERPRISE
+0x8757 0x323F # PARENTHESIZED IDEOGRAPH ALLIANCE
+0x8758 0x3238 # PARENTHESIZED IDEOGRAPH LABOR
+0x8791 0x5927+0x20DD # ideograph big + COMBINING ENCLOSING CIRCLE
+0x8792 0x5C0F+0x20DD # ideograph small + COMBINING ENCLOSING CIRCLE
+0x8793 0x32A4 # CIRCLED IDEOGRAPH HIGH
+0x8794 0x32A5 # CIRCLED IDEOGRAPH CENTRE
+0x8795 0x32A6 # CIRCLED IDEOGRAPH LOW
+0x8796 0x32A7 # CIRCLED IDEOGRAPH LEFT
+0x8797 0x32A8 # CIRCLED IDEOGRAPH RIGHT
+0x8798 0x32A9 # CIRCLED IDEOGRAPH MEDICINE
+0x8799 0x3296 # CIRCLED IDEOGRAPH FINANCIAL
+0x879A 0x329D # CIRCLED IDEOGRAPH EXCELLENT
+0x879B 0x3298 # CIRCLED IDEOGRAPH LABOR
+0x879C 0x329E # CIRCLED IDEOGRAPH PRINT
+0x879D 0x63A7+0x20DD # ideograph memo + COMBINING ENCLOSING CIRCLE
+0x879E 0x3299 # CIRCLED IDEOGRAPH SECRET
+0x879F 0x3349 # SQUARE MIRI
+0x87A0 0x3322 # SQUARE SENTI
+0x87A1 0x334D # SQUARE MEETORU
+0x87A2 0x3314 # SQUARE KIRO
+0x87A3 0x3316 # SQUARE KIROMEETORU
+0x87A4 0x3305 # SQUARE INTI
+0x87A5 0x3333 # SQUARE HUIITO
+0x87A6 0x334E # SQUARE YAADO
+0x87A7 0x3303 # SQUARE AARU
+0x87A8 0x3336 # SQUARE HEKUTAARU
+0x87A9 0x3318 # SQUARE GURAMU
+0x87AA 0x3315 # SQUARE KIROGURAMU
+0x87AB 0x3327 # SQUARE TON
+0x87AC 0x3351 # SQUARE RITTORU
+0x87AD 0x334A # SQUARE MIRIBAARU
+0x87AE 0x3339 # SQUARE HERUTU
+0x87AF 0x3357 # SQUARE WATTO
+0x87B0 0x330D # SQUARE KARORII
+0x87B1 0x3342 # SQUARE HOON
+0x87B2 0x3323 # SQUARE SENTO
+0x87B3 0x3326 # SQUARE DORU
+0x87B4 0x333B # SQUARE PEEZI
+0x87B5 0x332B # SQUARE PAASENTO
+0x87BD 0x3300 # SQUARE APAATO
+0x87BE 0x331E # SQUARE KOOPO
+0x87BF 0x332A # SQUARE HAITU
+0x87C0 0x3331 # SQUARE BIRU
+0x87C1 0x3347 # SQUARE MANSYON
+0x87E5 0x337E # SQUARE ERA NAME MEIZI
+0x87E6 0x337D # SQUARE ERA NAME TAISYOU
+0x87E7 0x337C # SQUARE ERA NAME SYOUWA
+0x87E8 0x337B # SQUARE ERA NAME HEISEI
+0x87FA 0x337F # SQUARE CORPORATION
+0x87FB 0xF862+0x6709+0x9650+0x4F1A+0x793E # square "limited company, ltd. [yuugen gaisha]"
+0x87FC 0xF862+0x8CA1+0x56E3+0x6CD5+0x4EBA # square "foundation [zaidan houjin]"
+0x8840 0x222E # CONTOUR INTEGRAL
+0x8841 0x221F # RIGHT ANGLE
+0x8842 0x22BF # RIGHT TRIANGLE
+0x8854 0x301D # REVERSED DOUBLE PRIME QUOTATION MARK
+0x8855 0x301F # LOW DOUBLE PRIME QUOTATION MARK
+0x8868 0x3094 # HIRAGANA LETTER VU
+0x886A 0x30F7 # KATAKANA LETTER VA
+0x886B 0x30F8 # KATAKANA LETTER VI
+0x886C 0x30F9 # KATAKANA LETTER VE
+0x886D 0x30FA # KATAKANA LETTER VO
+
+# Standard
+0x889F 0x4E9C # <CJK>
+0x88A0 0x5516 # <CJK>
+0x88A1 0x5A03 # <CJK>
+0x88A2 0x963F # <CJK>
+0x88A3 0x54C0 # <CJK>
+0x88A4 0x611B # <CJK>
+0x88A5 0x6328 # <CJK>
+0x88A6 0x59F6 # <CJK>
+0x88A7 0x9022 # <CJK>
+0x88A8 0x8475 # <CJK>
+0x88A9 0x831C # <CJK>
+0x88AA 0x7A50 # <CJK>
+0x88AB 0x60AA # <CJK>
+0x88AC 0x63E1 # <CJK>
+0x88AD 0x6E25 # <CJK>
+0x88AE 0x65ED # <CJK>
+0x88AF 0x8466 # <CJK>
+0x88B0 0x82A6 # <CJK>
+0x88B1 0x9BF5 # <CJK>
+0x88B2 0x6893 # <CJK>
+0x88B3 0x5727 # <CJK>
+0x88B4 0x65A1 # <CJK>
+0x88B5 0x6271 # <CJK>
+0x88B6 0x5B9B # <CJK>
+0x88B7 0x59D0 # <CJK>
+0x88B8 0x867B # <CJK>
+0x88B9 0x98F4 # <CJK>
+0x88BA 0x7D62 # <CJK>
+0x88BB 0x7DBE # <CJK>
+0x88BC 0x9B8E # <CJK>
+0x88BD 0x6216 # <CJK>
+0x88BE 0x7C9F # <CJK>
+0x88BF 0x88B7 # <CJK>
+0x88C0 0x5B89 # <CJK>
+0x88C1 0x5EB5 # <CJK>
+0x88C2 0x6309 # <CJK>
+0x88C3 0x6697 # <CJK>
+0x88C4 0x6848 # <CJK>
+0x88C5 0x95C7 # <CJK>
+0x88C6 0x978D # <CJK>
+0x88C7 0x674F # <CJK>
+0x88C8 0x4EE5 # <CJK>
+0x88C9 0x4F0A # <CJK>
+0x88CA 0x4F4D # <CJK>
+0x88CB 0x4F9D # <CJK>
+0x88CC 0x5049 # <CJK>
+0x88CD 0x56F2 # <CJK>
+0x88CE 0x5937 # <CJK>
+0x88CF 0x59D4 # <CJK>
+0x88D0 0x5A01 # <CJK>
+0x88D1 0x5C09 # <CJK>
+0x88D2 0x60DF # <CJK>
+0x88D3 0x610F # <CJK>
+0x88D4 0x6170 # <CJK>
+0x88D5 0x6613 # <CJK>
+0x88D6 0x6905 # <CJK>
+0x88D7 0x70BA # <CJK>
+0x88D8 0x754F # <CJK>
+0x88D9 0x7570 # <CJK>
+0x88DA 0x79FB # <CJK>
+0x88DB 0x7DAD # <CJK>
+0x88DC 0x7DEF # <CJK>
+0x88DD 0x80C3 # <CJK>
+0x88DE 0x840E # <CJK>
+0x88DF 0x8863 # <CJK>
+0x88E0 0x8B02 # <CJK>
+0x88E1 0x9055 # <CJK>
+0x88E2 0x907A # <CJK>
+0x88E3 0x533B # <CJK>
+0x88E4 0x4E95 # <CJK>
+0x88E5 0x4EA5 # <CJK>
+0x88E6 0x57DF # <CJK>
+0x88E7 0x80B2 # <CJK>
+0x88E8 0x90C1 # <CJK>
+0x88E9 0x78EF # <CJK>
+0x88EA 0x4E00 # <CJK>
+0x88EB 0x58F1 # <CJK>
+0x88EC 0x6EA2 # <CJK>
+0x88ED 0x9038 # <CJK>
+0x88EE 0x7A32 # <CJK>
+0x88EF 0x8328 # <CJK>
+0x88F0 0x828B # <CJK>
+0x88F1 0x9C2F # <CJK>
+0x88F2 0x5141 # <CJK>
+0x88F3 0x5370 # <CJK>
+0x88F4 0x54BD # <CJK>
+0x88F5 0x54E1 # <CJK>
+0x88F6 0x56E0 # <CJK>
+0x88F7 0x59FB # <CJK>
+0x88F8 0x5F15 # <CJK>
+0x88F9 0x98F2 # <CJK>
+0x88FA 0x6DEB # <CJK>
+0x88FB 0x80E4 # <CJK>
+0x88FC 0x852D # <CJK>
+0x8940 0x9662 # <CJK>
+0x8941 0x9670 # <CJK>
+0x8942 0x96A0 # <CJK>
+0x8943 0x97FB # <CJK>
+0x8944 0x540B # <CJK>
+0x8945 0x53F3 # <CJK>
+0x8946 0x5B87 # <CJK>
+0x8947 0x70CF # <CJK>
+0x8948 0x7FBD # <CJK>
+0x8949 0x8FC2 # <CJK>
+0x894A 0x96E8 # <CJK>
+0x894B 0x536F # <CJK>
+0x894C 0x9D5C # <CJK>
+0x894D 0x7ABA # <CJK>
+0x894E 0x4E11 # <CJK>
+0x894F 0x7893 # <CJK>
+0x8950 0x81FC # <CJK>
+0x8951 0x6E26 # <CJK>
+0x8952 0x5618 # <CJK>
+0x8953 0x5504 # <CJK>
+0x8954 0x6B1D # <CJK>
+0x8955 0x851A # <CJK>
+0x8956 0x9C3B # <CJK>
+0x8957 0x59E5 # <CJK>
+0x8958 0x53A9 # <CJK>
+0x8959 0x6D66 # <CJK>
+0x895A 0x74DC # <CJK>
+0x895B 0x958F # <CJK>
+0x895C 0x5642 # <CJK>
+0x895D 0x4E91 # <CJK>
+0x895E 0x904B # <CJK>
+0x895F 0x96F2 # <CJK>
+0x8960 0x834F # <CJK>
+0x8961 0x990C # <CJK>
+0x8962 0x53E1 # <CJK>
+0x8963 0x55B6 # <CJK>
+0x8964 0x5B30 # <CJK>
+0x8965 0x5F71 # <CJK>
+0x8966 0x6620 # <CJK>
+0x8967 0x66F3 # <CJK>
+0x8968 0x6804 # <CJK>
+0x8969 0x6C38 # <CJK>
+0x896A 0x6CF3 # <CJK>
+0x896B 0x6D29 # <CJK>
+0x896C 0x745B # <CJK>
+0x896D 0x76C8 # <CJK>
+0x896E 0x7A4E # <CJK>
+0x896F 0x9834 # <CJK>
+0x8970 0x82F1 # <CJK>
+0x8971 0x885B # <CJK>
+0x8972 0x8A60 # <CJK>
+0x8973 0x92ED # <CJK>
+0x8974 0x6DB2 # <CJK>
+0x8975 0x75AB # <CJK>
+0x8976 0x76CA # <CJK>
+0x8977 0x99C5 # <CJK>
+0x8978 0x60A6 # <CJK>
+0x8979 0x8B01 # <CJK>
+0x897A 0x8D8A # <CJK>
+0x897B 0x95B2 # <CJK>
+0x897C 0x698E # <CJK>
+0x897D 0x53AD # <CJK>
+0x897E 0x5186 # <CJK>
+0x8980 0x5712 # <CJK>
+0x8981 0x5830 # <CJK>
+0x8982 0x5944 # <CJK>
+0x8983 0x5BB4 # <CJK>
+0x8984 0x5EF6 # <CJK>
+0x8985 0x6028 # <CJK>
+0x8986 0x63A9 # <CJK>
+0x8987 0x63F4 # <CJK>
+0x8988 0x6CBF # <CJK>
+0x8989 0x6F14 # <CJK>
+0x898A 0x708E # <CJK>
+0x898B 0x7114 # <CJK>
+0x898C 0x7159 # <CJK>
+0x898D 0x71D5 # <CJK>
+0x898E 0x733F # <CJK>
+0x898F 0x7E01 # <CJK>
+0x8990 0x8276 # <CJK>
+0x8991 0x82D1 # <CJK>
+0x8992 0x8597 # <CJK>
+0x8993 0x9060 # <CJK>
+0x8994 0x925B # <CJK>
+0x8995 0x9D1B # <CJK>
+0x8996 0x5869 # <CJK>
+0x8997 0x65BC # <CJK>
+0x8998 0x6C5A # <CJK>
+0x8999 0x7525 # <CJK>
+0x899A 0x51F9 # <CJK>
+0x899B 0x592E # <CJK>
+0x899C 0x5965 # <CJK>
+0x899D 0x5F80 # <CJK>
+0x899E 0x5FDC # <CJK>
+0x899F 0x62BC # <CJK>
+0x89A0 0x65FA # <CJK>
+0x89A1 0x6A2A # <CJK>
+0x89A2 0x6B27 # <CJK>
+0x89A3 0x6BB4 # <CJK>
+0x89A4 0x738B # <CJK>
+0x89A5 0x7FC1 # <CJK>
+0x89A6 0x8956 # <CJK>
+0x89A7 0x9D2C # <CJK>
+0x89A8 0x9D0E # <CJK>
+0x89A9 0x9EC4 # <CJK>
+0x89AA 0x5CA1 # <CJK>
+0x89AB 0x6C96 # <CJK>
+0x89AC 0x837B # <CJK>
+0x89AD 0x5104 # <CJK>
+0x89AE 0x5C4B # <CJK>
+0x89AF 0x61B6 # <CJK>
+0x89B0 0x81C6 # <CJK>
+0x89B1 0x6876 # <CJK>
+0x89B2 0x7261 # <CJK>
+0x89B3 0x4E59 # <CJK>
+0x89B4 0x4FFA # <CJK>
+0x89B5 0x5378 # <CJK>
+0x89B6 0x6069 # <CJK>
+0x89B7 0x6E29 # <CJK>
+0x89B8 0x7A4F # <CJK>
+0x89B9 0x97F3 # <CJK>
+0x89BA 0x4E0B # <CJK>
+0x89BB 0x5316 # <CJK>
+0x89BC 0x4EEE # <CJK>
+0x89BD 0x4F55 # <CJK>
+0x89BE 0x4F3D # <CJK>
+0x89BF 0x4FA1 # <CJK>
+0x89C0 0x4F73 # <CJK>
+0x89C1 0x52A0 # <CJK>
+0x89C2 0x53EF # <CJK>
+0x89C3 0x5609 # <CJK>
+0x89C4 0x590F # <CJK>
+0x89C5 0x5AC1 # <CJK>
+0x89C6 0x5BB6 # <CJK>
+0x89C7 0x5BE1 # <CJK>
+0x89C8 0x79D1 # <CJK>
+0x89C9 0x6687 # <CJK>
+0x89CA 0x679C # <CJK>
+0x89CB 0x67B6 # <CJK>
+0x89CC 0x6B4C # <CJK>
+0x89CD 0x6CB3 # <CJK>
+0x89CE 0x706B # <CJK>
+0x89CF 0x73C2 # <CJK>
+0x89D0 0x798D # <CJK>
+0x89D1 0x79BE # <CJK>
+0x89D2 0x7A3C # <CJK>
+0x89D3 0x7B87 # <CJK>
+0x89D4 0x82B1 # <CJK>
+0x89D5 0x82DB # <CJK>
+0x89D6 0x8304 # <CJK>
+0x89D7 0x8377 # <CJK>
+0x89D8 0x83EF # <CJK>
+0x89D9 0x83D3 # <CJK>
+0x89DA 0x8766 # <CJK>
+0x89DB 0x8AB2 # <CJK>
+0x89DC 0x5629 # <CJK>
+0x89DD 0x8CA8 # <CJK>
+0x89DE 0x8FE6 # <CJK>
+0x89DF 0x904E # <CJK>
+0x89E0 0x971E # <CJK>
+0x89E1 0x868A # <CJK>
+0x89E2 0x4FC4 # <CJK>
+0x89E3 0x5CE8 # <CJK>
+0x89E4 0x6211 # <CJK>
+0x89E5 0x7259 # <CJK>
+0x89E6 0x753B # <CJK>
+0x89E7 0x81E5 # <CJK>
+0x89E8 0x82BD # <CJK>
+0x89E9 0x86FE # <CJK>
+0x89EA 0x8CC0 # <CJK>
+0x89EB 0x96C5 # <CJK>
+0x89EC 0x9913 # <CJK>
+0x89ED 0x99D5 # <CJK>
+0x89EE 0x4ECB # <CJK>
+0x89EF 0x4F1A # <CJK>
+0x89F0 0x89E3 # <CJK>
+0x89F1 0x56DE # <CJK>
+0x89F2 0x584A # <CJK>
+0x89F3 0x58CA # <CJK>
+0x89F4 0x5EFB # <CJK>
+0x89F5 0x5FEB # <CJK>
+0x89F6 0x602A # <CJK>
+0x89F7 0x6094 # <CJK>
+0x89F8 0x6062 # <CJK>
+0x89F9 0x61D0 # <CJK>
+0x89FA 0x6212 # <CJK>
+0x89FB 0x62D0 # <CJK>
+0x89FC 0x6539 # <CJK>
+0x8A40 0x9B41 # <CJK>
+0x8A41 0x6666 # <CJK>
+0x8A42 0x68B0 # <CJK>
+0x8A43 0x6D77 # <CJK>
+0x8A44 0x7070 # <CJK>
+0x8A45 0x754C # <CJK>
+0x8A46 0x7686 # <CJK>
+0x8A47 0x7D75 # <CJK>
+0x8A48 0x82A5 # <CJK>
+0x8A49 0x87F9 # <CJK>
+0x8A4A 0x958B # <CJK>
+0x8A4B 0x968E # <CJK>
+0x8A4C 0x8C9D # <CJK>
+0x8A4D 0x51F1 # <CJK>
+0x8A4E 0x52BE # <CJK>
+0x8A4F 0x5916 # <CJK>
+0x8A50 0x54B3 # <CJK>
+0x8A51 0x5BB3 # <CJK>
+0x8A52 0x5D16 # <CJK>
+0x8A53 0x6168 # <CJK>
+0x8A54 0x6982 # <CJK>
+0x8A55 0x6DAF # <CJK>
+0x8A56 0x788D # <CJK>
+0x8A57 0x84CB # <CJK>
+0x8A58 0x8857 # <CJK>
+0x8A59 0x8A72 # <CJK>
+0x8A5A 0x93A7 # <CJK>
+0x8A5B 0x9AB8 # <CJK>
+0x8A5C 0x6D6C # <CJK>
+0x8A5D 0x99A8 # <CJK>
+0x8A5E 0x86D9 # <CJK>
+0x8A5F 0x57A3 # <CJK>
+0x8A60 0x67FF # <CJK>
+0x8A61 0x86CE # <CJK>
+0x8A62 0x920E # <CJK>
+0x8A63 0x5283 # <CJK>
+0x8A64 0x5687 # <CJK>
+0x8A65 0x5404 # <CJK>
+0x8A66 0x5ED3 # <CJK>
+0x8A67 0x62E1 # <CJK>
+0x8A68 0x64B9 # <CJK>
+0x8A69 0x683C # <CJK>
+0x8A6A 0x6838 # <CJK>
+0x8A6B 0x6BBB # <CJK>
+0x8A6C 0x7372 # <CJK>
+0x8A6D 0x78BA # <CJK>
+0x8A6E 0x7A6B # <CJK>
+0x8A6F 0x899A # <CJK>
+0x8A70 0x89D2 # <CJK>
+0x8A71 0x8D6B # <CJK>
+0x8A72 0x8F03 # <CJK>
+0x8A73 0x90ED # <CJK>
+0x8A74 0x95A3 # <CJK>
+0x8A75 0x9694 # <CJK>
+0x8A76 0x9769 # <CJK>
+0x8A77 0x5B66 # <CJK>
+0x8A78 0x5CB3 # <CJK>
+0x8A79 0x697D # <CJK>
+0x8A7A 0x984D # <CJK>
+0x8A7B 0x984E # <CJK>
+0x8A7C 0x639B # <CJK>
+0x8A7D 0x7B20 # <CJK>
+0x8A7E 0x6A2B # <CJK>
+0x8A80 0x6A7F # <CJK>
+0x8A81 0x68B6 # <CJK>
+0x8A82 0x9C0D # <CJK>
+0x8A83 0x6F5F # <CJK>
+0x8A84 0x5272 # <CJK>
+0x8A85 0x559D # <CJK>
+0x8A86 0x6070 # <CJK>
+0x8A87 0x62EC # <CJK>
+0x8A88 0x6D3B # <CJK>
+0x8A89 0x6E07 # <CJK>
+0x8A8A 0x6ED1 # <CJK>
+0x8A8B 0x845B # <CJK>
+0x8A8C 0x8910 # <CJK>
+0x8A8D 0x8F44 # <CJK>
+0x8A8E 0x4E14 # <CJK>
+0x8A8F 0x9C39 # <CJK>
+0x8A90 0x53F6 # <CJK>
+0x8A91 0x691B # <CJK>
+0x8A92 0x6A3A # <CJK>
+0x8A93 0x9784 # <CJK>
+0x8A94 0x682A # <CJK>
+0x8A95 0x515C # <CJK>
+0x8A96 0x7AC3 # <CJK>
+0x8A97 0x84B2 # <CJK>
+0x8A98 0x91DC # <CJK>
+0x8A99 0x938C # <CJK>
+0x8A9A 0x565B # <CJK>
+0x8A9B 0x9D28 # <CJK>
+0x8A9C 0x6822 # <CJK>
+0x8A9D 0x8305 # <CJK>
+0x8A9E 0x8431 # <CJK>
+0x8A9F 0x7CA5 # <CJK>
+0x8AA0 0x5208 # <CJK>
+0x8AA1 0x82C5 # <CJK>
+0x8AA2 0x74E6 # <CJK>
+0x8AA3 0x4E7E # <CJK>
+0x8AA4 0x4F83 # <CJK>
+0x8AA5 0x51A0 # <CJK>
+0x8AA6 0x5BD2 # <CJK>
+0x8AA7 0x520A # <CJK>
+0x8AA8 0x52D8 # <CJK>
+0x8AA9 0x52E7 # <CJK>
+0x8AAA 0x5DFB # <CJK>
+0x8AAB 0x559A # <CJK>
+0x8AAC 0x582A # <CJK>
+0x8AAD 0x59E6 # <CJK>
+0x8AAE 0x5B8C # <CJK>
+0x8AAF 0x5B98 # <CJK>
+0x8AB0 0x5BDB # <CJK>
+0x8AB1 0x5E72 # <CJK>
+0x8AB2 0x5E79 # <CJK>
+0x8AB3 0x60A3 # <CJK>
+0x8AB4 0x611F # <CJK>
+0x8AB5 0x6163 # <CJK>
+0x8AB6 0x61BE # <CJK>
+0x8AB7 0x63DB # <CJK>
+0x8AB8 0x6562 # <CJK>
+0x8AB9 0x67D1 # <CJK>
+0x8ABA 0x6853 # <CJK>
+0x8ABB 0x68FA # <CJK>
+0x8ABC 0x6B3E # <CJK>
+0x8ABD 0x6B53 # <CJK>
+0x8ABE 0x6C57 # <CJK>
+0x8ABF 0x6F22 # <CJK>
+0x8AC0 0x6F97 # <CJK>
+0x8AC1 0x6F45 # <CJK>
+0x8AC2 0x74B0 # <CJK>
+0x8AC3 0x7518 # <CJK>
+0x8AC4 0x76E3 # <CJK>
+0x8AC5 0x770B # <CJK>
+0x8AC6 0x7AFF # <CJK>
+0x8AC7 0x7BA1 # <CJK>
+0x8AC8 0x7C21 # <CJK>
+0x8AC9 0x7DE9 # <CJK>
+0x8ACA 0x7F36 # <CJK>
+0x8ACB 0x7FF0 # <CJK>
+0x8ACC 0x809D # <CJK>
+0x8ACD 0x8266 # <CJK>
+0x8ACE 0x839E # <CJK>
+0x8ACF 0x89B3 # <CJK>
+0x8AD0 0x8ACC # <CJK>
+0x8AD1 0x8CAB # <CJK>
+0x8AD2 0x9084 # <CJK>
+0x8AD3 0x9451 # <CJK>
+0x8AD4 0x9593 # <CJK>
+0x8AD5 0x9591 # <CJK>
+0x8AD6 0x95A2 # <CJK>
+0x8AD7 0x9665 # <CJK>
+0x8AD8 0x97D3 # <CJK>
+0x8AD9 0x9928 # <CJK>
+0x8ADA 0x8218 # <CJK>
+0x8ADB 0x4E38 # <CJK>
+0x8ADC 0x542B # <CJK>
+0x8ADD 0x5CB8 # <CJK>
+0x8ADE 0x5DCC # <CJK>
+0x8ADF 0x73A9 # <CJK>
+0x8AE0 0x764C # <CJK>
+0x8AE1 0x773C # <CJK>
+0x8AE2 0x5CA9 # <CJK>
+0x8AE3 0x7FEB # <CJK>
+0x8AE4 0x8D0B # <CJK>
+0x8AE5 0x96C1 # <CJK>
+0x8AE6 0x9811 # <CJK>
+0x8AE7 0x9854 # <CJK>
+0x8AE8 0x9858 # <CJK>
+0x8AE9 0x4F01 # <CJK>
+0x8AEA 0x4F0E # <CJK>
+0x8AEB 0x5371 # <CJK>
+0x8AEC 0x559C # <CJK>
+0x8AED 0x5668 # <CJK>
+0x8AEE 0x57FA # <CJK>
+0x8AEF 0x5947 # <CJK>
+0x8AF0 0x5B09 # <CJK>
+0x8AF1 0x5BC4 # <CJK>
+0x8AF2 0x5C90 # <CJK>
+0x8AF3 0x5E0C # <CJK>
+0x8AF4 0x5E7E # <CJK>
+0x8AF5 0x5FCC # <CJK>
+0x8AF6 0x63EE # <CJK>
+0x8AF7 0x673A # <CJK>
+0x8AF8 0x65D7 # <CJK>
+0x8AF9 0x65E2 # <CJK>
+0x8AFA 0x671F # <CJK>
+0x8AFB 0x68CB # <CJK>
+0x8AFC 0x68C4 # <CJK>
+0x8B40 0x6A5F # <CJK>
+0x8B41 0x5E30 # <CJK>
+0x8B42 0x6BC5 # <CJK>
+0x8B43 0x6C17 # <CJK>
+0x8B44 0x6C7D # <CJK>
+0x8B45 0x757F # <CJK>
+0x8B46 0x7948 # <CJK>
+0x8B47 0x5B63 # <CJK>
+0x8B48 0x7A00 # <CJK>
+0x8B49 0x7D00 # <CJK>
+0x8B4A 0x5FBD # <CJK>
+0x8B4B 0x898F # <CJK>
+0x8B4C 0x8A18 # <CJK>
+0x8B4D 0x8CB4 # <CJK>
+0x8B4E 0x8D77 # <CJK>
+0x8B4F 0x8ECC # <CJK>
+0x8B50 0x8F1D # <CJK>
+0x8B51 0x98E2 # <CJK>
+0x8B52 0x9A0E # <CJK>
+0x8B53 0x9B3C # <CJK>
+0x8B54 0x4E80 # <CJK>
+0x8B55 0x507D # <CJK>
+0x8B56 0x5100 # <CJK>
+0x8B57 0x5993 # <CJK>
+0x8B58 0x5B9C # <CJK>
+0x8B59 0x622F # <CJK>
+0x8B5A 0x6280 # <CJK>
+0x8B5B 0x64EC # <CJK>
+0x8B5C 0x6B3A # <CJK>
+0x8B5D 0x72A0 # <CJK>
+0x8B5E 0x7591 # <CJK>
+0x8B5F 0x7947 # <CJK>
+0x8B60 0x7FA9 # <CJK>
+0x8B61 0x87FB # <CJK>
+0x8B62 0x8ABC # <CJK>
+0x8B63 0x8B70 # <CJK>
+0x8B64 0x63AC # <CJK>
+0x8B65 0x83CA # <CJK>
+0x8B66 0x97A0 # <CJK>
+0x8B67 0x5409 # <CJK>
+0x8B68 0x5403 # <CJK>
+0x8B69 0x55AB # <CJK>
+0x8B6A 0x6854 # <CJK>
+0x8B6B 0x6A58 # <CJK>
+0x8B6C 0x8A70 # <CJK>
+0x8B6D 0x7827 # <CJK>
+0x8B6E 0x6775 # <CJK>
+0x8B6F 0x9ECD # <CJK>
+0x8B70 0x5374 # <CJK>
+0x8B71 0x5BA2 # <CJK>
+0x8B72 0x811A # <CJK>
+0x8B73 0x8650 # <CJK>
+0x8B74 0x9006 # <CJK>
+0x8B75 0x4E18 # <CJK>
+0x8B76 0x4E45 # <CJK>
+0x8B77 0x4EC7 # <CJK>
+0x8B78 0x4F11 # <CJK>
+0x8B79 0x53CA # <CJK>
+0x8B7A 0x5438 # <CJK>
+0x8B7B 0x5BAE # <CJK>
+0x8B7C 0x5F13 # <CJK>
+0x8B7D 0x6025 # <CJK>
+0x8B7E 0x6551 # <CJK>
+0x8B80 0x673D # <CJK>
+0x8B81 0x6C42 # <CJK>
+0x8B82 0x6C72 # <CJK>
+0x8B83 0x6CE3 # <CJK>
+0x8B84 0x7078 # <CJK>
+0x8B85 0x7403 # <CJK>
+0x8B86 0x7A76 # <CJK>
+0x8B87 0x7AAE # <CJK>
+0x8B88 0x7B08 # <CJK>
+0x8B89 0x7D1A # <CJK>
+0x8B8A 0x7CFE # <CJK>
+0x8B8B 0x7D66 # <CJK>
+0x8B8C 0x65E7 # <CJK>
+0x8B8D 0x725B # <CJK>
+0x8B8E 0x53BB # <CJK>
+0x8B8F 0x5C45 # <CJK>
+0x8B90 0x5DE8 # <CJK>
+0x8B91 0x62D2 # <CJK>
+0x8B92 0x62E0 # <CJK>
+0x8B93 0x6319 # <CJK>
+0x8B94 0x6E20 # <CJK>
+0x8B95 0x865A # <CJK>
+0x8B96 0x8A31 # <CJK>
+0x8B97 0x8DDD # <CJK>
+0x8B98 0x92F8 # <CJK>
+0x8B99 0x6F01 # <CJK>
+0x8B9A 0x79A6 # <CJK>
+0x8B9B 0x9B5A # <CJK>
+0x8B9C 0x4EA8 # <CJK>
+0x8B9D 0x4EAB # <CJK>
+0x8B9E 0x4EAC # <CJK>
+0x8B9F 0x4F9B # <CJK>
+0x8BA0 0x4FA0 # <CJK>
+0x8BA1 0x50D1 # <CJK>
+0x8BA2 0x5147 # <CJK>
+0x8BA3 0x7AF6 # <CJK>
+0x8BA4 0x5171 # <CJK>
+0x8BA5 0x51F6 # <CJK>
+0x8BA6 0x5354 # <CJK>
+0x8BA7 0x5321 # <CJK>
+0x8BA8 0x537F # <CJK>
+0x8BA9 0x53EB # <CJK>
+0x8BAA 0x55AC # <CJK>
+0x8BAB 0x5883 # <CJK>
+0x8BAC 0x5CE1 # <CJK>
+0x8BAD 0x5F37 # <CJK>
+0x8BAE 0x5F4A # <CJK>
+0x8BAF 0x602F # <CJK>
+0x8BB0 0x6050 # <CJK>
+0x8BB1 0x606D # <CJK>
+0x8BB2 0x631F # <CJK>
+0x8BB3 0x6559 # <CJK>
+0x8BB4 0x6A4B # <CJK>
+0x8BB5 0x6CC1 # <CJK>
+0x8BB6 0x72C2 # <CJK>
+0x8BB7 0x72ED # <CJK>
+0x8BB8 0x77EF # <CJK>
+0x8BB9 0x80F8 # <CJK>
+0x8BBA 0x8105 # <CJK>
+0x8BBB 0x8208 # <CJK>
+0x8BBC 0x854E # <CJK>
+0x8BBD 0x90F7 # <CJK>
+0x8BBE 0x93E1 # <CJK>
+0x8BBF 0x97FF # <CJK>
+0x8BC0 0x9957 # <CJK>
+0x8BC1 0x9A5A # <CJK>
+0x8BC2 0x4EF0 # <CJK>
+0x8BC3 0x51DD # <CJK>
+0x8BC4 0x5C2D # <CJK>
+0x8BC5 0x6681 # <CJK>
+0x8BC6 0x696D # <CJK>
+0x8BC7 0x5C40 # <CJK>
+0x8BC8 0x66F2 # <CJK>
+0x8BC9 0x6975 # <CJK>
+0x8BCA 0x7389 # <CJK>
+0x8BCB 0x6850 # <CJK>
+0x8BCC 0x7C81 # <CJK>
+0x8BCD 0x50C5 # <CJK>
+0x8BCE 0x52E4 # <CJK>
+0x8BCF 0x5747 # <CJK>
+0x8BD0 0x5DFE # <CJK>
+0x8BD1 0x9326 # <CJK>
+0x8BD2 0x65A4 # <CJK>
+0x8BD3 0x6B23 # <CJK>
+0x8BD4 0x6B3D # <CJK>
+0x8BD5 0x7434 # <CJK>
+0x8BD6 0x7981 # <CJK>
+0x8BD7 0x79BD # <CJK>
+0x8BD8 0x7B4B # <CJK>
+0x8BD9 0x7DCA # <CJK>
+0x8BDA 0x82B9 # <CJK>
+0x8BDB 0x83CC # <CJK>
+0x8BDC 0x887F # <CJK>
+0x8BDD 0x895F # <CJK>
+0x8BDE 0x8B39 # <CJK>
+0x8BDF 0x8FD1 # <CJK>
+0x8BE0 0x91D1 # <CJK>
+0x8BE1 0x541F # <CJK>
+0x8BE2 0x9280 # <CJK>
+0x8BE3 0x4E5D # <CJK>
+0x8BE4 0x5036 # <CJK>
+0x8BE5 0x53E5 # <CJK>
+0x8BE6 0x533A # <CJK>
+0x8BE7 0x72D7 # <CJK>
+0x8BE8 0x7396 # <CJK>
+0x8BE9 0x77E9 # <CJK>
+0x8BEA 0x82E6 # <CJK>
+0x8BEB 0x8EAF # <CJK>
+0x8BEC 0x99C6 # <CJK>
+0x8BED 0x99C8 # <CJK>
+0x8BEE 0x99D2 # <CJK>
+0x8BEF 0x5177 # <CJK>
+0x8BF0 0x611A # <CJK>
+0x8BF1 0x865E # <CJK>
+0x8BF2 0x55B0 # <CJK>
+0x8BF3 0x7A7A # <CJK>
+0x8BF4 0x5076 # <CJK>
+0x8BF5 0x5BD3 # <CJK>
+0x8BF6 0x9047 # <CJK>
+0x8BF7 0x9685 # <CJK>
+0x8BF8 0x4E32 # <CJK>
+0x8BF9 0x6ADB # <CJK>
+0x8BFA 0x91E7 # <CJK>
+0x8BFB 0x5C51 # <CJK>
+0x8BFC 0x5C48 # <CJK>
+0x8C40 0x6398 # <CJK>
+0x8C41 0x7A9F # <CJK>
+0x8C42 0x6C93 # <CJK>
+0x8C43 0x9774 # <CJK>
+0x8C44 0x8F61 # <CJK>
+0x8C45 0x7AAA # <CJK>
+0x8C46 0x718A # <CJK>
+0x8C47 0x9688 # <CJK>
+0x8C48 0x7C82 # <CJK>
+0x8C49 0x6817 # <CJK>
+0x8C4A 0x7E70 # <CJK>
+0x8C4B 0x6851 # <CJK>
+0x8C4C 0x936C # <CJK>
+0x8C4D 0x52F2 # <CJK>
+0x8C4E 0x541B # <CJK>
+0x8C4F 0x85AB # <CJK>
+0x8C50 0x8A13 # <CJK>
+0x8C51 0x7FA4 # <CJK>
+0x8C52 0x8ECD # <CJK>
+0x8C53 0x90E1 # <CJK>
+0x8C54 0x5366 # <CJK>
+0x8C55 0x8888 # <CJK>
+0x8C56 0x7941 # <CJK>
+0x8C57 0x4FC2 # <CJK>
+0x8C58 0x50BE # <CJK>
+0x8C59 0x5211 # <CJK>
+0x8C5A 0x5144 # <CJK>
+0x8C5B 0x5553 # <CJK>
+0x8C5C 0x572D # <CJK>
+0x8C5D 0x73EA # <CJK>
+0x8C5E 0x578B # <CJK>
+0x8C5F 0x5951 # <CJK>
+0x8C60 0x5F62 # <CJK>
+0x8C61 0x5F84 # <CJK>
+0x8C62 0x6075 # <CJK>
+0x8C63 0x6176 # <CJK>
+0x8C64 0x6167 # <CJK>
+0x8C65 0x61A9 # <CJK>
+0x8C66 0x63B2 # <CJK>
+0x8C67 0x643A # <CJK>
+0x8C68 0x656C # <CJK>
+0x8C69 0x666F # <CJK>
+0x8C6A 0x6842 # <CJK>
+0x8C6B 0x6E13 # <CJK>
+0x8C6C 0x7566 # <CJK>
+0x8C6D 0x7A3D # <CJK>
+0x8C6E 0x7CFB # <CJK>
+0x8C6F 0x7D4C # <CJK>
+0x8C70 0x7D99 # <CJK>
+0x8C71 0x7E4B # <CJK>
+0x8C72 0x7F6B # <CJK>
+0x8C73 0x830E # <CJK>
+0x8C74 0x834A # <CJK>
+0x8C75 0x86CD # <CJK>
+0x8C76 0x8A08 # <CJK>
+0x8C77 0x8A63 # <CJK>
+0x8C78 0x8B66 # <CJK>
+0x8C79 0x8EFD # <CJK>
+0x8C7A 0x981A # <CJK>
+0x8C7B 0x9D8F # <CJK>
+0x8C7C 0x82B8 # <CJK>
+0x8C7D 0x8FCE # <CJK>
+0x8C7E 0x9BE8 # <CJK>
+0x8C80 0x5287 # <CJK>
+0x8C81 0x621F # <CJK>
+0x8C82 0x6483 # <CJK>
+0x8C83 0x6FC0 # <CJK>
+0x8C84 0x9699 # <CJK>
+0x8C85 0x6841 # <CJK>
+0x8C86 0x5091 # <CJK>
+0x8C87 0x6B20 # <CJK>
+0x8C88 0x6C7A # <CJK>
+0x8C89 0x6F54 # <CJK>
+0x8C8A 0x7A74 # <CJK>
+0x8C8B 0x7D50 # <CJK>
+0x8C8C 0x8840 # <CJK>
+0x8C8D 0x8A23 # <CJK>
+0x8C8E 0x6708 # <CJK>
+0x8C8F 0x4EF6 # <CJK>
+0x8C90 0x5039 # <CJK>
+0x8C91 0x5026 # <CJK>
+0x8C92 0x5065 # <CJK>
+0x8C93 0x517C # <CJK>
+0x8C94 0x5238 # <CJK>
+0x8C95 0x5263 # <CJK>
+0x8C96 0x55A7 # <CJK>
+0x8C97 0x570F # <CJK>
+0x8C98 0x5805 # <CJK>
+0x8C99 0x5ACC # <CJK>
+0x8C9A 0x5EFA # <CJK>
+0x8C9B 0x61B2 # <CJK>
+0x8C9C 0x61F8 # <CJK>
+0x8C9D 0x62F3 # <CJK>
+0x8C9E 0x6372 # <CJK>
+0x8C9F 0x691C # <CJK>
+0x8CA0 0x6A29 # <CJK>
+0x8CA1 0x727D # <CJK>
+0x8CA2 0x72AC # <CJK>
+0x8CA3 0x732E # <CJK>
+0x8CA4 0x7814 # <CJK>
+0x8CA5 0x786F # <CJK>
+0x8CA6 0x7D79 # <CJK>
+0x8CA7 0x770C # <CJK>
+0x8CA8 0x80A9 # <CJK>
+0x8CA9 0x898B # <CJK>
+0x8CAA 0x8B19 # <CJK>
+0x8CAB 0x8CE2 # <CJK>
+0x8CAC 0x8ED2 # <CJK>
+0x8CAD 0x9063 # <CJK>
+0x8CAE 0x9375 # <CJK>
+0x8CAF 0x967A # <CJK>
+0x8CB0 0x9855 # <CJK>
+0x8CB1 0x9A13 # <CJK>
+0x8CB2 0x9E78 # <CJK>
+0x8CB3 0x5143 # <CJK>
+0x8CB4 0x539F # <CJK>
+0x8CB5 0x53B3 # <CJK>
+0x8CB6 0x5E7B # <CJK>
+0x8CB7 0x5F26 # <CJK>
+0x8CB8 0x6E1B # <CJK>
+0x8CB9 0x6E90 # <CJK>
+0x8CBA 0x7384 # <CJK>
+0x8CBB 0x73FE # <CJK>
+0x8CBC 0x7D43 # <CJK>
+0x8CBD 0x8237 # <CJK>
+0x8CBE 0x8A00 # <CJK>
+0x8CBF 0x8AFA # <CJK>
+0x8CC0 0x9650 # <CJK>
+0x8CC1 0x4E4E # <CJK>
+0x8CC2 0x500B # <CJK>
+0x8CC3 0x53E4 # <CJK>
+0x8CC4 0x547C # <CJK>
+0x8CC5 0x56FA # <CJK>
+0x8CC6 0x59D1 # <CJK>
+0x8CC7 0x5B64 # <CJK>
+0x8CC8 0x5DF1 # <CJK>
+0x8CC9 0x5EAB # <CJK>
+0x8CCA 0x5F27 # <CJK>
+0x8CCB 0x6238 # <CJK>
+0x8CCC 0x6545 # <CJK>
+0x8CCD 0x67AF # <CJK>
+0x8CCE 0x6E56 # <CJK>
+0x8CCF 0x72D0 # <CJK>
+0x8CD0 0x7CCA # <CJK>
+0x8CD1 0x88B4 # <CJK>
+0x8CD2 0x80A1 # <CJK>
+0x8CD3 0x80E1 # <CJK>
+0x8CD4 0x83F0 # <CJK>
+0x8CD5 0x864E # <CJK>
+0x8CD6 0x8A87 # <CJK>
+0x8CD7 0x8DE8 # <CJK>
+0x8CD8 0x9237 # <CJK>
+0x8CD9 0x96C7 # <CJK>
+0x8CDA 0x9867 # <CJK>
+0x8CDB 0x9F13 # <CJK>
+0x8CDC 0x4E94 # <CJK>
+0x8CDD 0x4E92 # <CJK>
+0x8CDE 0x4F0D # <CJK>
+0x8CDF 0x5348 # <CJK>
+0x8CE0 0x5449 # <CJK>
+0x8CE1 0x543E # <CJK>
+0x8CE2 0x5A2F # <CJK>
+0x8CE3 0x5F8C # <CJK>
+0x8CE4 0x5FA1 # <CJK>
+0x8CE5 0x609F # <CJK>
+0x8CE6 0x68A7 # <CJK>
+0x8CE7 0x6A8E # <CJK>
+0x8CE8 0x745A # <CJK>
+0x8CE9 0x7881 # <CJK>
+0x8CEA 0x8A9E # <CJK>
+0x8CEB 0x8AA4 # <CJK>
+0x8CEC 0x8B77 # <CJK>
+0x8CED 0x9190 # <CJK>
+0x8CEE 0x4E5E # <CJK>
+0x8CEF 0x9BC9 # <CJK>
+0x8CF0 0x4EA4 # <CJK>
+0x8CF1 0x4F7C # <CJK>
+0x8CF2 0x4FAF # <CJK>
+0x8CF3 0x5019 # <CJK>
+0x8CF4 0x5016 # <CJK>
+0x8CF5 0x5149 # <CJK>
+0x8CF6 0x516C # <CJK>
+0x8CF7 0x529F # <CJK>
+0x8CF8 0x52B9 # <CJK>
+0x8CF9 0x52FE # <CJK>
+0x8CFA 0x539A # <CJK>
+0x8CFB 0x53E3 # <CJK>
+0x8CFC 0x5411 # <CJK>
+0x8D40 0x540E # <CJK>
+0x8D41 0x5589 # <CJK>
+0x8D42 0x5751 # <CJK>
+0x8D43 0x57A2 # <CJK>
+0x8D44 0x597D # <CJK>
+0x8D45 0x5B54 # <CJK>
+0x8D46 0x5B5D # <CJK>
+0x8D47 0x5B8F # <CJK>
+0x8D48 0x5DE5 # <CJK>
+0x8D49 0x5DE7 # <CJK>
+0x8D4A 0x5DF7 # <CJK>
+0x8D4B 0x5E78 # <CJK>
+0x8D4C 0x5E83 # <CJK>
+0x8D4D 0x5E9A # <CJK>
+0x8D4E 0x5EB7 # <CJK>
+0x8D4F 0x5F18 # <CJK>
+0x8D50 0x6052 # <CJK>
+0x8D51 0x614C # <CJK>
+0x8D52 0x6297 # <CJK>
+0x8D53 0x62D8 # <CJK>
+0x8D54 0x63A7 # <CJK>
+0x8D55 0x653B # <CJK>
+0x8D56 0x6602 # <CJK>
+0x8D57 0x6643 # <CJK>
+0x8D58 0x66F4 # <CJK>
+0x8D59 0x676D # <CJK>
+0x8D5A 0x6821 # <CJK>
+0x8D5B 0x6897 # <CJK>
+0x8D5C 0x69CB # <CJK>
+0x8D5D 0x6C5F # <CJK>
+0x8D5E 0x6D2A # <CJK>
+0x8D5F 0x6D69 # <CJK>
+0x8D60 0x6E2F # <CJK>
+0x8D61 0x6E9D # <CJK>
+0x8D62 0x7532 # <CJK>
+0x8D63 0x7687 # <CJK>
+0x8D64 0x786C # <CJK>
+0x8D65 0x7A3F # <CJK>
+0x8D66 0x7CE0 # <CJK>
+0x8D67 0x7D05 # <CJK>
+0x8D68 0x7D18 # <CJK>
+0x8D69 0x7D5E # <CJK>
+0x8D6A 0x7DB1 # <CJK>
+0x8D6B 0x8015 # <CJK>
+0x8D6C 0x8003 # <CJK>
+0x8D6D 0x80AF # <CJK>
+0x8D6E 0x80B1 # <CJK>
+0x8D6F 0x8154 # <CJK>
+0x8D70 0x818F # <CJK>
+0x8D71 0x822A # <CJK>
+0x8D72 0x8352 # <CJK>
+0x8D73 0x884C # <CJK>
+0x8D74 0x8861 # <CJK>
+0x8D75 0x8B1B # <CJK>
+0x8D76 0x8CA2 # <CJK>
+0x8D77 0x8CFC # <CJK>
+0x8D78 0x90CA # <CJK>
+0x8D79 0x9175 # <CJK>
+0x8D7A 0x9271 # <CJK>
+0x8D7B 0x783F # <CJK>
+0x8D7C 0x92FC # <CJK>
+0x8D7D 0x95A4 # <CJK>
+0x8D7E 0x964D # <CJK>
+0x8D80 0x9805 # <CJK>
+0x8D81 0x9999 # <CJK>
+0x8D82 0x9AD8 # <CJK>
+0x8D83 0x9D3B # <CJK>
+0x8D84 0x525B # <CJK>
+0x8D85 0x52AB # <CJK>
+0x8D86 0x53F7 # <CJK>
+0x8D87 0x5408 # <CJK>
+0x8D88 0x58D5 # <CJK>
+0x8D89 0x62F7 # <CJK>
+0x8D8A 0x6FE0 # <CJK>
+0x8D8B 0x8C6A # <CJK>
+0x8D8C 0x8F5F # <CJK>
+0x8D8D 0x9EB9 # <CJK>
+0x8D8E 0x514B # <CJK>
+0x8D8F 0x523B # <CJK>
+0x8D90 0x544A # <CJK>
+0x8D91 0x56FD # <CJK>
+0x8D92 0x7A40 # <CJK>
+0x8D93 0x9177 # <CJK>
+0x8D94 0x9D60 # <CJK>
+0x8D95 0x9ED2 # <CJK>
+0x8D96 0x7344 # <CJK>
+0x8D97 0x6F09 # <CJK>
+0x8D98 0x8170 # <CJK>
+0x8D99 0x7511 # <CJK>
+0x8D9A 0x5FFD # <CJK>
+0x8D9B 0x60DA # <CJK>
+0x8D9C 0x9AA8 # <CJK>
+0x8D9D 0x72DB # <CJK>
+0x8D9E 0x8FBC # <CJK>
+0x8D9F 0x6B64 # <CJK>
+0x8DA0 0x9803 # <CJK>
+0x8DA1 0x4ECA # <CJK>
+0x8DA2 0x56F0 # <CJK>
+0x8DA3 0x5764 # <CJK>
+0x8DA4 0x58BE # <CJK>
+0x8DA5 0x5A5A # <CJK>
+0x8DA6 0x6068 # <CJK>
+0x8DA7 0x61C7 # <CJK>
+0x8DA8 0x660F # <CJK>
+0x8DA9 0x6606 # <CJK>
+0x8DAA 0x6839 # <CJK>
+0x8DAB 0x68B1 # <CJK>
+0x8DAC 0x6DF7 # <CJK>
+0x8DAD 0x75D5 # <CJK>
+0x8DAE 0x7D3A # <CJK>
+0x8DAF 0x826E # <CJK>
+0x8DB0 0x9B42 # <CJK>
+0x8DB1 0x4E9B # <CJK>
+0x8DB2 0x4F50 # <CJK>
+0x8DB3 0x53C9 # <CJK>
+0x8DB4 0x5506 # <CJK>
+0x8DB5 0x5D6F # <CJK>
+0x8DB6 0x5DE6 # <CJK>
+0x8DB7 0x5DEE # <CJK>
+0x8DB8 0x67FB # <CJK>
+0x8DB9 0x6C99 # <CJK>
+0x8DBA 0x7473 # <CJK>
+0x8DBB 0x7802 # <CJK>
+0x8DBC 0x8A50 # <CJK>
+0x8DBD 0x9396 # <CJK>
+0x8DBE 0x88DF # <CJK>
+0x8DBF 0x5750 # <CJK>
+0x8DC0 0x5EA7 # <CJK>
+0x8DC1 0x632B # <CJK>
+0x8DC2 0x50B5 # <CJK>
+0x8DC3 0x50AC # <CJK>
+0x8DC4 0x518D # <CJK>
+0x8DC5 0x6700 # <CJK>
+0x8DC6 0x54C9 # <CJK>
+0x8DC7 0x585E # <CJK>
+0x8DC8 0x59BB # <CJK>
+0x8DC9 0x5BB0 # <CJK>
+0x8DCA 0x5F69 # <CJK>
+0x8DCB 0x624D # <CJK>
+0x8DCC 0x63A1 # <CJK>
+0x8DCD 0x683D # <CJK>
+0x8DCE 0x6B73 # <CJK>
+0x8DCF 0x6E08 # <CJK>
+0x8DD0 0x707D # <CJK>
+0x8DD1 0x91C7 # <CJK>
+0x8DD2 0x7280 # <CJK>
+0x8DD3 0x7815 # <CJK>
+0x8DD4 0x7826 # <CJK>
+0x8DD5 0x796D # <CJK>
+0x8DD6 0x658E # <CJK>
+0x8DD7 0x7D30 # <CJK>
+0x8DD8 0x83DC # <CJK>
+0x8DD9 0x88C1 # <CJK>
+0x8DDA 0x8F09 # <CJK>
+0x8DDB 0x969B # <CJK>
+0x8DDC 0x5264 # <CJK>
+0x8DDD 0x5728 # <CJK>
+0x8DDE 0x6750 # <CJK>
+0x8DDF 0x7F6A # <CJK>
+0x8DE0 0x8CA1 # <CJK>
+0x8DE1 0x51B4 # <CJK>
+0x8DE2 0x5742 # <CJK>
+0x8DE3 0x962A # <CJK>
+0x8DE4 0x583A # <CJK>
+0x8DE5 0x698A # <CJK>
+0x8DE6 0x80B4 # <CJK>
+0x8DE7 0x54B2 # <CJK>
+0x8DE8 0x5D0E # <CJK>
+0x8DE9 0x57FC # <CJK>
+0x8DEA 0x7895 # <CJK>
+0x8DEB 0x9DFA # <CJK>
+0x8DEC 0x4F5C # <CJK>
+0x8DED 0x524A # <CJK>
+0x8DEE 0x548B # <CJK>
+0x8DEF 0x643E # <CJK>
+0x8DF0 0x6628 # <CJK>
+0x8DF1 0x6714 # <CJK>
+0x8DF2 0x67F5 # <CJK>
+0x8DF3 0x7A84 # <CJK>
+0x8DF4 0x7B56 # <CJK>
+0x8DF5 0x7D22 # <CJK>
+0x8DF6 0x932F # <CJK>
+0x8DF7 0x685C # <CJK>
+0x8DF8 0x9BAD # <CJK>
+0x8DF9 0x7B39 # <CJK>
+0x8DFA 0x5319 # <CJK>
+0x8DFB 0x518A # <CJK>
+0x8DFC 0x5237 # <CJK>
+0x8E40 0x5BDF # <CJK>
+0x8E41 0x62F6 # <CJK>
+0x8E42 0x64AE # <CJK>
+0x8E43 0x64E6 # <CJK>
+0x8E44 0x672D # <CJK>
+0x8E45 0x6BBA # <CJK>
+0x8E46 0x85A9 # <CJK>
+0x8E47 0x96D1 # <CJK>
+0x8E48 0x7690 # <CJK>
+0x8E49 0x9BD6 # <CJK>
+0x8E4A 0x634C # <CJK>
+0x8E4B 0x9306 # <CJK>
+0x8E4C 0x9BAB # <CJK>
+0x8E4D 0x76BF # <CJK>
+0x8E4E 0x6652 # <CJK>
+0x8E4F 0x4E09 # <CJK>
+0x8E50 0x5098 # <CJK>
+0x8E51 0x53C2 # <CJK>
+0x8E52 0x5C71 # <CJK>
+0x8E53 0x60E8 # <CJK>
+0x8E54 0x6492 # <CJK>
+0x8E55 0x6563 # <CJK>
+0x8E56 0x685F # <CJK>
+0x8E57 0x71E6 # <CJK>
+0x8E58 0x73CA # <CJK>
+0x8E59 0x7523 # <CJK>
+0x8E5A 0x7B97 # <CJK>
+0x8E5B 0x7E82 # <CJK>
+0x8E5C 0x8695 # <CJK>
+0x8E5D 0x8B83 # <CJK>
+0x8E5E 0x8CDB # <CJK>
+0x8E5F 0x9178 # <CJK>
+0x8E60 0x9910 # <CJK>
+0x8E61 0x65AC # <CJK>
+0x8E62 0x66AB # <CJK>
+0x8E63 0x6B8B # <CJK>
+0x8E64 0x4ED5 # <CJK>
+0x8E65 0x4ED4 # <CJK>
+0x8E66 0x4F3A # <CJK>
+0x8E67 0x4F7F # <CJK>
+0x8E68 0x523A # <CJK>
+0x8E69 0x53F8 # <CJK>
+0x8E6A 0x53F2 # <CJK>
+0x8E6B 0x55E3 # <CJK>
+0x8E6C 0x56DB # <CJK>
+0x8E6D 0x58EB # <CJK>
+0x8E6E 0x59CB # <CJK>
+0x8E6F 0x59C9 # <CJK>
+0x8E70 0x59FF # <CJK>
+0x8E71 0x5B50 # <CJK>
+0x8E72 0x5C4D # <CJK>
+0x8E73 0x5E02 # <CJK>
+0x8E74 0x5E2B # <CJK>
+0x8E75 0x5FD7 # <CJK>
+0x8E76 0x601D # <CJK>
+0x8E77 0x6307 # <CJK>
+0x8E78 0x652F # <CJK>
+0x8E79 0x5B5C # <CJK>
+0x8E7A 0x65AF # <CJK>
+0x8E7B 0x65BD # <CJK>
+0x8E7C 0x65E8 # <CJK>
+0x8E7D 0x679D # <CJK>
+0x8E7E 0x6B62 # <CJK>
+0x8E80 0x6B7B # <CJK>
+0x8E81 0x6C0F # <CJK>
+0x8E82 0x7345 # <CJK>
+0x8E83 0x7949 # <CJK>
+0x8E84 0x79C1 # <CJK>
+0x8E85 0x7CF8 # <CJK>
+0x8E86 0x7D19 # <CJK>
+0x8E87 0x7D2B # <CJK>
+0x8E88 0x80A2 # <CJK>
+0x8E89 0x8102 # <CJK>
+0x8E8A 0x81F3 # <CJK>
+0x8E8B 0x8996 # <CJK>
+0x8E8C 0x8A5E # <CJK>
+0x8E8D 0x8A69 # <CJK>
+0x8E8E 0x8A66 # <CJK>
+0x8E8F 0x8A8C # <CJK>
+0x8E90 0x8AEE # <CJK>
+0x8E91 0x8CC7 # <CJK>
+0x8E92 0x8CDC # <CJK>
+0x8E93 0x96CC # <CJK>
+0x8E94 0x98FC # <CJK>
+0x8E95 0x6B6F # <CJK>
+0x8E96 0x4E8B # <CJK>
+0x8E97 0x4F3C # <CJK>
+0x8E98 0x4F8D # <CJK>
+0x8E99 0x5150 # <CJK>
+0x8E9A 0x5B57 # <CJK>
+0x8E9B 0x5BFA # <CJK>
+0x8E9C 0x6148 # <CJK>
+0x8E9D 0x6301 # <CJK>
+0x8E9E 0x6642 # <CJK>
+0x8E9F 0x6B21 # <CJK>
+0x8EA0 0x6ECB # <CJK>
+0x8EA1 0x6CBB # <CJK>
+0x8EA2 0x723E # <CJK>
+0x8EA3 0x74BD # <CJK>
+0x8EA4 0x75D4 # <CJK>
+0x8EA5 0x78C1 # <CJK>
+0x8EA6 0x793A # <CJK>
+0x8EA7 0x800C # <CJK>
+0x8EA8 0x8033 # <CJK>
+0x8EA9 0x81EA # <CJK>
+0x8EAA 0x8494 # <CJK>
+0x8EAB 0x8F9E # <CJK>
+0x8EAC 0x6C50 # <CJK>
+0x8EAD 0x9E7F # <CJK>
+0x8EAE 0x5F0F # <CJK>
+0x8EAF 0x8B58 # <CJK>
+0x8EB0 0x9D2B # <CJK>
+0x8EB1 0x7AFA # <CJK>
+0x8EB2 0x8EF8 # <CJK>
+0x8EB3 0x5B8D # <CJK>
+0x8EB4 0x96EB # <CJK>
+0x8EB5 0x4E03 # <CJK>
+0x8EB6 0x53F1 # <CJK>
+0x8EB7 0x57F7 # <CJK>
+0x8EB8 0x5931 # <CJK>
+0x8EB9 0x5AC9 # <CJK>
+0x8EBA 0x5BA4 # <CJK>
+0x8EBB 0x6089 # <CJK>
+0x8EBC 0x6E7F # <CJK>
+0x8EBD 0x6F06 # <CJK>
+0x8EBE 0x75BE # <CJK>
+0x8EBF 0x8CEA # <CJK>
+0x8EC0 0x5B9F # <CJK>
+0x8EC1 0x8500 # <CJK>
+0x8EC2 0x7BE0 # <CJK>
+0x8EC3 0x5072 # <CJK>
+0x8EC4 0x67F4 # <CJK>
+0x8EC5 0x829D # <CJK>
+0x8EC6 0x5C61 # <CJK>
+0x8EC7 0x854A # <CJK>
+0x8EC8 0x7E1E # <CJK>
+0x8EC9 0x820E # <CJK>
+0x8ECA 0x5199 # <CJK>
+0x8ECB 0x5C04 # <CJK>
+0x8ECC 0x6368 # <CJK>
+0x8ECD 0x8D66 # <CJK>
+0x8ECE 0x659C # <CJK>
+0x8ECF 0x716E # <CJK>
+0x8ED0 0x793E # <CJK>
+0x8ED1 0x7D17 # <CJK>
+0x8ED2 0x8005 # <CJK>
+0x8ED3 0x8B1D # <CJK>
+0x8ED4 0x8ECA # <CJK>
+0x8ED5 0x906E # <CJK>
+0x8ED6 0x86C7 # <CJK>
+0x8ED7 0x90AA # <CJK>
+0x8ED8 0x501F # <CJK>
+0x8ED9 0x52FA # <CJK>
+0x8EDA 0x5C3A # <CJK>
+0x8EDB 0x6753 # <CJK>
+0x8EDC 0x707C # <CJK>
+0x8EDD 0x7235 # <CJK>
+0x8EDE 0x914C # <CJK>
+0x8EDF 0x91C8 # <CJK>
+0x8EE0 0x932B # <CJK>
+0x8EE1 0x82E5 # <CJK>
+0x8EE2 0x5BC2 # <CJK>
+0x8EE3 0x5F31 # <CJK>
+0x8EE4 0x60F9 # <CJK>
+0x8EE5 0x4E3B # <CJK>
+0x8EE6 0x53D6 # <CJK>
+0x8EE7 0x5B88 # <CJK>
+0x8EE8 0x624B # <CJK>
+0x8EE9 0x6731 # <CJK>
+0x8EEA 0x6B8A # <CJK>
+0x8EEB 0x72E9 # <CJK>
+0x8EEC 0x73E0 # <CJK>
+0x8EED 0x7A2E # <CJK>
+0x8EEE 0x816B # <CJK>
+0x8EEF 0x8DA3 # <CJK>
+0x8EF0 0x9152 # <CJK>
+0x8EF1 0x9996 # <CJK>
+0x8EF2 0x5112 # <CJK>
+0x8EF3 0x53D7 # <CJK>
+0x8EF4 0x546A # <CJK>
+0x8EF5 0x5BFF # <CJK>
+0x8EF6 0x6388 # <CJK>
+0x8EF7 0x6A39 # <CJK>
+0x8EF8 0x7DAC # <CJK>
+0x8EF9 0x9700 # <CJK>
+0x8EFA 0x56DA # <CJK>
+0x8EFB 0x53CE # <CJK>
+0x8EFC 0x5468 # <CJK>
+0x8F40 0x5B97 # <CJK>
+0x8F41 0x5C31 # <CJK>
+0x8F42 0x5DDE # <CJK>
+0x8F43 0x4FEE # <CJK>
+0x8F44 0x6101 # <CJK>
+0x8F45 0x62FE # <CJK>
+0x8F46 0x6D32 # <CJK>
+0x8F47 0x79C0 # <CJK>
+0x8F48 0x79CB # <CJK>
+0x8F49 0x7D42 # <CJK>
+0x8F4A 0x7E4D # <CJK>
+0x8F4B 0x7FD2 # <CJK>
+0x8F4C 0x81ED # <CJK>
+0x8F4D 0x821F # <CJK>
+0x8F4E 0x8490 # <CJK>
+0x8F4F 0x8846 # <CJK>
+0x8F50 0x8972 # <CJK>
+0x8F51 0x8B90 # <CJK>
+0x8F52 0x8E74 # <CJK>
+0x8F53 0x8F2F # <CJK>
+0x8F54 0x9031 # <CJK>
+0x8F55 0x914B # <CJK>
+0x8F56 0x916C # <CJK>
+0x8F57 0x96C6 # <CJK>
+0x8F58 0x919C # <CJK>
+0x8F59 0x4EC0 # <CJK>
+0x8F5A 0x4F4F # <CJK>
+0x8F5B 0x5145 # <CJK>
+0x8F5C 0x5341 # <CJK>
+0x8F5D 0x5F93 # <CJK>
+0x8F5E 0x620E # <CJK>
+0x8F5F 0x67D4 # <CJK>
+0x8F60 0x6C41 # <CJK>
+0x8F61 0x6E0B # <CJK>
+0x8F62 0x7363 # <CJK>
+0x8F63 0x7E26 # <CJK>
+0x8F64 0x91CD # <CJK>
+0x8F65 0x9283 # <CJK>
+0x8F66 0x53D4 # <CJK>
+0x8F67 0x5919 # <CJK>
+0x8F68 0x5BBF # <CJK>
+0x8F69 0x6DD1 # <CJK>
+0x8F6A 0x795D # <CJK>
+0x8F6B 0x7E2E # <CJK>
+0x8F6C 0x7C9B # <CJK>
+0x8F6D 0x587E # <CJK>
+0x8F6E 0x719F # <CJK>
+0x8F6F 0x51FA # <CJK>
+0x8F70 0x8853 # <CJK>
+0x8F71 0x8FF0 # <CJK>
+0x8F72 0x4FCA # <CJK>
+0x8F73 0x5CFB # <CJK>
+0x8F74 0x6625 # <CJK>
+0x8F75 0x77AC # <CJK>
+0x8F76 0x7AE3 # <CJK>
+0x8F77 0x821C # <CJK>
+0x8F78 0x99FF # <CJK>
+0x8F79 0x51C6 # <CJK>
+0x8F7A 0x5FAA # <CJK>
+0x8F7B 0x65EC # <CJK>
+0x8F7C 0x696F # <CJK>
+0x8F7D 0x6B89 # <CJK>
+0x8F7E 0x6DF3 # <CJK>
+0x8F80 0x6E96 # <CJK>
+0x8F81 0x6F64 # <CJK>
+0x8F82 0x76FE # <CJK>
+0x8F83 0x7D14 # <CJK>
+0x8F84 0x5DE1 # <CJK>
+0x8F85 0x9075 # <CJK>
+0x8F86 0x9187 # <CJK>
+0x8F87 0x9806 # <CJK>
+0x8F88 0x51E6 # <CJK>
+0x8F89 0x521D # <CJK>
+0x8F8A 0x6240 # <CJK>
+0x8F8B 0x6691 # <CJK>
+0x8F8C 0x66D9 # <CJK>
+0x8F8D 0x6E1A # <CJK>
+0x8F8E 0x5EB6 # <CJK>
+0x8F8F 0x7DD2 # <CJK>
+0x8F90 0x7F72 # <CJK>
+0x8F91 0x66F8 # <CJK>
+0x8F92 0x85AF # <CJK>
+0x8F93 0x85F7 # <CJK>
+0x8F94 0x8AF8 # <CJK>
+0x8F95 0x52A9 # <CJK>
+0x8F96 0x53D9 # <CJK>
+0x8F97 0x5973 # <CJK>
+0x8F98 0x5E8F # <CJK>
+0x8F99 0x5F90 # <CJK>
+0x8F9A 0x6055 # <CJK>
+0x8F9B 0x92E4 # <CJK>
+0x8F9C 0x9664 # <CJK>
+0x8F9D 0x50B7 # <CJK>
+0x8F9E 0x511F # <CJK>
+0x8F9F 0x52DD # <CJK>
+0x8FA0 0x5320 # <CJK>
+0x8FA1 0x5347 # <CJK>
+0x8FA2 0x53EC # <CJK>
+0x8FA3 0x54E8 # <CJK>
+0x8FA4 0x5546 # <CJK>
+0x8FA5 0x5531 # <CJK>
+0x8FA6 0x5617 # <CJK>
+0x8FA7 0x5968 # <CJK>
+0x8FA8 0x59BE # <CJK>
+0x8FA9 0x5A3C # <CJK>
+0x8FAA 0x5BB5 # <CJK>
+0x8FAB 0x5C06 # <CJK>
+0x8FAC 0x5C0F # <CJK>
+0x8FAD 0x5C11 # <CJK>
+0x8FAE 0x5C1A # <CJK>
+0x8FAF 0x5E84 # <CJK>
+0x8FB0 0x5E8A # <CJK>
+0x8FB1 0x5EE0 # <CJK>
+0x8FB2 0x5F70 # <CJK>
+0x8FB3 0x627F # <CJK>
+0x8FB4 0x6284 # <CJK>
+0x8FB5 0x62DB # <CJK>
+0x8FB6 0x638C # <CJK>
+0x8FB7 0x6377 # <CJK>
+0x8FB8 0x6607 # <CJK>
+0x8FB9 0x660C # <CJK>
+0x8FBA 0x662D # <CJK>
+0x8FBB 0x6676 # <CJK>
+0x8FBC 0x677E # <CJK>
+0x8FBD 0x68A2 # <CJK>
+0x8FBE 0x6A1F # <CJK>
+0x8FBF 0x6A35 # <CJK>
+0x8FC0 0x6CBC # <CJK>
+0x8FC1 0x6D88 # <CJK>
+0x8FC2 0x6E09 # <CJK>
+0x8FC3 0x6E58 # <CJK>
+0x8FC4 0x713C # <CJK>
+0x8FC5 0x7126 # <CJK>
+0x8FC6 0x7167 # <CJK>
+0x8FC7 0x75C7 # <CJK>
+0x8FC8 0x7701 # <CJK>
+0x8FC9 0x785D # <CJK>
+0x8FCA 0x7901 # <CJK>
+0x8FCB 0x7965 # <CJK>
+0x8FCC 0x79F0 # <CJK>
+0x8FCD 0x7AE0 # <CJK>
+0x8FCE 0x7B11 # <CJK>
+0x8FCF 0x7CA7 # <CJK>
+0x8FD0 0x7D39 # <CJK>
+0x8FD1 0x8096 # <CJK>
+0x8FD2 0x83D6 # <CJK>
+0x8FD3 0x848B # <CJK>
+0x8FD4 0x8549 # <CJK>
+0x8FD5 0x885D # <CJK>
+0x8FD6 0x88F3 # <CJK>
+0x8FD7 0x8A1F # <CJK>
+0x8FD8 0x8A3C # <CJK>
+0x8FD9 0x8A54 # <CJK>
+0x8FDA 0x8A73 # <CJK>
+0x8FDB 0x8C61 # <CJK>
+0x8FDC 0x8CDE # <CJK>
+0x8FDD 0x91A4 # <CJK>
+0x8FDE 0x9266 # <CJK>
+0x8FDF 0x937E # <CJK>
+0x8FE0 0x9418 # <CJK>
+0x8FE1 0x969C # <CJK>
+0x8FE2 0x9798 # <CJK>
+0x8FE3 0x4E0A # <CJK>
+0x8FE4 0x4E08 # <CJK>
+0x8FE5 0x4E1E # <CJK>
+0x8FE6 0x4E57 # <CJK>
+0x8FE7 0x5197 # <CJK>
+0x8FE8 0x5270 # <CJK>
+0x8FE9 0x57CE # <CJK>
+0x8FEA 0x5834 # <CJK>
+0x8FEB 0x58CC # <CJK>
+0x8FEC 0x5B22 # <CJK>
+0x8FED 0x5E38 # <CJK>
+0x8FEE 0x60C5 # <CJK>
+0x8FEF 0x64FE # <CJK>
+0x8FF0 0x6761 # <CJK>
+0x8FF1 0x6756 # <CJK>
+0x8FF2 0x6D44 # <CJK>
+0x8FF3 0x72B6 # <CJK>
+0x8FF4 0x7573 # <CJK>
+0x8FF5 0x7A63 # <CJK>
+0x8FF6 0x84B8 # <CJK>
+0x8FF7 0x8B72 # <CJK>
+0x8FF8 0x91B8 # <CJK>
+0x8FF9 0x9320 # <CJK>
+0x8FFA 0x5631 # <CJK>
+0x8FFB 0x57F4 # <CJK>
+0x8FFC 0x98FE # <CJK>
+0x9040 0x62ED # <CJK>
+0x9041 0x690D # <CJK>
+0x9042 0x6B96 # <CJK>
+0x9043 0x71ED # <CJK>
+0x9044 0x7E54 # <CJK>
+0x9045 0x8077 # <CJK>
+0x9046 0x8272 # <CJK>
+0x9047 0x89E6 # <CJK>
+0x9048 0x98DF # <CJK>
+0x9049 0x8755 # <CJK>
+0x904A 0x8FB1 # <CJK>
+0x904B 0x5C3B # <CJK>
+0x904C 0x4F38 # <CJK>
+0x904D 0x4FE1 # <CJK>
+0x904E 0x4FB5 # <CJK>
+0x904F 0x5507 # <CJK>
+0x9050 0x5A20 # <CJK>
+0x9051 0x5BDD # <CJK>
+0x9052 0x5BE9 # <CJK>
+0x9053 0x5FC3 # <CJK>
+0x9054 0x614E # <CJK>
+0x9055 0x632F # <CJK>
+0x9056 0x65B0 # <CJK>
+0x9057 0x664B # <CJK>
+0x9058 0x68EE # <CJK>
+0x9059 0x699B # <CJK>
+0x905A 0x6D78 # <CJK>
+0x905B 0x6DF1 # <CJK>
+0x905C 0x7533 # <CJK>
+0x905D 0x75B9 # <CJK>
+0x905E 0x771F # <CJK>
+0x905F 0x795E # <CJK>
+0x9060 0x79E6 # <CJK>
+0x9061 0x7D33 # <CJK>
+0x9062 0x81E3 # <CJK>
+0x9063 0x82AF # <CJK>
+0x9064 0x85AA # <CJK>
+0x9065 0x89AA # <CJK>
+0x9066 0x8A3A # <CJK>
+0x9067 0x8EAB # <CJK>
+0x9068 0x8F9B # <CJK>
+0x9069 0x9032 # <CJK>
+0x906A 0x91DD # <CJK>
+0x906B 0x9707 # <CJK>
+0x906C 0x4EBA # <CJK>
+0x906D 0x4EC1 # <CJK>
+0x906E 0x5203 # <CJK>
+0x906F 0x5875 # <CJK>
+0x9070 0x58EC # <CJK>
+0x9071 0x5C0B # <CJK>
+0x9072 0x751A # <CJK>
+0x9073 0x5C3D # <CJK>
+0x9074 0x814E # <CJK>
+0x9075 0x8A0A # <CJK>
+0x9076 0x8FC5 # <CJK>
+0x9077 0x9663 # <CJK>
+0x9078 0x976D # <CJK>
+0x9079 0x7B25 # <CJK>
+0x907A 0x8ACF # <CJK>
+0x907B 0x9808 # <CJK>
+0x907C 0x9162 # <CJK>
+0x907D 0x56F3 # <CJK>
+0x907E 0x53A8 # <CJK>
+0x9080 0x9017 # <CJK>
+0x9081 0x5439 # <CJK>
+0x9082 0x5782 # <CJK>
+0x9083 0x5E25 # <CJK>
+0x9084 0x63A8 # <CJK>
+0x9085 0x6C34 # <CJK>
+0x9086 0x708A # <CJK>
+0x9087 0x7761 # <CJK>
+0x9088 0x7C8B # <CJK>
+0x9089 0x7FE0 # <CJK>
+0x908A 0x8870 # <CJK>
+0x908B 0x9042 # <CJK>
+0x908C 0x9154 # <CJK>
+0x908D 0x9310 # <CJK>
+0x908E 0x9318 # <CJK>
+0x908F 0x968F # <CJK>
+0x9090 0x745E # <CJK>
+0x9091 0x9AC4 # <CJK>
+0x9092 0x5D07 # <CJK>
+0x9093 0x5D69 # <CJK>
+0x9094 0x6570 # <CJK>
+0x9095 0x67A2 # <CJK>
+0x9096 0x8DA8 # <CJK>
+0x9097 0x96DB # <CJK>
+0x9098 0x636E # <CJK>
+0x9099 0x6749 # <CJK>
+0x909A 0x6919 # <CJK>
+0x909B 0x83C5 # <CJK>
+0x909C 0x9817 # <CJK>
+0x909D 0x96C0 # <CJK>
+0x909E 0x88FE # <CJK>
+0x909F 0x6F84 # <CJK>
+0x90A0 0x647A # <CJK>
+0x90A1 0x5BF8 # <CJK>
+0x90A2 0x4E16 # <CJK>
+0x90A3 0x702C # <CJK>
+0x90A4 0x755D # <CJK>
+0x90A5 0x662F # <CJK>
+0x90A6 0x51C4 # <CJK>
+0x90A7 0x5236 # <CJK>
+0x90A8 0x52E2 # <CJK>
+0x90A9 0x59D3 # <CJK>
+0x90AA 0x5F81 # <CJK>
+0x90AB 0x6027 # <CJK>
+0x90AC 0x6210 # <CJK>
+0x90AD 0x653F # <CJK>
+0x90AE 0x6574 # <CJK>
+0x90AF 0x661F # <CJK>
+0x90B0 0x6674 # <CJK>
+0x90B1 0x68F2 # <CJK>
+0x90B2 0x6816 # <CJK>
+0x90B3 0x6B63 # <CJK>
+0x90B4 0x6E05 # <CJK>
+0x90B5 0x7272 # <CJK>
+0x90B6 0x751F # <CJK>
+0x90B7 0x76DB # <CJK>
+0x90B8 0x7CBE # <CJK>
+0x90B9 0x8056 # <CJK>
+0x90BA 0x58F0 # <CJK>
+0x90BB 0x88FD # <CJK>
+0x90BC 0x897F # <CJK>
+0x90BD 0x8AA0 # <CJK>
+0x90BE 0x8A93 # <CJK>
+0x90BF 0x8ACB # <CJK>
+0x90C0 0x901D # <CJK>
+0x90C1 0x9192 # <CJK>
+0x90C2 0x9752 # <CJK>
+0x90C3 0x9759 # <CJK>
+0x90C4 0x6589 # <CJK>
+0x90C5 0x7A0E # <CJK>
+0x90C6 0x8106 # <CJK>
+0x90C7 0x96BB # <CJK>
+0x90C8 0x5E2D # <CJK>
+0x90C9 0x60DC # <CJK>
+0x90CA 0x621A # <CJK>
+0x90CB 0x65A5 # <CJK>
+0x90CC 0x6614 # <CJK>
+0x90CD 0x6790 # <CJK>
+0x90CE 0x77F3 # <CJK>
+0x90CF 0x7A4D # <CJK>
+0x90D0 0x7C4D # <CJK>
+0x90D1 0x7E3E # <CJK>
+0x90D2 0x810A # <CJK>
+0x90D3 0x8CAC # <CJK>
+0x90D4 0x8D64 # <CJK>
+0x90D5 0x8DE1 # <CJK>
+0x90D6 0x8E5F # <CJK>
+0x90D7 0x78A9 # <CJK>
+0x90D8 0x5207 # <CJK>
+0x90D9 0x62D9 # <CJK>
+0x90DA 0x63A5 # <CJK>
+0x90DB 0x6442 # <CJK>
+0x90DC 0x6298 # <CJK>
+0x90DD 0x8A2D # <CJK>
+0x90DE 0x7A83 # <CJK>
+0x90DF 0x7BC0 # <CJK>
+0x90E0 0x8AAC # <CJK>
+0x90E1 0x96EA # <CJK>
+0x90E2 0x7D76 # <CJK>
+0x90E3 0x820C # <CJK>
+0x90E4 0x8749 # <CJK>
+0x90E5 0x4ED9 # <CJK>
+0x90E6 0x5148 # <CJK>
+0x90E7 0x5343 # <CJK>
+0x90E8 0x5360 # <CJK>
+0x90E9 0x5BA3 # <CJK>
+0x90EA 0x5C02 # <CJK>
+0x90EB 0x5C16 # <CJK>
+0x90EC 0x5DDD # <CJK>
+0x90ED 0x6226 # <CJK>
+0x90EE 0x6247 # <CJK>
+0x90EF 0x64B0 # <CJK>
+0x90F0 0x6813 # <CJK>
+0x90F1 0x6834 # <CJK>
+0x90F2 0x6CC9 # <CJK>
+0x90F3 0x6D45 # <CJK>
+0x90F4 0x6D17 # <CJK>
+0x90F5 0x67D3 # <CJK>
+0x90F6 0x6F5C # <CJK>
+0x90F7 0x714E # <CJK>
+0x90F8 0x717D # <CJK>
+0x90F9 0x65CB # <CJK>
+0x90FA 0x7A7F # <CJK>
+0x90FB 0x7BAD # <CJK>
+0x90FC 0x7DDA # <CJK>
+0x9140 0x7E4A # <CJK>
+0x9141 0x7FA8 # <CJK>
+0x9142 0x817A # <CJK>
+0x9143 0x821B # <CJK>
+0x9144 0x8239 # <CJK>
+0x9145 0x85A6 # <CJK>
+0x9146 0x8A6E # <CJK>
+0x9147 0x8CCE # <CJK>
+0x9148 0x8DF5 # <CJK>
+0x9149 0x9078 # <CJK>
+0x914A 0x9077 # <CJK>
+0x914B 0x92AD # <CJK>
+0x914C 0x9291 # <CJK>
+0x914D 0x9583 # <CJK>
+0x914E 0x9BAE # <CJK>
+0x914F 0x524D # <CJK>
+0x9150 0x5584 # <CJK>
+0x9151 0x6F38 # <CJK>
+0x9152 0x7136 # <CJK>
+0x9153 0x5168 # <CJK>
+0x9154 0x7985 # <CJK>
+0x9155 0x7E55 # <CJK>
+0x9156 0x81B3 # <CJK>
+0x9157 0x7CCE # <CJK>
+0x9158 0x564C # <CJK>
+0x9159 0x5851 # <CJK>
+0x915A 0x5CA8 # <CJK>
+0x915B 0x63AA # <CJK>
+0x915C 0x66FE # <CJK>
+0x915D 0x66FD # <CJK>
+0x915E 0x695A # <CJK>
+0x915F 0x72D9 # <CJK>
+0x9160 0x758F # <CJK>
+0x9161 0x758E # <CJK>
+0x9162 0x790E # <CJK>
+0x9163 0x7956 # <CJK>
+0x9164 0x79DF # <CJK>
+0x9165 0x7C97 # <CJK>
+0x9166 0x7D20 # <CJK>
+0x9167 0x7D44 # <CJK>
+0x9168 0x8607 # <CJK>
+0x9169 0x8A34 # <CJK>
+0x916A 0x963B # <CJK>
+0x916B 0x9061 # <CJK>
+0x916C 0x9F20 # <CJK>
+0x916D 0x50E7 # <CJK>
+0x916E 0x5275 # <CJK>
+0x916F 0x53CC # <CJK>
+0x9170 0x53E2 # <CJK>
+0x9171 0x5009 # <CJK>
+0x9172 0x55AA # <CJK>
+0x9173 0x58EE # <CJK>
+0x9174 0x594F # <CJK>
+0x9175 0x723D # <CJK>
+0x9176 0x5B8B # <CJK>
+0x9177 0x5C64 # <CJK>
+0x9178 0x531D # <CJK>
+0x9179 0x60E3 # <CJK>
+0x917A 0x60F3 # <CJK>
+0x917B 0x635C # <CJK>
+0x917C 0x6383 # <CJK>
+0x917D 0x633F # <CJK>
+0x917E 0x63BB # <CJK>
+0x9180 0x64CD # <CJK>
+0x9181 0x65E9 # <CJK>
+0x9182 0x66F9 # <CJK>
+0x9183 0x5DE3 # <CJK>
+0x9184 0x69CD # <CJK>
+0x9185 0x69FD # <CJK>
+0x9186 0x6F15 # <CJK>
+0x9187 0x71E5 # <CJK>
+0x9188 0x4E89 # <CJK>
+0x9189 0x75E9 # <CJK>
+0x918A 0x76F8 # <CJK>
+0x918B 0x7A93 # <CJK>
+0x918C 0x7CDF # <CJK>
+0x918D 0x7DCF # <CJK>
+0x918E 0x7D9C # <CJK>
+0x918F 0x8061 # <CJK>
+0x9190 0x8349 # <CJK>
+0x9191 0x8358 # <CJK>
+0x9192 0x846C # <CJK>
+0x9193 0x84BC # <CJK>
+0x9194 0x85FB # <CJK>
+0x9195 0x88C5 # <CJK>
+0x9196 0x8D70 # <CJK>
+0x9197 0x9001 # <CJK>
+0x9198 0x906D # <CJK>
+0x9199 0x9397 # <CJK>
+0x919A 0x971C # <CJK>
+0x919B 0x9A12 # <CJK>
+0x919C 0x50CF # <CJK>
+0x919D 0x5897 # <CJK>
+0x919E 0x618E # <CJK>
+0x919F 0x81D3 # <CJK>
+0x91A0 0x8535 # <CJK>
+0x91A1 0x8D08 # <CJK>
+0x91A2 0x9020 # <CJK>
+0x91A3 0x4FC3 # <CJK>
+0x91A4 0x5074 # <CJK>
+0x91A5 0x5247 # <CJK>
+0x91A6 0x5373 # <CJK>
+0x91A7 0x606F # <CJK>
+0x91A8 0x6349 # <CJK>
+0x91A9 0x675F # <CJK>
+0x91AA 0x6E2C # <CJK>
+0x91AB 0x8DB3 # <CJK>
+0x91AC 0x901F # <CJK>
+0x91AD 0x4FD7 # <CJK>
+0x91AE 0x5C5E # <CJK>
+0x91AF 0x8CCA # <CJK>
+0x91B0 0x65CF # <CJK>
+0x91B1 0x7D9A # <CJK>
+0x91B2 0x5352 # <CJK>
+0x91B3 0x8896 # <CJK>
+0x91B4 0x5176 # <CJK>
+0x91B5 0x63C3 # <CJK>
+0x91B6 0x5B58 # <CJK>
+0x91B7 0x5B6B # <CJK>
+0x91B8 0x5C0A # <CJK>
+0x91B9 0x640D # <CJK>
+0x91BA 0x6751 # <CJK>
+0x91BB 0x905C # <CJK>
+0x91BC 0x4ED6 # <CJK>
+0x91BD 0x591A # <CJK>
+0x91BE 0x592A # <CJK>
+0x91BF 0x6C70 # <CJK>
+0x91C0 0x8A51 # <CJK>
+0x91C1 0x553E # <CJK>
+0x91C2 0x5815 # <CJK>
+0x91C3 0x59A5 # <CJK>
+0x91C4 0x60F0 # <CJK>
+0x91C5 0x6253 # <CJK>
+0x91C6 0x67C1 # <CJK>
+0x91C7 0x8235 # <CJK>
+0x91C8 0x6955 # <CJK>
+0x91C9 0x9640 # <CJK>
+0x91CA 0x99C4 # <CJK>
+0x91CB 0x9A28 # <CJK>
+0x91CC 0x4F53 # <CJK>
+0x91CD 0x5806 # <CJK>
+0x91CE 0x5BFE # <CJK>
+0x91CF 0x8010 # <CJK>
+0x91D0 0x5CB1 # <CJK>
+0x91D1 0x5E2F # <CJK>
+0x91D2 0x5F85 # <CJK>
+0x91D3 0x6020 # <CJK>
+0x91D4 0x614B # <CJK>
+0x91D5 0x6234 # <CJK>
+0x91D6 0x66FF # <CJK>
+0x91D7 0x6CF0 # <CJK>
+0x91D8 0x6EDE # <CJK>
+0x91D9 0x80CE # <CJK>
+0x91DA 0x817F # <CJK>
+0x91DB 0x82D4 # <CJK>
+0x91DC 0x888B # <CJK>
+0x91DD 0x8CB8 # <CJK>
+0x91DE 0x9000 # <CJK>
+0x91DF 0x902E # <CJK>
+0x91E0 0x968A # <CJK>
+0x91E1 0x9EDB # <CJK>
+0x91E2 0x9BDB # <CJK>
+0x91E3 0x4EE3 # <CJK>
+0x91E4 0x53F0 # <CJK>
+0x91E5 0x5927 # <CJK>
+0x91E6 0x7B2C # <CJK>
+0x91E7 0x918D # <CJK>
+0x91E8 0x984C # <CJK>
+0x91E9 0x9DF9 # <CJK>
+0x91EA 0x6EDD # <CJK>
+0x91EB 0x7027 # <CJK>
+0x91EC 0x5353 # <CJK>
+0x91ED 0x5544 # <CJK>
+0x91EE 0x5B85 # <CJK>
+0x91EF 0x6258 # <CJK>
+0x91F0 0x629E # <CJK>
+0x91F1 0x62D3 # <CJK>
+0x91F2 0x6CA2 # <CJK>
+0x91F3 0x6FEF # <CJK>
+0x91F4 0x7422 # <CJK>
+0x91F5 0x8A17 # <CJK>
+0x91F6 0x9438 # <CJK>
+0x91F7 0x6FC1 # <CJK>
+0x91F8 0x8AFE # <CJK>
+0x91F9 0x8338 # <CJK>
+0x91FA 0x51E7 # <CJK>
+0x91FB 0x86F8 # <CJK>
+0x91FC 0x53EA # <CJK>
+0x9240 0x53E9 # <CJK>
+0x9241 0x4F46 # <CJK>
+0x9242 0x9054 # <CJK>
+0x9243 0x8FB0 # <CJK>
+0x9244 0x596A # <CJK>
+0x9245 0x8131 # <CJK>
+0x9246 0x5DFD # <CJK>
+0x9247 0x7AEA # <CJK>
+0x9248 0x8FBF # <CJK>
+0x9249 0x68DA # <CJK>
+0x924A 0x8C37 # <CJK>
+0x924B 0x72F8 # <CJK>
+0x924C 0x9C48 # <CJK>
+0x924D 0x6A3D # <CJK>
+0x924E 0x8AB0 # <CJK>
+0x924F 0x4E39 # <CJK>
+0x9250 0x5358 # <CJK>
+0x9251 0x5606 # <CJK>
+0x9252 0x5766 # <CJK>
+0x9253 0x62C5 # <CJK>
+0x9254 0x63A2 # <CJK>
+0x9255 0x65E6 # <CJK>
+0x9256 0x6B4E # <CJK>
+0x9257 0x6DE1 # <CJK>
+0x9258 0x6E5B # <CJK>
+0x9259 0x70AD # <CJK>
+0x925A 0x77ED # <CJK>
+0x925B 0x7AEF # <CJK>
+0x925C 0x7BAA # <CJK>
+0x925D 0x7DBB # <CJK>
+0x925E 0x803D # <CJK>
+0x925F 0x80C6 # <CJK>
+0x9260 0x86CB # <CJK>
+0x9261 0x8A95 # <CJK>
+0x9262 0x935B # <CJK>
+0x9263 0x56E3 # <CJK>
+0x9264 0x58C7 # <CJK>
+0x9265 0x5F3E # <CJK>
+0x9266 0x65AD # <CJK>
+0x9267 0x6696 # <CJK>
+0x9268 0x6A80 # <CJK>
+0x9269 0x6BB5 # <CJK>
+0x926A 0x7537 # <CJK>
+0x926B 0x8AC7 # <CJK>
+0x926C 0x5024 # <CJK>
+0x926D 0x77E5 # <CJK>
+0x926E 0x5730 # <CJK>
+0x926F 0x5F1B # <CJK>
+0x9270 0x6065 # <CJK>
+0x9271 0x667A # <CJK>
+0x9272 0x6C60 # <CJK>
+0x9273 0x75F4 # <CJK>
+0x9274 0x7A1A # <CJK>
+0x9275 0x7F6E # <CJK>
+0x9276 0x81F4 # <CJK>
+0x9277 0x8718 # <CJK>
+0x9278 0x9045 # <CJK>
+0x9279 0x99B3 # <CJK>
+0x927A 0x7BC9 # <CJK>
+0x927B 0x755C # <CJK>
+0x927C 0x7AF9 # <CJK>
+0x927D 0x7B51 # <CJK>
+0x927E 0x84C4 # <CJK>
+0x9280 0x9010 # <CJK>
+0x9281 0x79E9 # <CJK>
+0x9282 0x7A92 # <CJK>
+0x9283 0x8336 # <CJK>
+0x9284 0x5AE1 # <CJK>
+0x9285 0x7740 # <CJK>
+0x9286 0x4E2D # <CJK>
+0x9287 0x4EF2 # <CJK>
+0x9288 0x5B99 # <CJK>
+0x9289 0x5FE0 # <CJK>
+0x928A 0x62BD # <CJK>
+0x928B 0x663C # <CJK>
+0x928C 0x67F1 # <CJK>
+0x928D 0x6CE8 # <CJK>
+0x928E 0x866B # <CJK>
+0x928F 0x8877 # <CJK>
+0x9290 0x8A3B # <CJK>
+0x9291 0x914E # <CJK>
+0x9292 0x92F3 # <CJK>
+0x9293 0x99D0 # <CJK>
+0x9294 0x6A17 # <CJK>
+0x9295 0x7026 # <CJK>
+0x9296 0x732A # <CJK>
+0x9297 0x82E7 # <CJK>
+0x9298 0x8457 # <CJK>
+0x9299 0x8CAF # <CJK>
+0x929A 0x4E01 # <CJK>
+0x929B 0x5146 # <CJK>
+0x929C 0x51CB # <CJK>
+0x929D 0x558B # <CJK>
+0x929E 0x5BF5 # <CJK>
+0x929F 0x5E16 # <CJK>
+0x92A0 0x5E33 # <CJK>
+0x92A1 0x5E81 # <CJK>
+0x92A2 0x5F14 # <CJK>
+0x92A3 0x5F35 # <CJK>
+0x92A4 0x5F6B # <CJK>
+0x92A5 0x5FB4 # <CJK>
+0x92A6 0x61F2 # <CJK>
+0x92A7 0x6311 # <CJK>
+0x92A8 0x66A2 # <CJK>
+0x92A9 0x671D # <CJK>
+0x92AA 0x6F6E # <CJK>
+0x92AB 0x7252 # <CJK>
+0x92AC 0x753A # <CJK>
+0x92AD 0x773A # <CJK>
+0x92AE 0x8074 # <CJK>
+0x92AF 0x8139 # <CJK>
+0x92B0 0x8178 # <CJK>
+0x92B1 0x8776 # <CJK>
+0x92B2 0x8ABF # <CJK>
+0x92B3 0x8ADC # <CJK>
+0x92B4 0x8D85 # <CJK>
+0x92B5 0x8DF3 # <CJK>
+0x92B6 0x929A # <CJK>
+0x92B7 0x9577 # <CJK>
+0x92B8 0x9802 # <CJK>
+0x92B9 0x9CE5 # <CJK>
+0x92BA 0x52C5 # <CJK>
+0x92BB 0x6357 # <CJK>
+0x92BC 0x76F4 # <CJK>
+0x92BD 0x6715 # <CJK>
+0x92BE 0x6C88 # <CJK>
+0x92BF 0x73CD # <CJK>
+0x92C0 0x8CC3 # <CJK>
+0x92C1 0x93AE # <CJK>
+0x92C2 0x9673 # <CJK>
+0x92C3 0x6D25 # <CJK>
+0x92C4 0x589C # <CJK>
+0x92C5 0x690E # <CJK>
+0x92C6 0x69CC # <CJK>
+0x92C7 0x8FFD # <CJK>
+0x92C8 0x939A # <CJK>
+0x92C9 0x75DB # <CJK>
+0x92CA 0x901A # <CJK>
+0x92CB 0x585A # <CJK>
+0x92CC 0x6802 # <CJK>
+0x92CD 0x63B4 # <CJK>
+0x92CE 0x69FB # <CJK>
+0x92CF 0x4F43 # <CJK>
+0x92D0 0x6F2C # <CJK>
+0x92D1 0x67D8 # <CJK>
+0x92D2 0x8FBB # <CJK>
+0x92D3 0x8526 # <CJK>
+0x92D4 0x7DB4 # <CJK>
+0x92D5 0x9354 # <CJK>
+0x92D6 0x693F # <CJK>
+0x92D7 0x6F70 # <CJK>
+0x92D8 0x576A # <CJK>
+0x92D9 0x58F7 # <CJK>
+0x92DA 0x5B2C # <CJK>
+0x92DB 0x7D2C # <CJK>
+0x92DC 0x722A # <CJK>
+0x92DD 0x540A # <CJK>
+0x92DE 0x91E3 # <CJK>
+0x92DF 0x9DB4 # <CJK>
+0x92E0 0x4EAD # <CJK>
+0x92E1 0x4F4E # <CJK>
+0x92E2 0x505C # <CJK>
+0x92E3 0x5075 # <CJK>
+0x92E4 0x5243 # <CJK>
+0x92E5 0x8C9E # <CJK>
+0x92E6 0x5448 # <CJK>
+0x92E7 0x5824 # <CJK>
+0x92E8 0x5B9A # <CJK>
+0x92E9 0x5E1D # <CJK>
+0x92EA 0x5E95 # <CJK>
+0x92EB 0x5EAD # <CJK>
+0x92EC 0x5EF7 # <CJK>
+0x92ED 0x5F1F # <CJK>
+0x92EE 0x608C # <CJK>
+0x92EF 0x62B5 # <CJK>
+0x92F0 0x633A # <CJK>
+0x92F1 0x63D0 # <CJK>
+0x92F2 0x68AF # <CJK>
+0x92F3 0x6C40 # <CJK>
+0x92F4 0x7887 # <CJK>
+0x92F5 0x798E # <CJK>
+0x92F6 0x7A0B # <CJK>
+0x92F7 0x7DE0 # <CJK>
+0x92F8 0x8247 # <CJK>
+0x92F9 0x8A02 # <CJK>
+0x92FA 0x8AE6 # <CJK>
+0x92FB 0x8E44 # <CJK>
+0x92FC 0x9013 # <CJK>
+0x9340 0x90B8 # <CJK>
+0x9341 0x912D # <CJK>
+0x9342 0x91D8 # <CJK>
+0x9343 0x9F0E # <CJK>
+0x9344 0x6CE5 # <CJK>
+0x9345 0x6458 # <CJK>
+0x9346 0x64E2 # <CJK>
+0x9347 0x6575 # <CJK>
+0x9348 0x6EF4 # <CJK>
+0x9349 0x7684 # <CJK>
+0x934A 0x7B1B # <CJK>
+0x934B 0x9069 # <CJK>
+0x934C 0x93D1 # <CJK>
+0x934D 0x6EBA # <CJK>
+0x934E 0x54F2 # <CJK>
+0x934F 0x5FB9 # <CJK>
+0x9350 0x64A4 # <CJK>
+0x9351 0x8F4D # <CJK>
+0x9352 0x8FED # <CJK>
+0x9353 0x9244 # <CJK>
+0x9354 0x5178 # <CJK>
+0x9355 0x586B # <CJK>
+0x9356 0x5929 # <CJK>
+0x9357 0x5C55 # <CJK>
+0x9358 0x5E97 # <CJK>
+0x9359 0x6DFB # <CJK>
+0x935A 0x7E8F # <CJK>
+0x935B 0x751C # <CJK>
+0x935C 0x8CBC # <CJK>
+0x935D 0x8EE2 # <CJK>
+0x935E 0x985B # <CJK>
+0x935F 0x70B9 # <CJK>
+0x9360 0x4F1D # <CJK>
+0x9361 0x6BBF # <CJK>
+0x9362 0x6FB1 # <CJK>
+0x9363 0x7530 # <CJK>
+0x9364 0x96FB # <CJK>
+0x9365 0x514E # <CJK>
+0x9366 0x5410 # <CJK>
+0x9367 0x5835 # <CJK>
+0x9368 0x5857 # <CJK>
+0x9369 0x59AC # <CJK>
+0x936A 0x5C60 # <CJK>
+0x936B 0x5F92 # <CJK>
+0x936C 0x6597 # <CJK>
+0x936D 0x675C # <CJK>
+0x936E 0x6E21 # <CJK>
+0x936F 0x767B # <CJK>
+0x9370 0x83DF # <CJK>
+0x9371 0x8CED # <CJK>
+0x9372 0x9014 # <CJK>
+0x9373 0x90FD # <CJK>
+0x9374 0x934D # <CJK>
+0x9375 0x7825 # <CJK>
+0x9376 0x783A # <CJK>
+0x9377 0x52AA # <CJK>
+0x9378 0x5EA6 # <CJK>
+0x9379 0x571F # <CJK>
+0x937A 0x5974 # <CJK>
+0x937B 0x6012 # <CJK>
+0x937C 0x5012 # <CJK>
+0x937D 0x515A # <CJK>
+0x937E 0x51AC # <CJK>
+0x9380 0x51CD # <CJK>
+0x9381 0x5200 # <CJK>
+0x9382 0x5510 # <CJK>
+0x9383 0x5854 # <CJK>
+0x9384 0x5858 # <CJK>
+0x9385 0x5957 # <CJK>
+0x9386 0x5B95 # <CJK>
+0x9387 0x5CF6 # <CJK>
+0x9388 0x5D8B # <CJK>
+0x9389 0x60BC # <CJK>
+0x938A 0x6295 # <CJK>
+0x938B 0x642D # <CJK>
+0x938C 0x6771 # <CJK>
+0x938D 0x6843 # <CJK>
+0x938E 0x68BC # <CJK>
+0x938F 0x68DF # <CJK>
+0x9390 0x76D7 # <CJK>
+0x9391 0x6DD8 # <CJK>
+0x9392 0x6E6F # <CJK>
+0x9393 0x6D9B # <CJK>
+0x9394 0x706F # <CJK>
+0x9395 0x71C8 # <CJK>
+0x9396 0x5F53 # <CJK>
+0x9397 0x75D8 # <CJK>
+0x9398 0x7977 # <CJK>
+0x9399 0x7B49 # <CJK>
+0x939A 0x7B54 # <CJK>
+0x939B 0x7B52 # <CJK>
+0x939C 0x7CD6 # <CJK>
+0x939D 0x7D71 # <CJK>
+0x939E 0x5230 # <CJK>
+0x939F 0x8463 # <CJK>
+0x93A0 0x8569 # <CJK>
+0x93A1 0x85E4 # <CJK>
+0x93A2 0x8A0E # <CJK>
+0x93A3 0x8B04 # <CJK>
+0x93A4 0x8C46 # <CJK>
+0x93A5 0x8E0F # <CJK>
+0x93A6 0x9003 # <CJK>
+0x93A7 0x900F # <CJK>
+0x93A8 0x9419 # <CJK>
+0x93A9 0x9676 # <CJK>
+0x93AA 0x982D # <CJK>
+0x93AB 0x9A30 # <CJK>
+0x93AC 0x95D8 # <CJK>
+0x93AD 0x50CD # <CJK>
+0x93AE 0x52D5 # <CJK>
+0x93AF 0x540C # <CJK>
+0x93B0 0x5802 # <CJK>
+0x93B1 0x5C0E # <CJK>
+0x93B2 0x61A7 # <CJK>
+0x93B3 0x649E # <CJK>
+0x93B4 0x6D1E # <CJK>
+0x93B5 0x77B3 # <CJK>
+0x93B6 0x7AE5 # <CJK>
+0x93B7 0x80F4 # <CJK>
+0x93B8 0x8404 # <CJK>
+0x93B9 0x9053 # <CJK>
+0x93BA 0x9285 # <CJK>
+0x93BB 0x5CE0 # <CJK>
+0x93BC 0x9D07 # <CJK>
+0x93BD 0x533F # <CJK>
+0x93BE 0x5F97 # <CJK>
+0x93BF 0x5FB3 # <CJK>
+0x93C0 0x6D9C # <CJK>
+0x93C1 0x7279 # <CJK>
+0x93C2 0x7763 # <CJK>
+0x93C3 0x79BF # <CJK>
+0x93C4 0x7BE4 # <CJK>
+0x93C5 0x6BD2 # <CJK>
+0x93C6 0x72EC # <CJK>
+0x93C7 0x8AAD # <CJK>
+0x93C8 0x6803 # <CJK>
+0x93C9 0x6A61 # <CJK>
+0x93CA 0x51F8 # <CJK>
+0x93CB 0x7A81 # <CJK>
+0x93CC 0x6934 # <CJK>
+0x93CD 0x5C4A # <CJK>
+0x93CE 0x9CF6 # <CJK>
+0x93CF 0x82EB # <CJK>
+0x93D0 0x5BC5 # <CJK>
+0x93D1 0x9149 # <CJK>
+0x93D2 0x701E # <CJK>
+0x93D3 0x5678 # <CJK>
+0x93D4 0x5C6F # <CJK>
+0x93D5 0x60C7 # <CJK>
+0x93D6 0x6566 # <CJK>
+0x93D7 0x6C8C # <CJK>
+0x93D8 0x8C5A # <CJK>
+0x93D9 0x9041 # <CJK>
+0x93DA 0x9813 # <CJK>
+0x93DB 0x5451 # <CJK>
+0x93DC 0x66C7 # <CJK>
+0x93DD 0x920D # <CJK>
+0x93DE 0x5948 # <CJK>
+0x93DF 0x90A3 # <CJK>
+0x93E0 0x5185 # <CJK>
+0x93E1 0x4E4D # <CJK>
+0x93E2 0x51EA # <CJK>
+0x93E3 0x8599 # <CJK>
+0x93E4 0x8B0E # <CJK>
+0x93E5 0x7058 # <CJK>
+0x93E6 0x637A # <CJK>
+0x93E7 0x934B # <CJK>
+0x93E8 0x6962 # <CJK>
+0x93E9 0x99B4 # <CJK>
+0x93EA 0x7E04 # <CJK>
+0x93EB 0x7577 # <CJK>
+0x93EC 0x5357 # <CJK>
+0x93ED 0x6960 # <CJK>
+0x93EE 0x8EDF # <CJK>
+0x93EF 0x96E3 # <CJK>
+0x93F0 0x6C5D # <CJK>
+0x93F1 0x4E8C # <CJK>
+0x93F2 0x5C3C # <CJK>
+0x93F3 0x5F10 # <CJK>
+0x93F4 0x8FE9 # <CJK>
+0x93F5 0x5302 # <CJK>
+0x93F6 0x8CD1 # <CJK>
+0x93F7 0x8089 # <CJK>
+0x93F8 0x8679 # <CJK>
+0x93F9 0x5EFF # <CJK>
+0x93FA 0x65E5 # <CJK>
+0x93FB 0x4E73 # <CJK>
+0x93FC 0x5165 # <CJK>
+0x9440 0x5982 # <CJK>
+0x9441 0x5C3F # <CJK>
+0x9442 0x97EE # <CJK>
+0x9443 0x4EFB # <CJK>
+0x9444 0x598A # <CJK>
+0x9445 0x5FCD # <CJK>
+0x9446 0x8A8D # <CJK>
+0x9447 0x6FE1 # <CJK>
+0x9448 0x79B0 # <CJK>
+0x9449 0x7962 # <CJK>
+0x944A 0x5BE7 # <CJK>
+0x944B 0x8471 # <CJK>
+0x944C 0x732B # <CJK>
+0x944D 0x71B1 # <CJK>
+0x944E 0x5E74 # <CJK>
+0x944F 0x5FF5 # <CJK>
+0x9450 0x637B # <CJK>
+0x9451 0x649A # <CJK>
+0x9452 0x71C3 # <CJK>
+0x9453 0x7C98 # <CJK>
+0x9454 0x4E43 # <CJK>
+0x9455 0x5EFC # <CJK>
+0x9456 0x4E4B # <CJK>
+0x9457 0x57DC # <CJK>
+0x9458 0x56A2 # <CJK>
+0x9459 0x60A9 # <CJK>
+0x945A 0x6FC3 # <CJK>
+0x945B 0x7D0D # <CJK>
+0x945C 0x80FD # <CJK>
+0x945D 0x8133 # <CJK>
+0x945E 0x81BF # <CJK>
+0x945F 0x8FB2 # <CJK>
+0x9460 0x8997 # <CJK>
+0x9461 0x86A4 # <CJK>
+0x9462 0x5DF4 # <CJK>
+0x9463 0x628A # <CJK>
+0x9464 0x64AD # <CJK>
+0x9465 0x8987 # <CJK>
+0x9466 0x6777 # <CJK>
+0x9467 0x6CE2 # <CJK>
+0x9468 0x6D3E # <CJK>
+0x9469 0x7436 # <CJK>
+0x946A 0x7834 # <CJK>
+0x946B 0x5A46 # <CJK>
+0x946C 0x7F75 # <CJK>
+0x946D 0x82AD # <CJK>
+0x946E 0x99AC # <CJK>
+0x946F 0x4FF3 # <CJK>
+0x9470 0x5EC3 # <CJK>
+0x9471 0x62DD # <CJK>
+0x9472 0x6392 # <CJK>
+0x9473 0x6557 # <CJK>
+0x9474 0x676F # <CJK>
+0x9475 0x76C3 # <CJK>
+0x9476 0x724C # <CJK>
+0x9477 0x80CC # <CJK>
+0x9478 0x80BA # <CJK>
+0x9479 0x8F29 # <CJK>
+0x947A 0x914D # <CJK>
+0x947B 0x500D # <CJK>
+0x947C 0x57F9 # <CJK>
+0x947D 0x5A92 # <CJK>
+0x947E 0x6885 # <CJK>
+0x9480 0x6973 # <CJK>
+0x9481 0x7164 # <CJK>
+0x9482 0x72FD # <CJK>
+0x9483 0x8CB7 # <CJK>
+0x9484 0x58F2 # <CJK>
+0x9485 0x8CE0 # <CJK>
+0x9486 0x966A # <CJK>
+0x9487 0x9019 # <CJK>
+0x9488 0x877F # <CJK>
+0x9489 0x79E4 # <CJK>
+0x948A 0x77E7 # <CJK>
+0x948B 0x8429 # <CJK>
+0x948C 0x4F2F # <CJK>
+0x948D 0x5265 # <CJK>
+0x948E 0x535A # <CJK>
+0x948F 0x62CD # <CJK>
+0x9490 0x67CF # <CJK>
+0x9491 0x6CCA # <CJK>
+0x9492 0x767D # <CJK>
+0x9493 0x7B94 # <CJK>
+0x9494 0x7C95 # <CJK>
+0x9495 0x8236 # <CJK>
+0x9496 0x8584 # <CJK>
+0x9497 0x8FEB # <CJK>
+0x9498 0x66DD # <CJK>
+0x9499 0x6F20 # <CJK>
+0x949A 0x7206 # <CJK>
+0x949B 0x7E1B # <CJK>
+0x949C 0x83AB # <CJK>
+0x949D 0x99C1 # <CJK>
+0x949E 0x9EA6 # <CJK>
+0x949F 0x51FD # <CJK>
+0x94A0 0x7BB1 # <CJK>
+0x94A1 0x7872 # <CJK>
+0x94A2 0x7BB8 # <CJK>
+0x94A3 0x8087 # <CJK>
+0x94A4 0x7B48 # <CJK>
+0x94A5 0x6AE8 # <CJK>
+0x94A6 0x5E61 # <CJK>
+0x94A7 0x808C # <CJK>
+0x94A8 0x7551 # <CJK>
+0x94A9 0x7560 # <CJK>
+0x94AA 0x516B # <CJK>
+0x94AB 0x9262 # <CJK>
+0x94AC 0x6E8C # <CJK>
+0x94AD 0x767A # <CJK>
+0x94AE 0x9197 # <CJK>
+0x94AF 0x9AEA # <CJK>
+0x94B0 0x4F10 # <CJK>
+0x94B1 0x7F70 # <CJK>
+0x94B2 0x629C # <CJK>
+0x94B3 0x7B4F # <CJK>
+0x94B4 0x95A5 # <CJK>
+0x94B5 0x9CE9 # <CJK>
+0x94B6 0x567A # <CJK>
+0x94B7 0x5859 # <CJK>
+0x94B8 0x86E4 # <CJK>
+0x94B9 0x96BC # <CJK>
+0x94BA 0x4F34 # <CJK>
+0x94BB 0x5224 # <CJK>
+0x94BC 0x534A # <CJK>
+0x94BD 0x53CD # <CJK>
+0x94BE 0x53DB # <CJK>
+0x94BF 0x5E06 # <CJK>
+0x94C0 0x642C # <CJK>
+0x94C1 0x6591 # <CJK>
+0x94C2 0x677F # <CJK>
+0x94C3 0x6C3E # <CJK>
+0x94C4 0x6C4E # <CJK>
+0x94C5 0x7248 # <CJK>
+0x94C6 0x72AF # <CJK>
+0x94C7 0x73ED # <CJK>
+0x94C8 0x7554 # <CJK>
+0x94C9 0x7E41 # <CJK>
+0x94CA 0x822C # <CJK>
+0x94CB 0x85E9 # <CJK>
+0x94CC 0x8CA9 # <CJK>
+0x94CD 0x7BC4 # <CJK>
+0x94CE 0x91C6 # <CJK>
+0x94CF 0x7169 # <CJK>
+0x94D0 0x9812 # <CJK>
+0x94D1 0x98EF # <CJK>
+0x94D2 0x633D # <CJK>
+0x94D3 0x6669 # <CJK>
+0x94D4 0x756A # <CJK>
+0x94D5 0x76E4 # <CJK>
+0x94D6 0x78D0 # <CJK>
+0x94D7 0x8543 # <CJK>
+0x94D8 0x86EE # <CJK>
+0x94D9 0x532A # <CJK>
+0x94DA 0x5351 # <CJK>
+0x94DB 0x5426 # <CJK>
+0x94DC 0x5983 # <CJK>
+0x94DD 0x5E87 # <CJK>
+0x94DE 0x5F7C # <CJK>
+0x94DF 0x60B2 # <CJK>
+0x94E0 0x6249 # <CJK>
+0x94E1 0x6279 # <CJK>
+0x94E2 0x62AB # <CJK>
+0x94E3 0x6590 # <CJK>
+0x94E4 0x6BD4 # <CJK>
+0x94E5 0x6CCC # <CJK>
+0x94E6 0x75B2 # <CJK>
+0x94E7 0x76AE # <CJK>
+0x94E8 0x7891 # <CJK>
+0x94E9 0x79D8 # <CJK>
+0x94EA 0x7DCB # <CJK>
+0x94EB 0x7F77 # <CJK>
+0x94EC 0x80A5 # <CJK>
+0x94ED 0x88AB # <CJK>
+0x94EE 0x8AB9 # <CJK>
+0x94EF 0x8CBB # <CJK>
+0x94F0 0x907F # <CJK>
+0x94F1 0x975E # <CJK>
+0x94F2 0x98DB # <CJK>
+0x94F3 0x6A0B # <CJK>
+0x94F4 0x7C38 # <CJK>
+0x94F5 0x5099 # <CJK>
+0x94F6 0x5C3E # <CJK>
+0x94F7 0x5FAE # <CJK>
+0x94F8 0x6787 # <CJK>
+0x94F9 0x6BD8 # <CJK>
+0x94FA 0x7435 # <CJK>
+0x94FB 0x7709 # <CJK>
+0x94FC 0x7F8E # <CJK>
+0x9540 0x9F3B # <CJK>
+0x9541 0x67CA # <CJK>
+0x9542 0x7A17 # <CJK>
+0x9543 0x5339 # <CJK>
+0x9544 0x758B # <CJK>
+0x9545 0x9AED # <CJK>
+0x9546 0x5F66 # <CJK>
+0x9547 0x819D # <CJK>
+0x9548 0x83F1 # <CJK>
+0x9549 0x8098 # <CJK>
+0x954A 0x5F3C # <CJK>
+0x954B 0x5FC5 # <CJK>
+0x954C 0x7562 # <CJK>
+0x954D 0x7B46 # <CJK>
+0x954E 0x903C # <CJK>
+0x954F 0x6867 # <CJK>
+0x9550 0x59EB # <CJK>
+0x9551 0x5A9B # <CJK>
+0x9552 0x7D10 # <CJK>
+0x9553 0x767E # <CJK>
+0x9554 0x8B2C # <CJK>
+0x9555 0x4FF5 # <CJK>
+0x9556 0x5F6A # <CJK>
+0x9557 0x6A19 # <CJK>
+0x9558 0x6C37 # <CJK>
+0x9559 0x6F02 # <CJK>
+0x955A 0x74E2 # <CJK>
+0x955B 0x7968 # <CJK>
+0x955C 0x8868 # <CJK>
+0x955D 0x8A55 # <CJK>
+0x955E 0x8C79 # <CJK>
+0x955F 0x5EDF # <CJK>
+0x9560 0x63CF # <CJK>
+0x9561 0x75C5 # <CJK>
+0x9562 0x79D2 # <CJK>
+0x9563 0x82D7 # <CJK>
+0x9564 0x9328 # <CJK>
+0x9565 0x92F2 # <CJK>
+0x9566 0x849C # <CJK>
+0x9567 0x86ED # <CJK>
+0x9568 0x9C2D # <CJK>
+0x9569 0x54C1 # <CJK>
+0x956A 0x5F6C # <CJK>
+0x956B 0x658C # <CJK>
+0x956C 0x6D5C # <CJK>
+0x956D 0x7015 # <CJK>
+0x956E 0x8CA7 # <CJK>
+0x956F 0x8CD3 # <CJK>
+0x9570 0x983B # <CJK>
+0x9571 0x654F # <CJK>
+0x9572 0x74F6 # <CJK>
+0x9573 0x4E0D # <CJK>
+0x9574 0x4ED8 # <CJK>
+0x9575 0x57E0 # <CJK>
+0x9576 0x592B # <CJK>
+0x9577 0x5A66 # <CJK>
+0x9578 0x5BCC # <CJK>
+0x9579 0x51A8 # <CJK>
+0x957A 0x5E03 # <CJK>
+0x957B 0x5E9C # <CJK>
+0x957C 0x6016 # <CJK>
+0x957D 0x6276 # <CJK>
+0x957E 0x6577 # <CJK>
+0x9580 0x65A7 # <CJK>
+0x9581 0x666E # <CJK>
+0x9582 0x6D6E # <CJK>
+0x9583 0x7236 # <CJK>
+0x9584 0x7B26 # <CJK>
+0x9585 0x8150 # <CJK>
+0x9586 0x819A # <CJK>
+0x9587 0x8299 # <CJK>
+0x9588 0x8B5C # <CJK>
+0x9589 0x8CA0 # <CJK>
+0x958A 0x8CE6 # <CJK>
+0x958B 0x8D74 # <CJK>
+0x958C 0x961C # <CJK>
+0x958D 0x9644 # <CJK>
+0x958E 0x4FAE # <CJK>
+0x958F 0x64AB # <CJK>
+0x9590 0x6B66 # <CJK>
+0x9591 0x821E # <CJK>
+0x9592 0x8461 # <CJK>
+0x9593 0x856A # <CJK>
+0x9594 0x90E8 # <CJK>
+0x9595 0x5C01 # <CJK>
+0x9596 0x6953 # <CJK>
+0x9597 0x98A8 # <CJK>
+0x9598 0x847A # <CJK>
+0x9599 0x8557 # <CJK>
+0x959A 0x4F0F # <CJK>
+0x959B 0x526F # <CJK>
+0x959C 0x5FA9 # <CJK>
+0x959D 0x5E45 # <CJK>
+0x959E 0x670D # <CJK>
+0x959F 0x798F # <CJK>
+0x95A0 0x8179 # <CJK>
+0x95A1 0x8907 # <CJK>
+0x95A2 0x8986 # <CJK>
+0x95A3 0x6DF5 # <CJK>
+0x95A4 0x5F17 # <CJK>
+0x95A5 0x6255 # <CJK>
+0x95A6 0x6CB8 # <CJK>
+0x95A7 0x4ECF # <CJK>
+0x95A8 0x7269 # <CJK>
+0x95A9 0x9B92 # <CJK>
+0x95AA 0x5206 # <CJK>
+0x95AB 0x543B # <CJK>
+0x95AC 0x5674 # <CJK>
+0x95AD 0x58B3 # <CJK>
+0x95AE 0x61A4 # <CJK>
+0x95AF 0x626E # <CJK>
+0x95B0 0x711A # <CJK>
+0x95B1 0x596E # <CJK>
+0x95B2 0x7C89 # <CJK>
+0x95B3 0x7CDE # <CJK>
+0x95B4 0x7D1B # <CJK>
+0x95B5 0x96F0 # <CJK>
+0x95B6 0x6587 # <CJK>
+0x95B7 0x805E # <CJK>
+0x95B8 0x4E19 # <CJK>
+0x95B9 0x4F75 # <CJK>
+0x95BA 0x5175 # <CJK>
+0x95BB 0x5840 # <CJK>
+0x95BC 0x5E63 # <CJK>
+0x95BD 0x5E73 # <CJK>
+0x95BE 0x5F0A # <CJK>
+0x95BF 0x67C4 # <CJK>
+0x95C0 0x4E26 # <CJK>
+0x95C1 0x853D # <CJK>
+0x95C2 0x9589 # <CJK>
+0x95C3 0x965B # <CJK>
+0x95C4 0x7C73 # <CJK>
+0x95C5 0x9801 # <CJK>
+0x95C6 0x50FB # <CJK>
+0x95C7 0x58C1 # <CJK>
+0x95C8 0x7656 # <CJK>
+0x95C9 0x78A7 # <CJK>
+0x95CA 0x5225 # <CJK>
+0x95CB 0x77A5 # <CJK>
+0x95CC 0x8511 # <CJK>
+0x95CD 0x7B86 # <CJK>
+0x95CE 0x504F # <CJK>
+0x95CF 0x5909 # <CJK>
+0x95D0 0x7247 # <CJK>
+0x95D1 0x7BC7 # <CJK>
+0x95D2 0x7DE8 # <CJK>
+0x95D3 0x8FBA # <CJK>
+0x95D4 0x8FD4 # <CJK>
+0x95D5 0x904D # <CJK>
+0x95D6 0x4FBF # <CJK>
+0x95D7 0x52C9 # <CJK>
+0x95D8 0x5A29 # <CJK>
+0x95D9 0x5F01 # <CJK>
+0x95DA 0x97AD # <CJK>
+0x95DB 0x4FDD # <CJK>
+0x95DC 0x8217 # <CJK>
+0x95DD 0x92EA # <CJK>
+0x95DE 0x5703 # <CJK>
+0x95DF 0x6355 # <CJK>
+0x95E0 0x6B69 # <CJK>
+0x95E1 0x752B # <CJK>
+0x95E2 0x88DC # <CJK>
+0x95E3 0x8F14 # <CJK>
+0x95E4 0x7A42 # <CJK>
+0x95E5 0x52DF # <CJK>
+0x95E6 0x5893 # <CJK>
+0x95E7 0x6155 # <CJK>
+0x95E8 0x620A # <CJK>
+0x95E9 0x66AE # <CJK>
+0x95EA 0x6BCD # <CJK>
+0x95EB 0x7C3F # <CJK>
+0x95EC 0x83E9 # <CJK>
+0x95ED 0x5023 # <CJK>
+0x95EE 0x4FF8 # <CJK>
+0x95EF 0x5305 # <CJK>
+0x95F0 0x5446 # <CJK>
+0x95F1 0x5831 # <CJK>
+0x95F2 0x5949 # <CJK>
+0x95F3 0x5B9D # <CJK>
+0x95F4 0x5CF0 # <CJK>
+0x95F5 0x5CEF # <CJK>
+0x95F6 0x5D29 # <CJK>
+0x95F7 0x5E96 # <CJK>
+0x95F8 0x62B1 # <CJK>
+0x95F9 0x6367 # <CJK>
+0x95FA 0x653E # <CJK>
+0x95FB 0x65B9 # <CJK>
+0x95FC 0x670B # <CJK>
+0x9640 0x6CD5 # <CJK>
+0x9641 0x6CE1 # <CJK>
+0x9642 0x70F9 # <CJK>
+0x9643 0x7832 # <CJK>
+0x9644 0x7E2B # <CJK>
+0x9645 0x80DE # <CJK>
+0x9646 0x82B3 # <CJK>
+0x9647 0x840C # <CJK>
+0x9648 0x84EC # <CJK>
+0x9649 0x8702 # <CJK>
+0x964A 0x8912 # <CJK>
+0x964B 0x8A2A # <CJK>
+0x964C 0x8C4A # <CJK>
+0x964D 0x90A6 # <CJK>
+0x964E 0x92D2 # <CJK>
+0x964F 0x98FD # <CJK>
+0x9650 0x9CF3 # <CJK>
+0x9651 0x9D6C # <CJK>
+0x9652 0x4E4F # <CJK>
+0x9653 0x4EA1 # <CJK>
+0x9654 0x508D # <CJK>
+0x9655 0x5256 # <CJK>
+0x9656 0x574A # <CJK>
+0x9657 0x59A8 # <CJK>
+0x9658 0x5E3D # <CJK>
+0x9659 0x5FD8 # <CJK>
+0x965A 0x5FD9 # <CJK>
+0x965B 0x623F # <CJK>
+0x965C 0x66B4 # <CJK>
+0x965D 0x671B # <CJK>
+0x965E 0x67D0 # <CJK>
+0x965F 0x68D2 # <CJK>
+0x9660 0x5192 # <CJK>
+0x9661 0x7D21 # <CJK>
+0x9662 0x80AA # <CJK>
+0x9663 0x81A8 # <CJK>
+0x9664 0x8B00 # <CJK>
+0x9665 0x8C8C # <CJK>
+0x9666 0x8CBF # <CJK>
+0x9667 0x927E # <CJK>
+0x9668 0x9632 # <CJK>
+0x9669 0x5420 # <CJK>
+0x966A 0x982C # <CJK>
+0x966B 0x5317 # <CJK>
+0x966C 0x50D5 # <CJK>
+0x966D 0x535C # <CJK>
+0x966E 0x58A8 # <CJK>
+0x966F 0x64B2 # <CJK>
+0x9670 0x6734 # <CJK>
+0x9671 0x7267 # <CJK>
+0x9672 0x7766 # <CJK>
+0x9673 0x7A46 # <CJK>
+0x9674 0x91E6 # <CJK>
+0x9675 0x52C3 # <CJK>
+0x9676 0x6CA1 # <CJK>
+0x9677 0x6B86 # <CJK>
+0x9678 0x5800 # <CJK>
+0x9679 0x5E4C # <CJK>
+0x967A 0x5954 # <CJK>
+0x967B 0x672C # <CJK>
+0x967C 0x7FFB # <CJK>
+0x967D 0x51E1 # <CJK>
+0x967E 0x76C6 # <CJK>
+0x9680 0x6469 # <CJK>
+0x9681 0x78E8 # <CJK>
+0x9682 0x9B54 # <CJK>
+0x9683 0x9EBB # <CJK>
+0x9684 0x57CB # <CJK>
+0x9685 0x59B9 # <CJK>
+0x9686 0x6627 # <CJK>
+0x9687 0x679A # <CJK>
+0x9688 0x6BCE # <CJK>
+0x9689 0x54E9 # <CJK>
+0x968A 0x69D9 # <CJK>
+0x968B 0x5E55 # <CJK>
+0x968C 0x819C # <CJK>
+0x968D 0x6795 # <CJK>
+0x968E 0x9BAA # <CJK>
+0x968F 0x67FE # <CJK>
+0x9690 0x9C52 # <CJK>
+0x9691 0x685D # <CJK>
+0x9692 0x4EA6 # <CJK>
+0x9693 0x4FE3 # <CJK>
+0x9694 0x53C8 # <CJK>
+0x9695 0x62B9 # <CJK>
+0x9696 0x672B # <CJK>
+0x9697 0x6CAB # <CJK>
+0x9698 0x8FC4 # <CJK>
+0x9699 0x4FAD # <CJK>
+0x969A 0x7E6D # <CJK>
+0x969B 0x9EBF # <CJK>
+0x969C 0x4E07 # <CJK>
+0x969D 0x6162 # <CJK>
+0x969E 0x6E80 # <CJK>
+0x969F 0x6F2B # <CJK>
+0x96A0 0x8513 # <CJK>
+0x96A1 0x5473 # <CJK>
+0x96A2 0x672A # <CJK>
+0x96A3 0x9B45 # <CJK>
+0x96A4 0x5DF3 # <CJK>
+0x96A5 0x7B95 # <CJK>
+0x96A6 0x5CAC # <CJK>
+0x96A7 0x5BC6 # <CJK>
+0x96A8 0x871C # <CJK>
+0x96A9 0x6E4A # <CJK>
+0x96AA 0x84D1 # <CJK>
+0x96AB 0x7A14 # <CJK>
+0x96AC 0x8108 # <CJK>
+0x96AD 0x5999 # <CJK>
+0x96AE 0x7C8D # <CJK>
+0x96AF 0x6C11 # <CJK>
+0x96B0 0x7720 # <CJK>
+0x96B1 0x52D9 # <CJK>
+0x96B2 0x5922 # <CJK>
+0x96B3 0x7121 # <CJK>
+0x96B4 0x725F # <CJK>
+0x96B5 0x77DB # <CJK>
+0x96B6 0x9727 # <CJK>
+0x96B7 0x9D61 # <CJK>
+0x96B8 0x690B # <CJK>
+0x96B9 0x5A7F # <CJK>
+0x96BA 0x5A18 # <CJK>
+0x96BB 0x51A5 # <CJK>
+0x96BC 0x540D # <CJK>
+0x96BD 0x547D # <CJK>
+0x96BE 0x660E # <CJK>
+0x96BF 0x76DF # <CJK>
+0x96C0 0x8FF7 # <CJK>
+0x96C1 0x9298 # <CJK>
+0x96C2 0x9CF4 # <CJK>
+0x96C3 0x59EA # <CJK>
+0x96C4 0x725D # <CJK>
+0x96C5 0x6EC5 # <CJK>
+0x96C6 0x514D # <CJK>
+0x96C7 0x68C9 # <CJK>
+0x96C8 0x7DBF # <CJK>
+0x96C9 0x7DEC # <CJK>
+0x96CA 0x9762 # <CJK>
+0x96CB 0x9EBA # <CJK>
+0x96CC 0x6478 # <CJK>
+0x96CD 0x6A21 # <CJK>
+0x96CE 0x8302 # <CJK>
+0x96CF 0x5984 # <CJK>
+0x96D0 0x5B5F # <CJK>
+0x96D1 0x6BDB # <CJK>
+0x96D2 0x731B # <CJK>
+0x96D3 0x76F2 # <CJK>
+0x96D4 0x7DB2 # <CJK>
+0x96D5 0x8017 # <CJK>
+0x96D6 0x8499 # <CJK>
+0x96D7 0x5132 # <CJK>
+0x96D8 0x6728 # <CJK>
+0x96D9 0x9ED9 # <CJK>
+0x96DA 0x76EE # <CJK>
+0x96DB 0x6762 # <CJK>
+0x96DC 0x52FF # <CJK>
+0x96DD 0x9905 # <CJK>
+0x96DE 0x5C24 # <CJK>
+0x96DF 0x623B # <CJK>
+0x96E0 0x7C7E # <CJK>
+0x96E1 0x8CB0 # <CJK>
+0x96E2 0x554F # <CJK>
+0x96E3 0x60B6 # <CJK>
+0x96E4 0x7D0B # <CJK>
+0x96E5 0x9580 # <CJK>
+0x96E6 0x5301 # <CJK>
+0x96E7 0x4E5F # <CJK>
+0x96E8 0x51B6 # <CJK>
+0x96E9 0x591C # <CJK>
+0x96EA 0x723A # <CJK>
+0x96EB 0x8036 # <CJK>
+0x96EC 0x91CE # <CJK>
+0x96ED 0x5F25 # <CJK>
+0x96EE 0x77E2 # <CJK>
+0x96EF 0x5384 # <CJK>
+0x96F0 0x5F79 # <CJK>
+0x96F1 0x7D04 # <CJK>
+0x96F2 0x85AC # <CJK>
+0x96F3 0x8A33 # <CJK>
+0x96F4 0x8E8D # <CJK>
+0x96F5 0x9756 # <CJK>
+0x96F6 0x67F3 # <CJK>
+0x96F7 0x85AE # <CJK>
+0x96F8 0x9453 # <CJK>
+0x96F9 0x6109 # <CJK>
+0x96FA 0x6108 # <CJK>
+0x96FB 0x6CB9 # <CJK>
+0x96FC 0x7652 # <CJK>
+0x9740 0x8AED # <CJK>
+0x9741 0x8F38 # <CJK>
+0x9742 0x552F # <CJK>
+0x9743 0x4F51 # <CJK>
+0x9744 0x512A # <CJK>
+0x9745 0x52C7 # <CJK>
+0x9746 0x53CB # <CJK>
+0x9747 0x5BA5 # <CJK>
+0x9748 0x5E7D # <CJK>
+0x9749 0x60A0 # <CJK>
+0x974A 0x6182 # <CJK>
+0x974B 0x63D6 # <CJK>
+0x974C 0x6709 # <CJK>
+0x974D 0x67DA # <CJK>
+0x974E 0x6E67 # <CJK>
+0x974F 0x6D8C # <CJK>
+0x9750 0x7336 # <CJK>
+0x9751 0x7337 # <CJK>
+0x9752 0x7531 # <CJK>
+0x9753 0x7950 # <CJK>
+0x9754 0x88D5 # <CJK>
+0x9755 0x8A98 # <CJK>
+0x9756 0x904A # <CJK>
+0x9757 0x9091 # <CJK>
+0x9758 0x90F5 # <CJK>
+0x9759 0x96C4 # <CJK>
+0x975A 0x878D # <CJK>
+0x975B 0x5915 # <CJK>
+0x975C 0x4E88 # <CJK>
+0x975D 0x4F59 # <CJK>
+0x975E 0x4E0E # <CJK>
+0x975F 0x8A89 # <CJK>
+0x9760 0x8F3F # <CJK>
+0x9761 0x9810 # <CJK>
+0x9762 0x50AD # <CJK>
+0x9763 0x5E7C # <CJK>
+0x9764 0x5996 # <CJK>
+0x9765 0x5BB9 # <CJK>
+0x9766 0x5EB8 # <CJK>
+0x9767 0x63DA # <CJK>
+0x9768 0x63FA # <CJK>
+0x9769 0x64C1 # <CJK>
+0x976A 0x66DC # <CJK>
+0x976B 0x694A # <CJK>
+0x976C 0x69D8 # <CJK>
+0x976D 0x6D0B # <CJK>
+0x976E 0x6EB6 # <CJK>
+0x976F 0x7194 # <CJK>
+0x9770 0x7528 # <CJK>
+0x9771 0x7AAF # <CJK>
+0x9772 0x7F8A # <CJK>
+0x9773 0x8000 # <CJK>
+0x9774 0x8449 # <CJK>
+0x9775 0x84C9 # <CJK>
+0x9776 0x8981 # <CJK>
+0x9777 0x8B21 # <CJK>
+0x9778 0x8E0A # <CJK>
+0x9779 0x9065 # <CJK>
+0x977A 0x967D # <CJK>
+0x977B 0x990A # <CJK>
+0x977C 0x617E # <CJK>
+0x977D 0x6291 # <CJK>
+0x977E 0x6B32 # <CJK>
+0x9780 0x6C83 # <CJK>
+0x9781 0x6D74 # <CJK>
+0x9782 0x7FCC # <CJK>
+0x9783 0x7FFC # <CJK>
+0x9784 0x6DC0 # <CJK>
+0x9785 0x7F85 # <CJK>
+0x9786 0x87BA # <CJK>
+0x9787 0x88F8 # <CJK>
+0x9788 0x6765 # <CJK>
+0x9789 0x83B1 # <CJK>
+0x978A 0x983C # <CJK>
+0x978B 0x96F7 # <CJK>
+0x978C 0x6D1B # <CJK>
+0x978D 0x7D61 # <CJK>
+0x978E 0x843D # <CJK>
+0x978F 0x916A # <CJK>
+0x9790 0x4E71 # <CJK>
+0x9791 0x5375 # <CJK>
+0x9792 0x5D50 # <CJK>
+0x9793 0x6B04 # <CJK>
+0x9794 0x6FEB # <CJK>
+0x9795 0x85CD # <CJK>
+0x9796 0x862D # <CJK>
+0x9797 0x89A7 # <CJK>
+0x9798 0x5229 # <CJK>
+0x9799 0x540F # <CJK>
+0x979A 0x5C65 # <CJK>
+0x979B 0x674E # <CJK>
+0x979C 0x68A8 # <CJK>
+0x979D 0x7406 # <CJK>
+0x979E 0x7483 # <CJK>
+0x979F 0x75E2 # <CJK>
+0x97A0 0x88CF # <CJK>
+0x97A1 0x88E1 # <CJK>
+0x97A2 0x91CC # <CJK>
+0x97A3 0x96E2 # <CJK>
+0x97A4 0x9678 # <CJK>
+0x97A5 0x5F8B # <CJK>
+0x97A6 0x7387 # <CJK>
+0x97A7 0x7ACB # <CJK>
+0x97A8 0x844E # <CJK>
+0x97A9 0x63A0 # <CJK>
+0x97AA 0x7565 # <CJK>
+0x97AB 0x5289 # <CJK>
+0x97AC 0x6D41 # <CJK>
+0x97AD 0x6E9C # <CJK>
+0x97AE 0x7409 # <CJK>
+0x97AF 0x7559 # <CJK>
+0x97B0 0x786B # <CJK>
+0x97B1 0x7C92 # <CJK>
+0x97B2 0x9686 # <CJK>
+0x97B3 0x7ADC # <CJK>
+0x97B4 0x9F8D # <CJK>
+0x97B5 0x4FB6 # <CJK>
+0x97B6 0x616E # <CJK>
+0x97B7 0x65C5 # <CJK>
+0x97B8 0x865C # <CJK>
+0x97B9 0x4E86 # <CJK>
+0x97BA 0x4EAE # <CJK>
+0x97BB 0x50DA # <CJK>
+0x97BC 0x4E21 # <CJK>
+0x97BD 0x51CC # <CJK>
+0x97BE 0x5BEE # <CJK>
+0x97BF 0x6599 # <CJK>
+0x97C0 0x6881 # <CJK>
+0x97C1 0x6DBC # <CJK>
+0x97C2 0x731F # <CJK>
+0x97C3 0x7642 # <CJK>
+0x97C4 0x77AD # <CJK>
+0x97C5 0x7A1C # <CJK>
+0x97C6 0x7CE7 # <CJK>
+0x97C7 0x826F # <CJK>
+0x97C8 0x8AD2 # <CJK>
+0x97C9 0x907C # <CJK>
+0x97CA 0x91CF # <CJK>
+0x97CB 0x9675 # <CJK>
+0x97CC 0x9818 # <CJK>
+0x97CD 0x529B # <CJK>
+0x97CE 0x7DD1 # <CJK>
+0x97CF 0x502B # <CJK>
+0x97D0 0x5398 # <CJK>
+0x97D1 0x6797 # <CJK>
+0x97D2 0x6DCB # <CJK>
+0x97D3 0x71D0 # <CJK>
+0x97D4 0x7433 # <CJK>
+0x97D5 0x81E8 # <CJK>
+0x97D6 0x8F2A # <CJK>
+0x97D7 0x96A3 # <CJK>
+0x97D8 0x9C57 # <CJK>
+0x97D9 0x9E9F # <CJK>
+0x97DA 0x7460 # <CJK>
+0x97DB 0x5841 # <CJK>
+0x97DC 0x6D99 # <CJK>
+0x97DD 0x7D2F # <CJK>
+0x97DE 0x985E # <CJK>
+0x97DF 0x4EE4 # <CJK>
+0x97E0 0x4F36 # <CJK>
+0x97E1 0x4F8B # <CJK>
+0x97E2 0x51B7 # <CJK>
+0x97E3 0x52B1 # <CJK>
+0x97E4 0x5DBA # <CJK>
+0x97E5 0x601C # <CJK>
+0x97E6 0x73B2 # <CJK>
+0x97E7 0x793C # <CJK>
+0x97E8 0x82D3 # <CJK>
+0x97E9 0x9234 # <CJK>
+0x97EA 0x96B7 # <CJK>
+0x97EB 0x96F6 # <CJK>
+0x97EC 0x970A # <CJK>
+0x97ED 0x9E97 # <CJK>
+0x97EE 0x9F62 # <CJK>
+0x97EF 0x66A6 # <CJK>
+0x97F0 0x6B74 # <CJK>
+0x97F1 0x5217 # <CJK>
+0x97F2 0x52A3 # <CJK>
+0x97F3 0x70C8 # <CJK>
+0x97F4 0x88C2 # <CJK>
+0x97F5 0x5EC9 # <CJK>
+0x97F6 0x604B # <CJK>
+0x97F7 0x6190 # <CJK>
+0x97F8 0x6F23 # <CJK>
+0x97F9 0x7149 # <CJK>
+0x97FA 0x7C3E # <CJK>
+0x97FB 0x7DF4 # <CJK>
+0x97FC 0x806F # <CJK>
+0x9840 0x84EE # <CJK>
+0x9841 0x9023 # <CJK>
+0x9842 0x932C # <CJK>
+0x9843 0x5442 # <CJK>
+0x9844 0x9B6F # <CJK>
+0x9845 0x6AD3 # <CJK>
+0x9846 0x7089 # <CJK>
+0x9847 0x8CC2 # <CJK>
+0x9848 0x8DEF # <CJK>
+0x9849 0x9732 # <CJK>
+0x984A 0x52B4 # <CJK>
+0x984B 0x5A41 # <CJK>
+0x984C 0x5ECA # <CJK>
+0x984D 0x5F04 # <CJK>
+0x984E 0x6717 # <CJK>
+0x984F 0x697C # <CJK>
+0x9850 0x6994 # <CJK>
+0x9851 0x6D6A # <CJK>
+0x9852 0x6F0F # <CJK>
+0x9853 0x7262 # <CJK>
+0x9854 0x72FC # <CJK>
+0x9855 0x7BED # <CJK>
+0x9856 0x8001 # <CJK>
+0x9857 0x807E # <CJK>
+0x9858 0x874B # <CJK>
+0x9859 0x90CE # <CJK>
+0x985A 0x516D # <CJK>
+0x985B 0x9E93 # <CJK>
+0x985C 0x7984 # <CJK>
+0x985D 0x808B # <CJK>
+0x985E 0x9332 # <CJK>
+0x985F 0x8AD6 # <CJK>
+0x9860 0x502D # <CJK>
+0x9861 0x548C # <CJK>
+0x9862 0x8A71 # <CJK>
+0x9863 0x6B6A # <CJK>
+0x9864 0x8CC4 # <CJK>
+0x9865 0x8107 # <CJK>
+0x9866 0x60D1 # <CJK>
+0x9867 0x67A0 # <CJK>
+0x9868 0x9DF2 # <CJK>
+0x9869 0x4E99 # <CJK>
+0x986A 0x4E98 # <CJK>
+0x986B 0x9C10 # <CJK>
+0x986C 0x8A6B # <CJK>
+0x986D 0x85C1 # <CJK>
+0x986E 0x8568 # <CJK>
+0x986F 0x6900 # <CJK>
+0x9870 0x6E7E # <CJK>
+0x9871 0x7897 # <CJK>
+0x9872 0x8155 # <CJK>
+0x989F 0x5F0C # <CJK>
+0x98A0 0x4E10 # <CJK>
+0x98A1 0x4E15 # <CJK>
+0x98A2 0x4E2A # <CJK>
+0x98A3 0x4E31 # <CJK>
+0x98A4 0x4E36 # <CJK>
+0x98A5 0x4E3C # <CJK>
+0x98A6 0x4E3F # <CJK>
+0x98A7 0x4E42 # <CJK>
+0x98A8 0x4E56 # <CJK>
+0x98A9 0x4E58 # <CJK>
+0x98AA 0x4E82 # <CJK>
+0x98AB 0x4E85 # <CJK>
+0x98AC 0x8C6B # <CJK>
+0x98AD 0x4E8A # <CJK>
+0x98AE 0x8212 # <CJK>
+0x98AF 0x5F0D # <CJK>
+0x98B0 0x4E8E # <CJK>
+0x98B1 0x4E9E # <CJK>
+0x98B2 0x4E9F # <CJK>
+0x98B3 0x4EA0 # <CJK>
+0x98B4 0x4EA2 # <CJK>
+0x98B5 0x4EB0 # <CJK>
+0x98B6 0x4EB3 # <CJK>
+0x98B7 0x4EB6 # <CJK>
+0x98B8 0x4ECE # <CJK>
+0x98B9 0x4ECD # <CJK>
+0x98BA 0x4EC4 # <CJK>
+0x98BB 0x4EC6 # <CJK>
+0x98BC 0x4EC2 # <CJK>
+0x98BD 0x4ED7 # <CJK>
+0x98BE 0x4EDE # <CJK>
+0x98BF 0x4EED # <CJK>
+0x98C0 0x4EDF # <CJK>
+0x98C1 0x4EF7 # <CJK>
+0x98C2 0x4F09 # <CJK>
+0x98C3 0x4F5A # <CJK>
+0x98C4 0x4F30 # <CJK>
+0x98C5 0x4F5B # <CJK>
+0x98C6 0x4F5D # <CJK>
+0x98C7 0x4F57 # <CJK>
+0x98C8 0x4F47 # <CJK>
+0x98C9 0x4F76 # <CJK>
+0x98CA 0x4F88 # <CJK>
+0x98CB 0x4F8F # <CJK>
+0x98CC 0x4F98 # <CJK>
+0x98CD 0x4F7B # <CJK>
+0x98CE 0x4F69 # <CJK>
+0x98CF 0x4F70 # <CJK>
+0x98D0 0x4F91 # <CJK>
+0x98D1 0x4F6F # <CJK>
+0x98D2 0x4F86 # <CJK>
+0x98D3 0x4F96 # <CJK>
+0x98D4 0x5118 # <CJK>
+0x98D5 0x4FD4 # <CJK>
+0x98D6 0x4FDF # <CJK>
+0x98D7 0x4FCE # <CJK>
+0x98D8 0x4FD8 # <CJK>
+0x98D9 0x4FDB # <CJK>
+0x98DA 0x4FD1 # <CJK>
+0x98DB 0x4FDA # <CJK>
+0x98DC 0x4FD0 # <CJK>
+0x98DD 0x4FE4 # <CJK>
+0x98DE 0x4FE5 # <CJK>
+0x98DF 0x501A # <CJK>
+0x98E0 0x5028 # <CJK>
+0x98E1 0x5014 # <CJK>
+0x98E2 0x502A # <CJK>
+0x98E3 0x5025 # <CJK>
+0x98E4 0x5005 # <CJK>
+0x98E5 0x4F1C # <CJK>
+0x98E6 0x4FF6 # <CJK>
+0x98E7 0x5021 # <CJK>
+0x98E8 0x5029 # <CJK>
+0x98E9 0x502C # <CJK>
+0x98EA 0x4FFE # <CJK>
+0x98EB 0x4FEF # <CJK>
+0x98EC 0x5011 # <CJK>
+0x98ED 0x5006 # <CJK>
+0x98EE 0x5043 # <CJK>
+0x98EF 0x5047 # <CJK>
+0x98F0 0x6703 # <CJK>
+0x98F1 0x5055 # <CJK>
+0x98F2 0x5050 # <CJK>
+0x98F3 0x5048 # <CJK>
+0x98F4 0x505A # <CJK>
+0x98F5 0x5056 # <CJK>
+0x98F6 0x506C # <CJK>
+0x98F7 0x5078 # <CJK>
+0x98F8 0x5080 # <CJK>
+0x98F9 0x509A # <CJK>
+0x98FA 0x5085 # <CJK>
+0x98FB 0x50B4 # <CJK>
+0x98FC 0x50B2 # <CJK>
+0x9940 0x50C9 # <CJK>
+0x9941 0x50CA # <CJK>
+0x9942 0x50B3 # <CJK>
+0x9943 0x50C2 # <CJK>
+0x9944 0x50D6 # <CJK>
+0x9945 0x50DE # <CJK>
+0x9946 0x50E5 # <CJK>
+0x9947 0x50ED # <CJK>
+0x9948 0x50E3 # <CJK>
+0x9949 0x50EE # <CJK>
+0x994A 0x50F9 # <CJK>
+0x994B 0x50F5 # <CJK>
+0x994C 0x5109 # <CJK>
+0x994D 0x5101 # <CJK>
+0x994E 0x5102 # <CJK>
+0x994F 0x5116 # <CJK>
+0x9950 0x5115 # <CJK>
+0x9951 0x5114 # <CJK>
+0x9952 0x511A # <CJK>
+0x9953 0x5121 # <CJK>
+0x9954 0x513A # <CJK>
+0x9955 0x5137 # <CJK>
+0x9956 0x513C # <CJK>
+0x9957 0x513B # <CJK>
+0x9958 0x513F # <CJK>
+0x9959 0x5140 # <CJK>
+0x995A 0x5152 # <CJK>
+0x995B 0x514C # <CJK>
+0x995C 0x5154 # <CJK>
+0x995D 0x5162 # <CJK>
+0x995E 0x7AF8 # <CJK>
+0x995F 0x5169 # <CJK>
+0x9960 0x516A # <CJK>
+0x9961 0x516E # <CJK>
+0x9962 0x5180 # <CJK>
+0x9963 0x5182 # <CJK>
+0x9964 0x56D8 # <CJK>
+0x9965 0x518C # <CJK>
+0x9966 0x5189 # <CJK>
+0x9967 0x518F # <CJK>
+0x9968 0x5191 # <CJK>
+0x9969 0x5193 # <CJK>
+0x996A 0x5195 # <CJK>
+0x996B 0x5196 # <CJK>
+0x996C 0x51A4 # <CJK>
+0x996D 0x51A6 # <CJK>
+0x996E 0x51A2 # <CJK>
+0x996F 0x51A9 # <CJK>
+0x9970 0x51AA # <CJK>
+0x9971 0x51AB # <CJK>
+0x9972 0x51B3 # <CJK>
+0x9973 0x51B1 # <CJK>
+0x9974 0x51B2 # <CJK>
+0x9975 0x51B0 # <CJK>
+0x9976 0x51B5 # <CJK>
+0x9977 0x51BD # <CJK>
+0x9978 0x51C5 # <CJK>
+0x9979 0x51C9 # <CJK>
+0x997A 0x51DB # <CJK>
+0x997B 0x51E0 # <CJK>
+0x997C 0x8655 # <CJK>
+0x997D 0x51E9 # <CJK>
+0x997E 0x51ED # <CJK>
+0x9980 0x51F0 # <CJK>
+0x9981 0x51F5 # <CJK>
+0x9982 0x51FE # <CJK>
+0x9983 0x5204 # <CJK>
+0x9984 0x520B # <CJK>
+0x9985 0x5214 # <CJK>
+0x9986 0x520E # <CJK>
+0x9987 0x5227 # <CJK>
+0x9988 0x522A # <CJK>
+0x9989 0x522E # <CJK>
+0x998A 0x5233 # <CJK>
+0x998B 0x5239 # <CJK>
+0x998C 0x524F # <CJK>
+0x998D 0x5244 # <CJK>
+0x998E 0x524B # <CJK>
+0x998F 0x524C # <CJK>
+0x9990 0x525E # <CJK>
+0x9991 0x5254 # <CJK>
+0x9992 0x526A # <CJK>
+0x9993 0x5274 # <CJK>
+0x9994 0x5269 # <CJK>
+0x9995 0x5273 # <CJK>
+0x9996 0x527F # <CJK>
+0x9997 0x527D # <CJK>
+0x9998 0x528D # <CJK>
+0x9999 0x5294 # <CJK>
+0x999A 0x5292 # <CJK>
+0x999B 0x5271 # <CJK>
+0x999C 0x5288 # <CJK>
+0x999D 0x5291 # <CJK>
+0x999E 0x8FA8 # <CJK>
+0x999F 0x8FA7 # <CJK>
+0x99A0 0x52AC # <CJK>
+0x99A1 0x52AD # <CJK>
+0x99A2 0x52BC # <CJK>
+0x99A3 0x52B5 # <CJK>
+0x99A4 0x52C1 # <CJK>
+0x99A5 0x52CD # <CJK>
+0x99A6 0x52D7 # <CJK>
+0x99A7 0x52DE # <CJK>
+0x99A8 0x52E3 # <CJK>
+0x99A9 0x52E6 # <CJK>
+0x99AA 0x98ED # <CJK>
+0x99AB 0x52E0 # <CJK>
+0x99AC 0x52F3 # <CJK>
+0x99AD 0x52F5 # <CJK>
+0x99AE 0x52F8 # <CJK>
+0x99AF 0x52F9 # <CJK>
+0x99B0 0x5306 # <CJK>
+0x99B1 0x5308 # <CJK>
+0x99B2 0x7538 # <CJK>
+0x99B3 0x530D # <CJK>
+0x99B4 0x5310 # <CJK>
+0x99B5 0x530F # <CJK>
+0x99B6 0x5315 # <CJK>
+0x99B7 0x531A # <CJK>
+0x99B8 0x5323 # <CJK>
+0x99B9 0x532F # <CJK>
+0x99BA 0x5331 # <CJK>
+0x99BB 0x5333 # <CJK>
+0x99BC 0x5338 # <CJK>
+0x99BD 0x5340 # <CJK>
+0x99BE 0x5346 # <CJK>
+0x99BF 0x5345 # <CJK>
+0x99C0 0x4E17 # <CJK>
+0x99C1 0x5349 # <CJK>
+0x99C2 0x534D # <CJK>
+0x99C3 0x51D6 # <CJK>
+0x99C4 0x535E # <CJK>
+0x99C5 0x5369 # <CJK>
+0x99C6 0x536E # <CJK>
+0x99C7 0x5918 # <CJK>
+0x99C8 0x537B # <CJK>
+0x99C9 0x5377 # <CJK>
+0x99CA 0x5382 # <CJK>
+0x99CB 0x5396 # <CJK>
+0x99CC 0x53A0 # <CJK>
+0x99CD 0x53A6 # <CJK>
+0x99CE 0x53A5 # <CJK>
+0x99CF 0x53AE # <CJK>
+0x99D0 0x53B0 # <CJK>
+0x99D1 0x53B6 # <CJK>
+0x99D2 0x53C3 # <CJK>
+0x99D3 0x7C12 # <CJK>
+0x99D4 0x96D9 # <CJK>
+0x99D5 0x53DF # <CJK>
+0x99D6 0x66FC # <CJK>
+0x99D7 0x71EE # <CJK>
+0x99D8 0x53EE # <CJK>
+0x99D9 0x53E8 # <CJK>
+0x99DA 0x53ED # <CJK>
+0x99DB 0x53FA # <CJK>
+0x99DC 0x5401 # <CJK>
+0x99DD 0x543D # <CJK>
+0x99DE 0x5440 # <CJK>
+0x99DF 0x542C # <CJK>
+0x99E0 0x542D # <CJK>
+0x99E1 0x543C # <CJK>
+0x99E2 0x542E # <CJK>
+0x99E3 0x5436 # <CJK>
+0x99E4 0x5429 # <CJK>
+0x99E5 0x541D # <CJK>
+0x99E6 0x544E # <CJK>
+0x99E7 0x548F # <CJK>
+0x99E8 0x5475 # <CJK>
+0x99E9 0x548E # <CJK>
+0x99EA 0x545F # <CJK>
+0x99EB 0x5471 # <CJK>
+0x99EC 0x5477 # <CJK>
+0x99ED 0x5470 # <CJK>
+0x99EE 0x5492 # <CJK>
+0x99EF 0x547B # <CJK>
+0x99F0 0x5480 # <CJK>
+0x99F1 0x5476 # <CJK>
+0x99F2 0x5484 # <CJK>
+0x99F3 0x5490 # <CJK>
+0x99F4 0x5486 # <CJK>
+0x99F5 0x54C7 # <CJK>
+0x99F6 0x54A2 # <CJK>
+0x99F7 0x54B8 # <CJK>
+0x99F8 0x54A5 # <CJK>
+0x99F9 0x54AC # <CJK>
+0x99FA 0x54C4 # <CJK>
+0x99FB 0x54C8 # <CJK>
+0x99FC 0x54A8 # <CJK>
+0x9A40 0x54AB # <CJK>
+0x9A41 0x54C2 # <CJK>
+0x9A42 0x54A4 # <CJK>
+0x9A43 0x54BE # <CJK>
+0x9A44 0x54BC # <CJK>
+0x9A45 0x54D8 # <CJK>
+0x9A46 0x54E5 # <CJK>
+0x9A47 0x54E6 # <CJK>
+0x9A48 0x550F # <CJK>
+0x9A49 0x5514 # <CJK>
+0x9A4A 0x54FD # <CJK>
+0x9A4B 0x54EE # <CJK>
+0x9A4C 0x54ED # <CJK>
+0x9A4D 0x54FA # <CJK>
+0x9A4E 0x54E2 # <CJK>
+0x9A4F 0x5539 # <CJK>
+0x9A50 0x5540 # <CJK>
+0x9A51 0x5563 # <CJK>
+0x9A52 0x554C # <CJK>
+0x9A53 0x552E # <CJK>
+0x9A54 0x555C # <CJK>
+0x9A55 0x5545 # <CJK>
+0x9A56 0x5556 # <CJK>
+0x9A57 0x5557 # <CJK>
+0x9A58 0x5538 # <CJK>
+0x9A59 0x5533 # <CJK>
+0x9A5A 0x555D # <CJK>
+0x9A5B 0x5599 # <CJK>
+0x9A5C 0x5580 # <CJK>
+0x9A5D 0x54AF # <CJK>
+0x9A5E 0x558A # <CJK>
+0x9A5F 0x559F # <CJK>
+0x9A60 0x557B # <CJK>
+0x9A61 0x557E # <CJK>
+0x9A62 0x5598 # <CJK>
+0x9A63 0x559E # <CJK>
+0x9A64 0x55AE # <CJK>
+0x9A65 0x557C # <CJK>
+0x9A66 0x5583 # <CJK>
+0x9A67 0x55A9 # <CJK>
+0x9A68 0x5587 # <CJK>
+0x9A69 0x55A8 # <CJK>
+0x9A6A 0x55DA # <CJK>
+0x9A6B 0x55C5 # <CJK>
+0x9A6C 0x55DF # <CJK>
+0x9A6D 0x55C4 # <CJK>
+0x9A6E 0x55DC # <CJK>
+0x9A6F 0x55E4 # <CJK>
+0x9A70 0x55D4 # <CJK>
+0x9A71 0x5614 # <CJK>
+0x9A72 0x55F7 # <CJK>
+0x9A73 0x5616 # <CJK>
+0x9A74 0x55FE # <CJK>
+0x9A75 0x55FD # <CJK>
+0x9A76 0x561B # <CJK>
+0x9A77 0x55F9 # <CJK>
+0x9A78 0x564E # <CJK>
+0x9A79 0x5650 # <CJK>
+0x9A7A 0x71DF # <CJK>
+0x9A7B 0x5634 # <CJK>
+0x9A7C 0x5636 # <CJK>
+0x9A7D 0x5632 # <CJK>
+0x9A7E 0x5638 # <CJK>
+0x9A80 0x566B # <CJK>
+0x9A81 0x5664 # <CJK>
+0x9A82 0x562F # <CJK>
+0x9A83 0x566C # <CJK>
+0x9A84 0x566A # <CJK>
+0x9A85 0x5686 # <CJK>
+0x9A86 0x5680 # <CJK>
+0x9A87 0x568A # <CJK>
+0x9A88 0x56A0 # <CJK>
+0x9A89 0x5694 # <CJK>
+0x9A8A 0x568F # <CJK>
+0x9A8B 0x56A5 # <CJK>
+0x9A8C 0x56AE # <CJK>
+0x9A8D 0x56B6 # <CJK>
+0x9A8E 0x56B4 # <CJK>
+0x9A8F 0x56C2 # <CJK>
+0x9A90 0x56BC # <CJK>
+0x9A91 0x56C1 # <CJK>
+0x9A92 0x56C3 # <CJK>
+0x9A93 0x56C0 # <CJK>
+0x9A94 0x56C8 # <CJK>
+0x9A95 0x56CE # <CJK>
+0x9A96 0x56D1 # <CJK>
+0x9A97 0x56D3 # <CJK>
+0x9A98 0x56D7 # <CJK>
+0x9A99 0x56EE # <CJK>
+0x9A9A 0x56F9 # <CJK>
+0x9A9B 0x5700 # <CJK>
+0x9A9C 0x56FF # <CJK>
+0x9A9D 0x5704 # <CJK>
+0x9A9E 0x5709 # <CJK>
+0x9A9F 0x5708 # <CJK>
+0x9AA0 0x570B # <CJK>
+0x9AA1 0x570D # <CJK>
+0x9AA2 0x5713 # <CJK>
+0x9AA3 0x5718 # <CJK>
+0x9AA4 0x5716 # <CJK>
+0x9AA5 0x55C7 # <CJK>
+0x9AA6 0x571C # <CJK>
+0x9AA7 0x5726 # <CJK>
+0x9AA8 0x5737 # <CJK>
+0x9AA9 0x5738 # <CJK>
+0x9AAA 0x574E # <CJK>
+0x9AAB 0x573B # <CJK>
+0x9AAC 0x5740 # <CJK>
+0x9AAD 0x574F # <CJK>
+0x9AAE 0x5769 # <CJK>
+0x9AAF 0x57C0 # <CJK>
+0x9AB0 0x5788 # <CJK>
+0x9AB1 0x5761 # <CJK>
+0x9AB2 0x577F # <CJK>
+0x9AB3 0x5789 # <CJK>
+0x9AB4 0x5793 # <CJK>
+0x9AB5 0x57A0 # <CJK>
+0x9AB6 0x57B3 # <CJK>
+0x9AB7 0x57A4 # <CJK>
+0x9AB8 0x57AA # <CJK>
+0x9AB9 0x57B0 # <CJK>
+0x9ABA 0x57C3 # <CJK>
+0x9ABB 0x57C6 # <CJK>
+0x9ABC 0x57D4 # <CJK>
+0x9ABD 0x57D2 # <CJK>
+0x9ABE 0x57D3 # <CJK>
+0x9ABF 0x580A # <CJK>
+0x9AC0 0x57D6 # <CJK>
+0x9AC1 0x57E3 # <CJK>
+0x9AC2 0x580B # <CJK>
+0x9AC3 0x5819 # <CJK>
+0x9AC4 0x581D # <CJK>
+0x9AC5 0x5872 # <CJK>
+0x9AC6 0x5821 # <CJK>
+0x9AC7 0x5862 # <CJK>
+0x9AC8 0x584B # <CJK>
+0x9AC9 0x5870 # <CJK>
+0x9ACA 0x6BC0 # <CJK>
+0x9ACB 0x5852 # <CJK>
+0x9ACC 0x583D # <CJK>
+0x9ACD 0x5879 # <CJK>
+0x9ACE 0x5885 # <CJK>
+0x9ACF 0x58B9 # <CJK>
+0x9AD0 0x589F # <CJK>
+0x9AD1 0x58AB # <CJK>
+0x9AD2 0x58BA # <CJK>
+0x9AD3 0x58DE # <CJK>
+0x9AD4 0x58BB # <CJK>
+0x9AD5 0x58B8 # <CJK>
+0x9AD6 0x58AE # <CJK>
+0x9AD7 0x58C5 # <CJK>
+0x9AD8 0x58D3 # <CJK>
+0x9AD9 0x58D1 # <CJK>
+0x9ADA 0x58D7 # <CJK>
+0x9ADB 0x58D9 # <CJK>
+0x9ADC 0x58D8 # <CJK>
+0x9ADD 0x58E5 # <CJK>
+0x9ADE 0x58DC # <CJK>
+0x9ADF 0x58E4 # <CJK>
+0x9AE0 0x58DF # <CJK>
+0x9AE1 0x58EF # <CJK>
+0x9AE2 0x58FA # <CJK>
+0x9AE3 0x58F9 # <CJK>
+0x9AE4 0x58FB # <CJK>
+0x9AE5 0x58FC # <CJK>
+0x9AE6 0x58FD # <CJK>
+0x9AE7 0x5902 # <CJK>
+0x9AE8 0x590A # <CJK>
+0x9AE9 0x5910 # <CJK>
+0x9AEA 0x591B # <CJK>
+0x9AEB 0x68A6 # <CJK>
+0x9AEC 0x5925 # <CJK>
+0x9AED 0x592C # <CJK>
+0x9AEE 0x592D # <CJK>
+0x9AEF 0x5932 # <CJK>
+0x9AF0 0x5938 # <CJK>
+0x9AF1 0x593E # <CJK>
+0x9AF2 0x7AD2 # <CJK>
+0x9AF3 0x5955 # <CJK>
+0x9AF4 0x5950 # <CJK>
+0x9AF5 0x594E # <CJK>
+0x9AF6 0x595A # <CJK>
+0x9AF7 0x5958 # <CJK>
+0x9AF8 0x5962 # <CJK>
+0x9AF9 0x5960 # <CJK>
+0x9AFA 0x5967 # <CJK>
+0x9AFB 0x596C # <CJK>
+0x9AFC 0x5969 # <CJK>
+0x9B40 0x5978 # <CJK>
+0x9B41 0x5981 # <CJK>
+0x9B42 0x599D # <CJK>
+0x9B43 0x4F5E # <CJK>
+0x9B44 0x4FAB # <CJK>
+0x9B45 0x59A3 # <CJK>
+0x9B46 0x59B2 # <CJK>
+0x9B47 0x59C6 # <CJK>
+0x9B48 0x59E8 # <CJK>
+0x9B49 0x59DC # <CJK>
+0x9B4A 0x598D # <CJK>
+0x9B4B 0x59D9 # <CJK>
+0x9B4C 0x59DA # <CJK>
+0x9B4D 0x5A25 # <CJK>
+0x9B4E 0x5A1F # <CJK>
+0x9B4F 0x5A11 # <CJK>
+0x9B50 0x5A1C # <CJK>
+0x9B51 0x5A09 # <CJK>
+0x9B52 0x5A1A # <CJK>
+0x9B53 0x5A40 # <CJK>
+0x9B54 0x5A6C # <CJK>
+0x9B55 0x5A49 # <CJK>
+0x9B56 0x5A35 # <CJK>
+0x9B57 0x5A36 # <CJK>
+0x9B58 0x5A62 # <CJK>
+0x9B59 0x5A6A # <CJK>
+0x9B5A 0x5A9A # <CJK>
+0x9B5B 0x5ABC # <CJK>
+0x9B5C 0x5ABE # <CJK>
+0x9B5D 0x5ACB # <CJK>
+0x9B5E 0x5AC2 # <CJK>
+0x9B5F 0x5ABD # <CJK>
+0x9B60 0x5AE3 # <CJK>
+0x9B61 0x5AD7 # <CJK>
+0x9B62 0x5AE6 # <CJK>
+0x9B63 0x5AE9 # <CJK>
+0x9B64 0x5AD6 # <CJK>
+0x9B65 0x5AFA # <CJK>
+0x9B66 0x5AFB # <CJK>
+0x9B67 0x5B0C # <CJK>
+0x9B68 0x5B0B # <CJK>
+0x9B69 0x5B16 # <CJK>
+0x9B6A 0x5B32 # <CJK>
+0x9B6B 0x5AD0 # <CJK>
+0x9B6C 0x5B2A # <CJK>
+0x9B6D 0x5B36 # <CJK>
+0x9B6E 0x5B3E # <CJK>
+0x9B6F 0x5B43 # <CJK>
+0x9B70 0x5B45 # <CJK>
+0x9B71 0x5B40 # <CJK>
+0x9B72 0x5B51 # <CJK>
+0x9B73 0x5B55 # <CJK>
+0x9B74 0x5B5A # <CJK>
+0x9B75 0x5B5B # <CJK>
+0x9B76 0x5B65 # <CJK>
+0x9B77 0x5B69 # <CJK>
+0x9B78 0x5B70 # <CJK>
+0x9B79 0x5B73 # <CJK>
+0x9B7A 0x5B75 # <CJK>
+0x9B7B 0x5B78 # <CJK>
+0x9B7C 0x6588 # <CJK>
+0x9B7D 0x5B7A # <CJK>
+0x9B7E 0x5B80 # <CJK>
+0x9B80 0x5B83 # <CJK>
+0x9B81 0x5BA6 # <CJK>
+0x9B82 0x5BB8 # <CJK>
+0x9B83 0x5BC3 # <CJK>
+0x9B84 0x5BC7 # <CJK>
+0x9B85 0x5BC9 # <CJK>
+0x9B86 0x5BD4 # <CJK>
+0x9B87 0x5BD0 # <CJK>
+0x9B88 0x5BE4 # <CJK>
+0x9B89 0x5BE6 # <CJK>
+0x9B8A 0x5BE2 # <CJK>
+0x9B8B 0x5BDE # <CJK>
+0x9B8C 0x5BE5 # <CJK>
+0x9B8D 0x5BEB # <CJK>
+0x9B8E 0x5BF0 # <CJK>
+0x9B8F 0x5BF6 # <CJK>
+0x9B90 0x5BF3 # <CJK>
+0x9B91 0x5C05 # <CJK>
+0x9B92 0x5C07 # <CJK>
+0x9B93 0x5C08 # <CJK>
+0x9B94 0x5C0D # <CJK>
+0x9B95 0x5C13 # <CJK>
+0x9B96 0x5C20 # <CJK>
+0x9B97 0x5C22 # <CJK>
+0x9B98 0x5C28 # <CJK>
+0x9B99 0x5C38 # <CJK>
+0x9B9A 0x5C39 # <CJK>
+0x9B9B 0x5C41 # <CJK>
+0x9B9C 0x5C46 # <CJK>
+0x9B9D 0x5C4E # <CJK>
+0x9B9E 0x5C53 # <CJK>
+0x9B9F 0x5C50 # <CJK>
+0x9BA0 0x5C4F # <CJK>
+0x9BA1 0x5B71 # <CJK>
+0x9BA2 0x5C6C # <CJK>
+0x9BA3 0x5C6E # <CJK>
+0x9BA4 0x4E62 # <CJK>
+0x9BA5 0x5C76 # <CJK>
+0x9BA6 0x5C79 # <CJK>
+0x9BA7 0x5C8C # <CJK>
+0x9BA8 0x5C91 # <CJK>
+0x9BA9 0x5C94 # <CJK>
+0x9BAA 0x599B # <CJK>
+0x9BAB 0x5CAB # <CJK>
+0x9BAC 0x5CBB # <CJK>
+0x9BAD 0x5CB6 # <CJK>
+0x9BAE 0x5CBC # <CJK>
+0x9BAF 0x5CB7 # <CJK>
+0x9BB0 0x5CC5 # <CJK>
+0x9BB1 0x5CBE # <CJK>
+0x9BB2 0x5CC7 # <CJK>
+0x9BB3 0x5CD9 # <CJK>
+0x9BB4 0x5CE9 # <CJK>
+0x9BB5 0x5CFD # <CJK>
+0x9BB6 0x5CFA # <CJK>
+0x9BB7 0x5CED # <CJK>
+0x9BB8 0x5D8C # <CJK>
+0x9BB9 0x5CEA # <CJK>
+0x9BBA 0x5D0B # <CJK>
+0x9BBB 0x5D15 # <CJK>
+0x9BBC 0x5D17 # <CJK>
+0x9BBD 0x5D5C # <CJK>
+0x9BBE 0x5D1F # <CJK>
+0x9BBF 0x5D1B # <CJK>
+0x9BC0 0x5D11 # <CJK>
+0x9BC1 0x5D14 # <CJK>
+0x9BC2 0x5D22 # <CJK>
+0x9BC3 0x5D1A # <CJK>
+0x9BC4 0x5D19 # <CJK>
+0x9BC5 0x5D18 # <CJK>
+0x9BC6 0x5D4C # <CJK>
+0x9BC7 0x5D52 # <CJK>
+0x9BC8 0x5D4E # <CJK>
+0x9BC9 0x5D4B # <CJK>
+0x9BCA 0x5D6C # <CJK>
+0x9BCB 0x5D73 # <CJK>
+0x9BCC 0x5D76 # <CJK>
+0x9BCD 0x5D87 # <CJK>
+0x9BCE 0x5D84 # <CJK>
+0x9BCF 0x5D82 # <CJK>
+0x9BD0 0x5DA2 # <CJK>
+0x9BD1 0x5D9D # <CJK>
+0x9BD2 0x5DAC # <CJK>
+0x9BD3 0x5DAE # <CJK>
+0x9BD4 0x5DBD # <CJK>
+0x9BD5 0x5D90 # <CJK>
+0x9BD6 0x5DB7 # <CJK>
+0x9BD7 0x5DBC # <CJK>
+0x9BD8 0x5DC9 # <CJK>
+0x9BD9 0x5DCD # <CJK>
+0x9BDA 0x5DD3 # <CJK>
+0x9BDB 0x5DD2 # <CJK>
+0x9BDC 0x5DD6 # <CJK>
+0x9BDD 0x5DDB # <CJK>
+0x9BDE 0x5DEB # <CJK>
+0x9BDF 0x5DF2 # <CJK>
+0x9BE0 0x5DF5 # <CJK>
+0x9BE1 0x5E0B # <CJK>
+0x9BE2 0x5E1A # <CJK>
+0x9BE3 0x5E19 # <CJK>
+0x9BE4 0x5E11 # <CJK>
+0x9BE5 0x5E1B # <CJK>
+0x9BE6 0x5E36 # <CJK>
+0x9BE7 0x5E37 # <CJK>
+0x9BE8 0x5E44 # <CJK>
+0x9BE9 0x5E43 # <CJK>
+0x9BEA 0x5E40 # <CJK>
+0x9BEB 0x5E4E # <CJK>
+0x9BEC 0x5E57 # <CJK>
+0x9BED 0x5E54 # <CJK>
+0x9BEE 0x5E5F # <CJK>
+0x9BEF 0x5E62 # <CJK>
+0x9BF0 0x5E64 # <CJK>
+0x9BF1 0x5E47 # <CJK>
+0x9BF2 0x5E75 # <CJK>
+0x9BF3 0x5E76 # <CJK>
+0x9BF4 0x5E7A # <CJK>
+0x9BF5 0x9EBC # <CJK>
+0x9BF6 0x5E7F # <CJK>
+0x9BF7 0x5EA0 # <CJK>
+0x9BF8 0x5EC1 # <CJK>
+0x9BF9 0x5EC2 # <CJK>
+0x9BFA 0x5EC8 # <CJK>
+0x9BFB 0x5ED0 # <CJK>
+0x9BFC 0x5ECF # <CJK>
+0x9C40 0x5ED6 # <CJK>
+0x9C41 0x5EE3 # <CJK>
+0x9C42 0x5EDD # <CJK>
+0x9C43 0x5EDA # <CJK>
+0x9C44 0x5EDB # <CJK>
+0x9C45 0x5EE2 # <CJK>
+0x9C46 0x5EE1 # <CJK>
+0x9C47 0x5EE8 # <CJK>
+0x9C48 0x5EE9 # <CJK>
+0x9C49 0x5EEC # <CJK>
+0x9C4A 0x5EF1 # <CJK>
+0x9C4B 0x5EF3 # <CJK>
+0x9C4C 0x5EF0 # <CJK>
+0x9C4D 0x5EF4 # <CJK>
+0x9C4E 0x5EF8 # <CJK>
+0x9C4F 0x5EFE # <CJK>
+0x9C50 0x5F03 # <CJK>
+0x9C51 0x5F09 # <CJK>
+0x9C52 0x5F5D # <CJK>
+0x9C53 0x5F5C # <CJK>
+0x9C54 0x5F0B # <CJK>
+0x9C55 0x5F11 # <CJK>
+0x9C56 0x5F16 # <CJK>
+0x9C57 0x5F29 # <CJK>
+0x9C58 0x5F2D # <CJK>
+0x9C59 0x5F38 # <CJK>
+0x9C5A 0x5F41 # <CJK>
+0x9C5B 0x5F48 # <CJK>
+0x9C5C 0x5F4C # <CJK>
+0x9C5D 0x5F4E # <CJK>
+0x9C5E 0x5F2F # <CJK>
+0x9C5F 0x5F51 # <CJK>
+0x9C60 0x5F56 # <CJK>
+0x9C61 0x5F57 # <CJK>
+0x9C62 0x5F59 # <CJK>
+0x9C63 0x5F61 # <CJK>
+0x9C64 0x5F6D # <CJK>
+0x9C65 0x5F73 # <CJK>
+0x9C66 0x5F77 # <CJK>
+0x9C67 0x5F83 # <CJK>
+0x9C68 0x5F82 # <CJK>
+0x9C69 0x5F7F # <CJK>
+0x9C6A 0x5F8A # <CJK>
+0x9C6B 0x5F88 # <CJK>
+0x9C6C 0x5F91 # <CJK>
+0x9C6D 0x5F87 # <CJK>
+0x9C6E 0x5F9E # <CJK>
+0x9C6F 0x5F99 # <CJK>
+0x9C70 0x5F98 # <CJK>
+0x9C71 0x5FA0 # <CJK>
+0x9C72 0x5FA8 # <CJK>
+0x9C73 0x5FAD # <CJK>
+0x9C74 0x5FBC # <CJK>
+0x9C75 0x5FD6 # <CJK>
+0x9C76 0x5FFB # <CJK>
+0x9C77 0x5FE4 # <CJK>
+0x9C78 0x5FF8 # <CJK>
+0x9C79 0x5FF1 # <CJK>
+0x9C7A 0x5FDD # <CJK>
+0x9C7B 0x60B3 # <CJK>
+0x9C7C 0x5FFF # <CJK>
+0x9C7D 0x6021 # <CJK>
+0x9C7E 0x6060 # <CJK>
+0x9C80 0x6019 # <CJK>
+0x9C81 0x6010 # <CJK>
+0x9C82 0x6029 # <CJK>
+0x9C83 0x600E # <CJK>
+0x9C84 0x6031 # <CJK>
+0x9C85 0x601B # <CJK>
+0x9C86 0x6015 # <CJK>
+0x9C87 0x602B # <CJK>
+0x9C88 0x6026 # <CJK>
+0x9C89 0x600F # <CJK>
+0x9C8A 0x603A # <CJK>
+0x9C8B 0x605A # <CJK>
+0x9C8C 0x6041 # <CJK>
+0x9C8D 0x606A # <CJK>
+0x9C8E 0x6077 # <CJK>
+0x9C8F 0x605F # <CJK>
+0x9C90 0x604A # <CJK>
+0x9C91 0x6046 # <CJK>
+0x9C92 0x604D # <CJK>
+0x9C93 0x6063 # <CJK>
+0x9C94 0x6043 # <CJK>
+0x9C95 0x6064 # <CJK>
+0x9C96 0x6042 # <CJK>
+0x9C97 0x606C # <CJK>
+0x9C98 0x606B # <CJK>
+0x9C99 0x6059 # <CJK>
+0x9C9A 0x6081 # <CJK>
+0x9C9B 0x608D # <CJK>
+0x9C9C 0x60E7 # <CJK>
+0x9C9D 0x6083 # <CJK>
+0x9C9E 0x609A # <CJK>
+0x9C9F 0x6084 # <CJK>
+0x9CA0 0x609B # <CJK>
+0x9CA1 0x6096 # <CJK>
+0x9CA2 0x6097 # <CJK>
+0x9CA3 0x6092 # <CJK>
+0x9CA4 0x60A7 # <CJK>
+0x9CA5 0x608B # <CJK>
+0x9CA6 0x60E1 # <CJK>
+0x9CA7 0x60B8 # <CJK>
+0x9CA8 0x60E0 # <CJK>
+0x9CA9 0x60D3 # <CJK>
+0x9CAA 0x60B4 # <CJK>
+0x9CAB 0x5FF0 # <CJK>
+0x9CAC 0x60BD # <CJK>
+0x9CAD 0x60C6 # <CJK>
+0x9CAE 0x60B5 # <CJK>
+0x9CAF 0x60D8 # <CJK>
+0x9CB0 0x614D # <CJK>
+0x9CB1 0x6115 # <CJK>
+0x9CB2 0x6106 # <CJK>
+0x9CB3 0x60F6 # <CJK>
+0x9CB4 0x60F7 # <CJK>
+0x9CB5 0x6100 # <CJK>
+0x9CB6 0x60F4 # <CJK>
+0x9CB7 0x60FA # <CJK>
+0x9CB8 0x6103 # <CJK>
+0x9CB9 0x6121 # <CJK>
+0x9CBA 0x60FB # <CJK>
+0x9CBB 0x60F1 # <CJK>
+0x9CBC 0x610D # <CJK>
+0x9CBD 0x610E # <CJK>
+0x9CBE 0x6147 # <CJK>
+0x9CBF 0x613E # <CJK>
+0x9CC0 0x6128 # <CJK>
+0x9CC1 0x6127 # <CJK>
+0x9CC2 0x614A # <CJK>
+0x9CC3 0x613F # <CJK>
+0x9CC4 0x613C # <CJK>
+0x9CC5 0x612C # <CJK>
+0x9CC6 0x6134 # <CJK>
+0x9CC7 0x613D # <CJK>
+0x9CC8 0x6142 # <CJK>
+0x9CC9 0x6144 # <CJK>
+0x9CCA 0x6173 # <CJK>
+0x9CCB 0x6177 # <CJK>
+0x9CCC 0x6158 # <CJK>
+0x9CCD 0x6159 # <CJK>
+0x9CCE 0x615A # <CJK>
+0x9CCF 0x616B # <CJK>
+0x9CD0 0x6174 # <CJK>
+0x9CD1 0x616F # <CJK>
+0x9CD2 0x6165 # <CJK>
+0x9CD3 0x6171 # <CJK>
+0x9CD4 0x615F # <CJK>
+0x9CD5 0x615D # <CJK>
+0x9CD6 0x6153 # <CJK>
+0x9CD7 0x6175 # <CJK>
+0x9CD8 0x6199 # <CJK>
+0x9CD9 0x6196 # <CJK>
+0x9CDA 0x6187 # <CJK>
+0x9CDB 0x61AC # <CJK>
+0x9CDC 0x6194 # <CJK>
+0x9CDD 0x619A # <CJK>
+0x9CDE 0x618A # <CJK>
+0x9CDF 0x6191 # <CJK>
+0x9CE0 0x61AB # <CJK>
+0x9CE1 0x61AE # <CJK>
+0x9CE2 0x61CC # <CJK>
+0x9CE3 0x61CA # <CJK>
+0x9CE4 0x61C9 # <CJK>
+0x9CE5 0x61F7 # <CJK>
+0x9CE6 0x61C8 # <CJK>
+0x9CE7 0x61C3 # <CJK>
+0x9CE8 0x61C6 # <CJK>
+0x9CE9 0x61BA # <CJK>
+0x9CEA 0x61CB # <CJK>
+0x9CEB 0x7F79 # <CJK>
+0x9CEC 0x61CD # <CJK>
+0x9CED 0x61E6 # <CJK>
+0x9CEE 0x61E3 # <CJK>
+0x9CEF 0x61F6 # <CJK>
+0x9CF0 0x61FA # <CJK>
+0x9CF1 0x61F4 # <CJK>
+0x9CF2 0x61FF # <CJK>
+0x9CF3 0x61FD # <CJK>
+0x9CF4 0x61FC # <CJK>
+0x9CF5 0x61FE # <CJK>
+0x9CF6 0x6200 # <CJK>
+0x9CF7 0x6208 # <CJK>
+0x9CF8 0x6209 # <CJK>
+0x9CF9 0x620D # <CJK>
+0x9CFA 0x620C # <CJK>
+0x9CFB 0x6214 # <CJK>
+0x9CFC 0x621B # <CJK>
+0x9D40 0x621E # <CJK>
+0x9D41 0x6221 # <CJK>
+0x9D42 0x622A # <CJK>
+0x9D43 0x622E # <CJK>
+0x9D44 0x6230 # <CJK>
+0x9D45 0x6232 # <CJK>
+0x9D46 0x6233 # <CJK>
+0x9D47 0x6241 # <CJK>
+0x9D48 0x624E # <CJK>
+0x9D49 0x625E # <CJK>
+0x9D4A 0x6263 # <CJK>
+0x9D4B 0x625B # <CJK>
+0x9D4C 0x6260 # <CJK>
+0x9D4D 0x6268 # <CJK>
+0x9D4E 0x627C # <CJK>
+0x9D4F 0x6282 # <CJK>
+0x9D50 0x6289 # <CJK>
+0x9D51 0x627E # <CJK>
+0x9D52 0x6292 # <CJK>
+0x9D53 0x6293 # <CJK>
+0x9D54 0x6296 # <CJK>
+0x9D55 0x62D4 # <CJK>
+0x9D56 0x6283 # <CJK>
+0x9D57 0x6294 # <CJK>
+0x9D58 0x62D7 # <CJK>
+0x9D59 0x62D1 # <CJK>
+0x9D5A 0x62BB # <CJK>
+0x9D5B 0x62CF # <CJK>
+0x9D5C 0x62FF # <CJK>
+0x9D5D 0x62C6 # <CJK>
+0x9D5E 0x64D4 # <CJK>
+0x9D5F 0x62C8 # <CJK>
+0x9D60 0x62DC # <CJK>
+0x9D61 0x62CC # <CJK>
+0x9D62 0x62CA # <CJK>
+0x9D63 0x62C2 # <CJK>
+0x9D64 0x62C7 # <CJK>
+0x9D65 0x629B # <CJK>
+0x9D66 0x62C9 # <CJK>
+0x9D67 0x630C # <CJK>
+0x9D68 0x62EE # <CJK>
+0x9D69 0x62F1 # <CJK>
+0x9D6A 0x6327 # <CJK>
+0x9D6B 0x6302 # <CJK>
+0x9D6C 0x6308 # <CJK>
+0x9D6D 0x62EF # <CJK>
+0x9D6E 0x62F5 # <CJK>
+0x9D6F 0x6350 # <CJK>
+0x9D70 0x633E # <CJK>
+0x9D71 0x634D # <CJK>
+0x9D72 0x641C # <CJK>
+0x9D73 0x634F # <CJK>
+0x9D74 0x6396 # <CJK>
+0x9D75 0x638E # <CJK>
+0x9D76 0x6380 # <CJK>
+0x9D77 0x63AB # <CJK>
+0x9D78 0x6376 # <CJK>
+0x9D79 0x63A3 # <CJK>
+0x9D7A 0x638F # <CJK>
+0x9D7B 0x6389 # <CJK>
+0x9D7C 0x639F # <CJK>
+0x9D7D 0x63B5 # <CJK>
+0x9D7E 0x636B # <CJK>
+0x9D80 0x6369 # <CJK>
+0x9D81 0x63BE # <CJK>
+0x9D82 0x63E9 # <CJK>
+0x9D83 0x63C0 # <CJK>
+0x9D84 0x63C6 # <CJK>
+0x9D85 0x63E3 # <CJK>
+0x9D86 0x63C9 # <CJK>
+0x9D87 0x63D2 # <CJK>
+0x9D88 0x63F6 # <CJK>
+0x9D89 0x63C4 # <CJK>
+0x9D8A 0x6416 # <CJK>
+0x9D8B 0x6434 # <CJK>
+0x9D8C 0x6406 # <CJK>
+0x9D8D 0x6413 # <CJK>
+0x9D8E 0x6426 # <CJK>
+0x9D8F 0x6436 # <CJK>
+0x9D90 0x651D # <CJK>
+0x9D91 0x6417 # <CJK>
+0x9D92 0x6428 # <CJK>
+0x9D93 0x640F # <CJK>
+0x9D94 0x6467 # <CJK>
+0x9D95 0x646F # <CJK>
+0x9D96 0x6476 # <CJK>
+0x9D97 0x644E # <CJK>
+0x9D98 0x652A # <CJK>
+0x9D99 0x6495 # <CJK>
+0x9D9A 0x6493 # <CJK>
+0x9D9B 0x64A5 # <CJK>
+0x9D9C 0x64A9 # <CJK>
+0x9D9D 0x6488 # <CJK>
+0x9D9E 0x64BC # <CJK>
+0x9D9F 0x64DA # <CJK>
+0x9DA0 0x64D2 # <CJK>
+0x9DA1 0x64C5 # <CJK>
+0x9DA2 0x64C7 # <CJK>
+0x9DA3 0x64BB # <CJK>
+0x9DA4 0x64D8 # <CJK>
+0x9DA5 0x64C2 # <CJK>
+0x9DA6 0x64F1 # <CJK>
+0x9DA7 0x64E7 # <CJK>
+0x9DA8 0x8209 # <CJK>
+0x9DA9 0x64E0 # <CJK>
+0x9DAA 0x64E1 # <CJK>
+0x9DAB 0x62AC # <CJK>
+0x9DAC 0x64E3 # <CJK>
+0x9DAD 0x64EF # <CJK>
+0x9DAE 0x652C # <CJK>
+0x9DAF 0x64F6 # <CJK>
+0x9DB0 0x64F4 # <CJK>
+0x9DB1 0x64F2 # <CJK>
+0x9DB2 0x64FA # <CJK>
+0x9DB3 0x6500 # <CJK>
+0x9DB4 0x64FD # <CJK>
+0x9DB5 0x6518 # <CJK>
+0x9DB6 0x651C # <CJK>
+0x9DB7 0x6505 # <CJK>
+0x9DB8 0x6524 # <CJK>
+0x9DB9 0x6523 # <CJK>
+0x9DBA 0x652B # <CJK>
+0x9DBB 0x6534 # <CJK>
+0x9DBC 0x6535 # <CJK>
+0x9DBD 0x6537 # <CJK>
+0x9DBE 0x6536 # <CJK>
+0x9DBF 0x6538 # <CJK>
+0x9DC0 0x754B # <CJK>
+0x9DC1 0x6548 # <CJK>
+0x9DC2 0x6556 # <CJK>
+0x9DC3 0x6555 # <CJK>
+0x9DC4 0x654D # <CJK>
+0x9DC5 0x6558 # <CJK>
+0x9DC6 0x655E # <CJK>
+0x9DC7 0x655D # <CJK>
+0x9DC8 0x6572 # <CJK>
+0x9DC9 0x6578 # <CJK>
+0x9DCA 0x6582 # <CJK>
+0x9DCB 0x6583 # <CJK>
+0x9DCC 0x8B8A # <CJK>
+0x9DCD 0x659B # <CJK>
+0x9DCE 0x659F # <CJK>
+0x9DCF 0x65AB # <CJK>
+0x9DD0 0x65B7 # <CJK>
+0x9DD1 0x65C3 # <CJK>
+0x9DD2 0x65C6 # <CJK>
+0x9DD3 0x65C1 # <CJK>
+0x9DD4 0x65C4 # <CJK>
+0x9DD5 0x65CC # <CJK>
+0x9DD6 0x65D2 # <CJK>
+0x9DD7 0x65DB # <CJK>
+0x9DD8 0x65D9 # <CJK>
+0x9DD9 0x65E0 # <CJK>
+0x9DDA 0x65E1 # <CJK>
+0x9DDB 0x65F1 # <CJK>
+0x9DDC 0x6772 # <CJK>
+0x9DDD 0x660A # <CJK>
+0x9DDE 0x6603 # <CJK>
+0x9DDF 0x65FB # <CJK>
+0x9DE0 0x6773 # <CJK>
+0x9DE1 0x6635 # <CJK>
+0x9DE2 0x6636 # <CJK>
+0x9DE3 0x6634 # <CJK>
+0x9DE4 0x661C # <CJK>
+0x9DE5 0x664F # <CJK>
+0x9DE6 0x6644 # <CJK>
+0x9DE7 0x6649 # <CJK>
+0x9DE8 0x6641 # <CJK>
+0x9DE9 0x665E # <CJK>
+0x9DEA 0x665D # <CJK>
+0x9DEB 0x6664 # <CJK>
+0x9DEC 0x6667 # <CJK>
+0x9DED 0x6668 # <CJK>
+0x9DEE 0x665F # <CJK>
+0x9DEF 0x6662 # <CJK>
+0x9DF0 0x6670 # <CJK>
+0x9DF1 0x6683 # <CJK>
+0x9DF2 0x6688 # <CJK>
+0x9DF3 0x668E # <CJK>
+0x9DF4 0x6689 # <CJK>
+0x9DF5 0x6684 # <CJK>
+0x9DF6 0x6698 # <CJK>
+0x9DF7 0x669D # <CJK>
+0x9DF8 0x66C1 # <CJK>
+0x9DF9 0x66B9 # <CJK>
+0x9DFA 0x66C9 # <CJK>
+0x9DFB 0x66BE # <CJK>
+0x9DFC 0x66BC # <CJK>
+0x9E40 0x66C4 # <CJK>
+0x9E41 0x66B8 # <CJK>
+0x9E42 0x66D6 # <CJK>
+0x9E43 0x66DA # <CJK>
+0x9E44 0x66E0 # <CJK>
+0x9E45 0x663F # <CJK>
+0x9E46 0x66E6 # <CJK>
+0x9E47 0x66E9 # <CJK>
+0x9E48 0x66F0 # <CJK>
+0x9E49 0x66F5 # <CJK>
+0x9E4A 0x66F7 # <CJK>
+0x9E4B 0x670F # <CJK>
+0x9E4C 0x6716 # <CJK>
+0x9E4D 0x671E # <CJK>
+0x9E4E 0x6726 # <CJK>
+0x9E4F 0x6727 # <CJK>
+0x9E50 0x9738 # <CJK>
+0x9E51 0x672E # <CJK>
+0x9E52 0x673F # <CJK>
+0x9E53 0x6736 # <CJK>
+0x9E54 0x6741 # <CJK>
+0x9E55 0x6738 # <CJK>
+0x9E56 0x6737 # <CJK>
+0x9E57 0x6746 # <CJK>
+0x9E58 0x675E # <CJK>
+0x9E59 0x6760 # <CJK>
+0x9E5A 0x6759 # <CJK>
+0x9E5B 0x6763 # <CJK>
+0x9E5C 0x6764 # <CJK>
+0x9E5D 0x6789 # <CJK>
+0x9E5E 0x6770 # <CJK>
+0x9E5F 0x67A9 # <CJK>
+0x9E60 0x677C # <CJK>
+0x9E61 0x676A # <CJK>
+0x9E62 0x678C # <CJK>
+0x9E63 0x678B # <CJK>
+0x9E64 0x67A6 # <CJK>
+0x9E65 0x67A1 # <CJK>
+0x9E66 0x6785 # <CJK>
+0x9E67 0x67B7 # <CJK>
+0x9E68 0x67EF # <CJK>
+0x9E69 0x67B4 # <CJK>
+0x9E6A 0x67EC # <CJK>
+0x9E6B 0x67B3 # <CJK>
+0x9E6C 0x67E9 # <CJK>
+0x9E6D 0x67B8 # <CJK>
+0x9E6E 0x67E4 # <CJK>
+0x9E6F 0x67DE # <CJK>
+0x9E70 0x67DD # <CJK>
+0x9E71 0x67E2 # <CJK>
+0x9E72 0x67EE # <CJK>
+0x9E73 0x67B9 # <CJK>
+0x9E74 0x67CE # <CJK>
+0x9E75 0x67C6 # <CJK>
+0x9E76 0x67E7 # <CJK>
+0x9E77 0x6A9C # <CJK>
+0x9E78 0x681E # <CJK>
+0x9E79 0x6846 # <CJK>
+0x9E7A 0x6829 # <CJK>
+0x9E7B 0x6840 # <CJK>
+0x9E7C 0x684D # <CJK>
+0x9E7D 0x6832 # <CJK>
+0x9E7E 0x684E # <CJK>
+0x9E80 0x68B3 # <CJK>
+0x9E81 0x682B # <CJK>
+0x9E82 0x6859 # <CJK>
+0x9E83 0x6863 # <CJK>
+0x9E84 0x6877 # <CJK>
+0x9E85 0x687F # <CJK>
+0x9E86 0x689F # <CJK>
+0x9E87 0x688F # <CJK>
+0x9E88 0x68AD # <CJK>
+0x9E89 0x6894 # <CJK>
+0x9E8A 0x689D # <CJK>
+0x9E8B 0x689B # <CJK>
+0x9E8C 0x6883 # <CJK>
+0x9E8D 0x6AAE # <CJK>
+0x9E8E 0x68B9 # <CJK>
+0x9E8F 0x6874 # <CJK>
+0x9E90 0x68B5 # <CJK>
+0x9E91 0x68A0 # <CJK>
+0x9E92 0x68BA # <CJK>
+0x9E93 0x690F # <CJK>
+0x9E94 0x688D # <CJK>
+0x9E95 0x687E # <CJK>
+0x9E96 0x6901 # <CJK>
+0x9E97 0x68CA # <CJK>
+0x9E98 0x6908 # <CJK>
+0x9E99 0x68D8 # <CJK>
+0x9E9A 0x6922 # <CJK>
+0x9E9B 0x6926 # <CJK>
+0x9E9C 0x68E1 # <CJK>
+0x9E9D 0x690C # <CJK>
+0x9E9E 0x68CD # <CJK>
+0x9E9F 0x68D4 # <CJK>
+0x9EA0 0x68E7 # <CJK>
+0x9EA1 0x68D5 # <CJK>
+0x9EA2 0x6936 # <CJK>
+0x9EA3 0x6912 # <CJK>
+0x9EA4 0x6904 # <CJK>
+0x9EA5 0x68D7 # <CJK>
+0x9EA6 0x68E3 # <CJK>
+0x9EA7 0x6925 # <CJK>
+0x9EA8 0x68F9 # <CJK>
+0x9EA9 0x68E0 # <CJK>
+0x9EAA 0x68EF # <CJK>
+0x9EAB 0x6928 # <CJK>
+0x9EAC 0x692A # <CJK>
+0x9EAD 0x691A # <CJK>
+0x9EAE 0x6923 # <CJK>
+0x9EAF 0x6921 # <CJK>
+0x9EB0 0x68C6 # <CJK>
+0x9EB1 0x6979 # <CJK>
+0x9EB2 0x6977 # <CJK>
+0x9EB3 0x695C # <CJK>
+0x9EB4 0x6978 # <CJK>
+0x9EB5 0x696B # <CJK>
+0x9EB6 0x6954 # <CJK>
+0x9EB7 0x697E # <CJK>
+0x9EB8 0x696E # <CJK>
+0x9EB9 0x6939 # <CJK>
+0x9EBA 0x6974 # <CJK>
+0x9EBB 0x693D # <CJK>
+0x9EBC 0x6959 # <CJK>
+0x9EBD 0x6930 # <CJK>
+0x9EBE 0x6961 # <CJK>
+0x9EBF 0x695E # <CJK>
+0x9EC0 0x695D # <CJK>
+0x9EC1 0x6981 # <CJK>
+0x9EC2 0x696A # <CJK>
+0x9EC3 0x69B2 # <CJK>
+0x9EC4 0x69AE # <CJK>
+0x9EC5 0x69D0 # <CJK>
+0x9EC6 0x69BF # <CJK>
+0x9EC7 0x69C1 # <CJK>
+0x9EC8 0x69D3 # <CJK>
+0x9EC9 0x69BE # <CJK>
+0x9ECA 0x69CE # <CJK>
+0x9ECB 0x5BE8 # <CJK>
+0x9ECC 0x69CA # <CJK>
+0x9ECD 0x69DD # <CJK>
+0x9ECE 0x69BB # <CJK>
+0x9ECF 0x69C3 # <CJK>
+0x9ED0 0x69A7 # <CJK>
+0x9ED1 0x6A2E # <CJK>
+0x9ED2 0x6991 # <CJK>
+0x9ED3 0x69A0 # <CJK>
+0x9ED4 0x699C # <CJK>
+0x9ED5 0x6995 # <CJK>
+0x9ED6 0x69B4 # <CJK>
+0x9ED7 0x69DE # <CJK>
+0x9ED8 0x69E8 # <CJK>
+0x9ED9 0x6A02 # <CJK>
+0x9EDA 0x6A1B # <CJK>
+0x9EDB 0x69FF # <CJK>
+0x9EDC 0x6B0A # <CJK>
+0x9EDD 0x69F9 # <CJK>
+0x9EDE 0x69F2 # <CJK>
+0x9EDF 0x69E7 # <CJK>
+0x9EE0 0x6A05 # <CJK>
+0x9EE1 0x69B1 # <CJK>
+0x9EE2 0x6A1E # <CJK>
+0x9EE3 0x69ED # <CJK>
+0x9EE4 0x6A14 # <CJK>
+0x9EE5 0x69EB # <CJK>
+0x9EE6 0x6A0A # <CJK>
+0x9EE7 0x6A12 # <CJK>
+0x9EE8 0x6AC1 # <CJK>
+0x9EE9 0x6A23 # <CJK>
+0x9EEA 0x6A13 # <CJK>
+0x9EEB 0x6A44 # <CJK>
+0x9EEC 0x6A0C # <CJK>
+0x9EED 0x6A72 # <CJK>
+0x9EEE 0x6A36 # <CJK>
+0x9EEF 0x6A78 # <CJK>
+0x9EF0 0x6A47 # <CJK>
+0x9EF1 0x6A62 # <CJK>
+0x9EF2 0x6A59 # <CJK>
+0x9EF3 0x6A66 # <CJK>
+0x9EF4 0x6A48 # <CJK>
+0x9EF5 0x6A38 # <CJK>
+0x9EF6 0x6A22 # <CJK>
+0x9EF7 0x6A90 # <CJK>
+0x9EF8 0x6A8D # <CJK>
+0x9EF9 0x6AA0 # <CJK>
+0x9EFA 0x6A84 # <CJK>
+0x9EFB 0x6AA2 # <CJK>
+0x9EFC 0x6AA3 # <CJK>
+0x9F40 0x6A97 # <CJK>
+0x9F41 0x8617 # <CJK>
+0x9F42 0x6ABB # <CJK>
+0x9F43 0x6AC3 # <CJK>
+0x9F44 0x6AC2 # <CJK>
+0x9F45 0x6AB8 # <CJK>
+0x9F46 0x6AB3 # <CJK>
+0x9F47 0x6AAC # <CJK>
+0x9F48 0x6ADE # <CJK>
+0x9F49 0x6AD1 # <CJK>
+0x9F4A 0x6ADF # <CJK>
+0x9F4B 0x6AAA # <CJK>
+0x9F4C 0x6ADA # <CJK>
+0x9F4D 0x6AEA # <CJK>
+0x9F4E 0x6AFB # <CJK>
+0x9F4F 0x6B05 # <CJK>
+0x9F50 0x8616 # <CJK>
+0x9F51 0x6AFA # <CJK>
+0x9F52 0x6B12 # <CJK>
+0x9F53 0x6B16 # <CJK>
+0x9F54 0x9B31 # <CJK>
+0x9F55 0x6B1F # <CJK>
+0x9F56 0x6B38 # <CJK>
+0x9F57 0x6B37 # <CJK>
+0x9F58 0x76DC # <CJK>
+0x9F59 0x6B39 # <CJK>
+0x9F5A 0x98EE # <CJK>
+0x9F5B 0x6B47 # <CJK>
+0x9F5C 0x6B43 # <CJK>
+0x9F5D 0x6B49 # <CJK>
+0x9F5E 0x6B50 # <CJK>
+0x9F5F 0x6B59 # <CJK>
+0x9F60 0x6B54 # <CJK>
+0x9F61 0x6B5B # <CJK>
+0x9F62 0x6B5F # <CJK>
+0x9F63 0x6B61 # <CJK>
+0x9F64 0x6B78 # <CJK>
+0x9F65 0x6B79 # <CJK>
+0x9F66 0x6B7F # <CJK>
+0x9F67 0x6B80 # <CJK>
+0x9F68 0x6B84 # <CJK>
+0x9F69 0x6B83 # <CJK>
+0x9F6A 0x6B8D # <CJK>
+0x9F6B 0x6B98 # <CJK>
+0x9F6C 0x6B95 # <CJK>
+0x9F6D 0x6B9E # <CJK>
+0x9F6E 0x6BA4 # <CJK>
+0x9F6F 0x6BAA # <CJK>
+0x9F70 0x6BAB # <CJK>
+0x9F71 0x6BAF # <CJK>
+0x9F72 0x6BB2 # <CJK>
+0x9F73 0x6BB1 # <CJK>
+0x9F74 0x6BB3 # <CJK>
+0x9F75 0x6BB7 # <CJK>
+0x9F76 0x6BBC # <CJK>
+0x9F77 0x6BC6 # <CJK>
+0x9F78 0x6BCB # <CJK>
+0x9F79 0x6BD3 # <CJK>
+0x9F7A 0x6BDF # <CJK>
+0x9F7B 0x6BEC # <CJK>
+0x9F7C 0x6BEB # <CJK>
+0x9F7D 0x6BF3 # <CJK>
+0x9F7E 0x6BEF # <CJK>
+0x9F80 0x9EBE # <CJK>
+0x9F81 0x6C08 # <CJK>
+0x9F82 0x6C13 # <CJK>
+0x9F83 0x6C14 # <CJK>
+0x9F84 0x6C1B # <CJK>
+0x9F85 0x6C24 # <CJK>
+0x9F86 0x6C23 # <CJK>
+0x9F87 0x6C5E # <CJK>
+0x9F88 0x6C55 # <CJK>
+0x9F89 0x6C62 # <CJK>
+0x9F8A 0x6C6A # <CJK>
+0x9F8B 0x6C82 # <CJK>
+0x9F8C 0x6C8D # <CJK>
+0x9F8D 0x6C9A # <CJK>
+0x9F8E 0x6C81 # <CJK>
+0x9F8F 0x6C9B # <CJK>
+0x9F90 0x6C7E # <CJK>
+0x9F91 0x6C68 # <CJK>
+0x9F92 0x6C73 # <CJK>
+0x9F93 0x6C92 # <CJK>
+0x9F94 0x6C90 # <CJK>
+0x9F95 0x6CC4 # <CJK>
+0x9F96 0x6CF1 # <CJK>
+0x9F97 0x6CD3 # <CJK>
+0x9F98 0x6CBD # <CJK>
+0x9F99 0x6CD7 # <CJK>
+0x9F9A 0x6CC5 # <CJK>
+0x9F9B 0x6CDD # <CJK>
+0x9F9C 0x6CAE # <CJK>
+0x9F9D 0x6CB1 # <CJK>
+0x9F9E 0x6CBE # <CJK>
+0x9F9F 0x6CBA # <CJK>
+0x9FA0 0x6CDB # <CJK>
+0x9FA1 0x6CEF # <CJK>
+0x9FA2 0x6CD9 # <CJK>
+0x9FA3 0x6CEA # <CJK>
+0x9FA4 0x6D1F # <CJK>
+0x9FA5 0x884D # <CJK>
+0x9FA6 0x6D36 # <CJK>
+0x9FA7 0x6D2B # <CJK>
+0x9FA8 0x6D3D # <CJK>
+0x9FA9 0x6D38 # <CJK>
+0x9FAA 0x6D19 # <CJK>
+0x9FAB 0x6D35 # <CJK>
+0x9FAC 0x6D33 # <CJK>
+0x9FAD 0x6D12 # <CJK>
+0x9FAE 0x6D0C # <CJK>
+0x9FAF 0x6D63 # <CJK>
+0x9FB0 0x6D93 # <CJK>
+0x9FB1 0x6D64 # <CJK>
+0x9FB2 0x6D5A # <CJK>
+0x9FB3 0x6D79 # <CJK>
+0x9FB4 0x6D59 # <CJK>
+0x9FB5 0x6D8E # <CJK>
+0x9FB6 0x6D95 # <CJK>
+0x9FB7 0x6FE4 # <CJK>
+0x9FB8 0x6D85 # <CJK>
+0x9FB9 0x6DF9 # <CJK>
+0x9FBA 0x6E15 # <CJK>
+0x9FBB 0x6E0A # <CJK>
+0x9FBC 0x6DB5 # <CJK>
+0x9FBD 0x6DC7 # <CJK>
+0x9FBE 0x6DE6 # <CJK>
+0x9FBF 0x6DB8 # <CJK>
+0x9FC0 0x6DC6 # <CJK>
+0x9FC1 0x6DEC # <CJK>
+0x9FC2 0x6DDE # <CJK>
+0x9FC3 0x6DCC # <CJK>
+0x9FC4 0x6DE8 # <CJK>
+0x9FC5 0x6DD2 # <CJK>
+0x9FC6 0x6DC5 # <CJK>
+0x9FC7 0x6DFA # <CJK>
+0x9FC8 0x6DD9 # <CJK>
+0x9FC9 0x6DE4 # <CJK>
+0x9FCA 0x6DD5 # <CJK>
+0x9FCB 0x6DEA # <CJK>
+0x9FCC 0x6DEE # <CJK>
+0x9FCD 0x6E2D # <CJK>
+0x9FCE 0x6E6E # <CJK>
+0x9FCF 0x6E2E # <CJK>
+0x9FD0 0x6E19 # <CJK>
+0x9FD1 0x6E72 # <CJK>
+0x9FD2 0x6E5F # <CJK>
+0x9FD3 0x6E3E # <CJK>
+0x9FD4 0x6E23 # <CJK>
+0x9FD5 0x6E6B # <CJK>
+0x9FD6 0x6E2B # <CJK>
+0x9FD7 0x6E76 # <CJK>
+0x9FD8 0x6E4D # <CJK>
+0x9FD9 0x6E1F # <CJK>
+0x9FDA 0x6E43 # <CJK>
+0x9FDB 0x6E3A # <CJK>
+0x9FDC 0x6E4E # <CJK>
+0x9FDD 0x6E24 # <CJK>
+0x9FDE 0x6EFF # <CJK>
+0x9FDF 0x6E1D # <CJK>
+0x9FE0 0x6E38 # <CJK>
+0x9FE1 0x6E82 # <CJK>
+0x9FE2 0x6EAA # <CJK>
+0x9FE3 0x6E98 # <CJK>
+0x9FE4 0x6EC9 # <CJK>
+0x9FE5 0x6EB7 # <CJK>
+0x9FE6 0x6ED3 # <CJK>
+0x9FE7 0x6EBD # <CJK>
+0x9FE8 0x6EAF # <CJK>
+0x9FE9 0x6EC4 # <CJK>
+0x9FEA 0x6EB2 # <CJK>
+0x9FEB 0x6ED4 # <CJK>
+0x9FEC 0x6ED5 # <CJK>
+0x9FED 0x6E8F # <CJK>
+0x9FEE 0x6EA5 # <CJK>
+0x9FEF 0x6EC2 # <CJK>
+0x9FF0 0x6E9F # <CJK>
+0x9FF1 0x6F41 # <CJK>
+0x9FF2 0x6F11 # <CJK>
+0x9FF3 0x704C # <CJK>
+0x9FF4 0x6EEC # <CJK>
+0x9FF5 0x6EF8 # <CJK>
+0x9FF6 0x6EFE # <CJK>
+0x9FF7 0x6F3F # <CJK>
+0x9FF8 0x6EF2 # <CJK>
+0x9FF9 0x6F31 # <CJK>
+0x9FFA 0x6EEF # <CJK>
+0x9FFB 0x6F32 # <CJK>
+0x9FFC 0x6ECC # <CJK>
+#
+0xE040 0x6F3E # <CJK>
+0xE041 0x6F13 # <CJK>
+0xE042 0x6EF7 # <CJK>
+0xE043 0x6F86 # <CJK>
+0xE044 0x6F7A # <CJK>
+0xE045 0x6F78 # <CJK>
+0xE046 0x6F81 # <CJK>
+0xE047 0x6F80 # <CJK>
+0xE048 0x6F6F # <CJK>
+0xE049 0x6F5B # <CJK>
+0xE04A 0x6FF3 # <CJK>
+0xE04B 0x6F6D # <CJK>
+0xE04C 0x6F82 # <CJK>
+0xE04D 0x6F7C # <CJK>
+0xE04E 0x6F58 # <CJK>
+0xE04F 0x6F8E # <CJK>
+0xE050 0x6F91 # <CJK>
+0xE051 0x6FC2 # <CJK>
+0xE052 0x6F66 # <CJK>
+0xE053 0x6FB3 # <CJK>
+0xE054 0x6FA3 # <CJK>
+0xE055 0x6FA1 # <CJK>
+0xE056 0x6FA4 # <CJK>
+0xE057 0x6FB9 # <CJK>
+0xE058 0x6FC6 # <CJK>
+0xE059 0x6FAA # <CJK>
+0xE05A 0x6FDF # <CJK>
+0xE05B 0x6FD5 # <CJK>
+0xE05C 0x6FEC # <CJK>
+0xE05D 0x6FD4 # <CJK>
+0xE05E 0x6FD8 # <CJK>
+0xE05F 0x6FF1 # <CJK>
+0xE060 0x6FEE # <CJK>
+0xE061 0x6FDB # <CJK>
+0xE062 0x7009 # <CJK>
+0xE063 0x700B # <CJK>
+0xE064 0x6FFA # <CJK>
+0xE065 0x7011 # <CJK>
+0xE066 0x7001 # <CJK>
+0xE067 0x700F # <CJK>
+0xE068 0x6FFE # <CJK>
+0xE069 0x701B # <CJK>
+0xE06A 0x701A # <CJK>
+0xE06B 0x6F74 # <CJK>
+0xE06C 0x701D # <CJK>
+0xE06D 0x7018 # <CJK>
+0xE06E 0x701F # <CJK>
+0xE06F 0x7030 # <CJK>
+0xE070 0x703E # <CJK>
+0xE071 0x7032 # <CJK>
+0xE072 0x7051 # <CJK>
+0xE073 0x7063 # <CJK>
+0xE074 0x7099 # <CJK>
+0xE075 0x7092 # <CJK>
+0xE076 0x70AF # <CJK>
+0xE077 0x70F1 # <CJK>
+0xE078 0x70AC # <CJK>
+0xE079 0x70B8 # <CJK>
+0xE07A 0x70B3 # <CJK>
+0xE07B 0x70AE # <CJK>
+0xE07C 0x70DF # <CJK>
+0xE07D 0x70CB # <CJK>
+0xE07E 0x70DD # <CJK>
+0xE080 0x70D9 # <CJK>
+0xE081 0x7109 # <CJK>
+0xE082 0x70FD # <CJK>
+0xE083 0x711C # <CJK>
+0xE084 0x7119 # <CJK>
+0xE085 0x7165 # <CJK>
+0xE086 0x7155 # <CJK>
+0xE087 0x7188 # <CJK>
+0xE088 0x7166 # <CJK>
+0xE089 0x7162 # <CJK>
+0xE08A 0x714C # <CJK>
+0xE08B 0x7156 # <CJK>
+0xE08C 0x716C # <CJK>
+0xE08D 0x718F # <CJK>
+0xE08E 0x71FB # <CJK>
+0xE08F 0x7184 # <CJK>
+0xE090 0x7195 # <CJK>
+0xE091 0x71A8 # <CJK>
+0xE092 0x71AC # <CJK>
+0xE093 0x71D7 # <CJK>
+0xE094 0x71B9 # <CJK>
+0xE095 0x71BE # <CJK>
+0xE096 0x71D2 # <CJK>
+0xE097 0x71C9 # <CJK>
+0xE098 0x71D4 # <CJK>
+0xE099 0x71CE # <CJK>
+0xE09A 0x71E0 # <CJK>
+0xE09B 0x71EC # <CJK>
+0xE09C 0x71E7 # <CJK>
+0xE09D 0x71F5 # <CJK>
+0xE09E 0x71FC # <CJK>
+0xE09F 0x71F9 # <CJK>
+0xE0A0 0x71FF # <CJK>
+0xE0A1 0x720D # <CJK>
+0xE0A2 0x7210 # <CJK>
+0xE0A3 0x721B # <CJK>
+0xE0A4 0x7228 # <CJK>
+0xE0A5 0x722D # <CJK>
+0xE0A6 0x722C # <CJK>
+0xE0A7 0x7230 # <CJK>
+0xE0A8 0x7232 # <CJK>
+0xE0A9 0x723B # <CJK>
+0xE0AA 0x723C # <CJK>
+0xE0AB 0x723F # <CJK>
+0xE0AC 0x7240 # <CJK>
+0xE0AD 0x7246 # <CJK>
+0xE0AE 0x724B # <CJK>
+0xE0AF 0x7258 # <CJK>
+0xE0B0 0x7274 # <CJK>
+0xE0B1 0x727E # <CJK>
+0xE0B2 0x7282 # <CJK>
+0xE0B3 0x7281 # <CJK>
+0xE0B4 0x7287 # <CJK>
+0xE0B5 0x7292 # <CJK>
+0xE0B6 0x7296 # <CJK>
+0xE0B7 0x72A2 # <CJK>
+0xE0B8 0x72A7 # <CJK>
+0xE0B9 0x72B9 # <CJK>
+0xE0BA 0x72B2 # <CJK>
+0xE0BB 0x72C3 # <CJK>
+0xE0BC 0x72C6 # <CJK>
+0xE0BD 0x72C4 # <CJK>
+0xE0BE 0x72CE # <CJK>
+0xE0BF 0x72D2 # <CJK>
+0xE0C0 0x72E2 # <CJK>
+0xE0C1 0x72E0 # <CJK>
+0xE0C2 0x72E1 # <CJK>
+0xE0C3 0x72F9 # <CJK>
+0xE0C4 0x72F7 # <CJK>
+0xE0C5 0x500F # <CJK>
+0xE0C6 0x7317 # <CJK>
+0xE0C7 0x730A # <CJK>
+0xE0C8 0x731C # <CJK>
+0xE0C9 0x7316 # <CJK>
+0xE0CA 0x731D # <CJK>
+0xE0CB 0x7334 # <CJK>
+0xE0CC 0x732F # <CJK>
+0xE0CD 0x7329 # <CJK>
+0xE0CE 0x7325 # <CJK>
+0xE0CF 0x733E # <CJK>
+0xE0D0 0x734E # <CJK>
+0xE0D1 0x734F # <CJK>
+0xE0D2 0x9ED8 # <CJK>
+0xE0D3 0x7357 # <CJK>
+0xE0D4 0x736A # <CJK>
+0xE0D5 0x7368 # <CJK>
+0xE0D6 0x7370 # <CJK>
+0xE0D7 0x7378 # <CJK>
+0xE0D8 0x7375 # <CJK>
+0xE0D9 0x737B # <CJK>
+0xE0DA 0x737A # <CJK>
+0xE0DB 0x73C8 # <CJK>
+0xE0DC 0x73B3 # <CJK>
+0xE0DD 0x73CE # <CJK>
+0xE0DE 0x73BB # <CJK>
+0xE0DF 0x73C0 # <CJK>
+0xE0E0 0x73E5 # <CJK>
+0xE0E1 0x73EE # <CJK>
+0xE0E2 0x73DE # <CJK>
+0xE0E3 0x74A2 # <CJK>
+0xE0E4 0x7405 # <CJK>
+0xE0E5 0x746F # <CJK>
+0xE0E6 0x7425 # <CJK>
+0xE0E7 0x73F8 # <CJK>
+0xE0E8 0x7432 # <CJK>
+0xE0E9 0x743A # <CJK>
+0xE0EA 0x7455 # <CJK>
+0xE0EB 0x743F # <CJK>
+0xE0EC 0x745F # <CJK>
+0xE0ED 0x7459 # <CJK>
+0xE0EE 0x7441 # <CJK>
+0xE0EF 0x745C # <CJK>
+0xE0F0 0x7469 # <CJK>
+0xE0F1 0x7470 # <CJK>
+0xE0F2 0x7463 # <CJK>
+0xE0F3 0x746A # <CJK>
+0xE0F4 0x7476 # <CJK>
+0xE0F5 0x747E # <CJK>
+0xE0F6 0x748B # <CJK>
+0xE0F7 0x749E # <CJK>
+0xE0F8 0x74A7 # <CJK>
+0xE0F9 0x74CA # <CJK>
+0xE0FA 0x74CF # <CJK>
+0xE0FB 0x74D4 # <CJK>
+0xE0FC 0x73F1 # <CJK>
+0xE140 0x74E0 # <CJK>
+0xE141 0x74E3 # <CJK>
+0xE142 0x74E7 # <CJK>
+0xE143 0x74E9 # <CJK>
+0xE144 0x74EE # <CJK>
+0xE145 0x74F2 # <CJK>
+0xE146 0x74F0 # <CJK>
+0xE147 0x74F1 # <CJK>
+0xE148 0x74F8 # <CJK>
+0xE149 0x74F7 # <CJK>
+0xE14A 0x7504 # <CJK>
+0xE14B 0x7503 # <CJK>
+0xE14C 0x7505 # <CJK>
+0xE14D 0x750C # <CJK>
+0xE14E 0x750E # <CJK>
+0xE14F 0x750D # <CJK>
+0xE150 0x7515 # <CJK>
+0xE151 0x7513 # <CJK>
+0xE152 0x751E # <CJK>
+0xE153 0x7526 # <CJK>
+0xE154 0x752C # <CJK>
+0xE155 0x753C # <CJK>
+0xE156 0x7544 # <CJK>
+0xE157 0x754D # <CJK>
+0xE158 0x754A # <CJK>
+0xE159 0x7549 # <CJK>
+0xE15A 0x755B # <CJK>
+0xE15B 0x7546 # <CJK>
+0xE15C 0x755A # <CJK>
+0xE15D 0x7569 # <CJK>
+0xE15E 0x7564 # <CJK>
+0xE15F 0x7567 # <CJK>
+0xE160 0x756B # <CJK>
+0xE161 0x756D # <CJK>
+0xE162 0x7578 # <CJK>
+0xE163 0x7576 # <CJK>
+0xE164 0x7586 # <CJK>
+0xE165 0x7587 # <CJK>
+0xE166 0x7574 # <CJK>
+0xE167 0x758A # <CJK>
+0xE168 0x7589 # <CJK>
+0xE169 0x7582 # <CJK>
+0xE16A 0x7594 # <CJK>
+0xE16B 0x759A # <CJK>
+0xE16C 0x759D # <CJK>
+0xE16D 0x75A5 # <CJK>
+0xE16E 0x75A3 # <CJK>
+0xE16F 0x75C2 # <CJK>
+0xE170 0x75B3 # <CJK>
+0xE171 0x75C3 # <CJK>
+0xE172 0x75B5 # <CJK>
+0xE173 0x75BD # <CJK>
+0xE174 0x75B8 # <CJK>
+0xE175 0x75BC # <CJK>
+0xE176 0x75B1 # <CJK>
+0xE177 0x75CD # <CJK>
+0xE178 0x75CA # <CJK>
+0xE179 0x75D2 # <CJK>
+0xE17A 0x75D9 # <CJK>
+0xE17B 0x75E3 # <CJK>
+0xE17C 0x75DE # <CJK>
+0xE17D 0x75FE # <CJK>
+0xE17E 0x75FF # <CJK>
+0xE180 0x75FC # <CJK>
+0xE181 0x7601 # <CJK>
+0xE182 0x75F0 # <CJK>
+0xE183 0x75FA # <CJK>
+0xE184 0x75F2 # <CJK>
+0xE185 0x75F3 # <CJK>
+0xE186 0x760B # <CJK>
+0xE187 0x760D # <CJK>
+0xE188 0x7609 # <CJK>
+0xE189 0x761F # <CJK>
+0xE18A 0x7627 # <CJK>
+0xE18B 0x7620 # <CJK>
+0xE18C 0x7621 # <CJK>
+0xE18D 0x7622 # <CJK>
+0xE18E 0x7624 # <CJK>
+0xE18F 0x7634 # <CJK>
+0xE190 0x7630 # <CJK>
+0xE191 0x763B # <CJK>
+0xE192 0x7647 # <CJK>
+0xE193 0x7648 # <CJK>
+0xE194 0x7646 # <CJK>
+0xE195 0x765C # <CJK>
+0xE196 0x7658 # <CJK>
+0xE197 0x7661 # <CJK>
+0xE198 0x7662 # <CJK>
+0xE199 0x7668 # <CJK>
+0xE19A 0x7669 # <CJK>
+0xE19B 0x766A # <CJK>
+0xE19C 0x7667 # <CJK>
+0xE19D 0x766C # <CJK>
+0xE19E 0x7670 # <CJK>
+0xE19F 0x7672 # <CJK>
+0xE1A0 0x7676 # <CJK>
+0xE1A1 0x7678 # <CJK>
+0xE1A2 0x767C # <CJK>
+0xE1A3 0x7680 # <CJK>
+0xE1A4 0x7683 # <CJK>
+0xE1A5 0x7688 # <CJK>
+0xE1A6 0x768B # <CJK>
+0xE1A7 0x768E # <CJK>
+0xE1A8 0x7696 # <CJK>
+0xE1A9 0x7693 # <CJK>
+0xE1AA 0x7699 # <CJK>
+0xE1AB 0x769A # <CJK>
+0xE1AC 0x76B0 # <CJK>
+0xE1AD 0x76B4 # <CJK>
+0xE1AE 0x76B8 # <CJK>
+0xE1AF 0x76B9 # <CJK>
+0xE1B0 0x76BA # <CJK>
+0xE1B1 0x76C2 # <CJK>
+0xE1B2 0x76CD # <CJK>
+0xE1B3 0x76D6 # <CJK>
+0xE1B4 0x76D2 # <CJK>
+0xE1B5 0x76DE # <CJK>
+0xE1B6 0x76E1 # <CJK>
+0xE1B7 0x76E5 # <CJK>
+0xE1B8 0x76E7 # <CJK>
+0xE1B9 0x76EA # <CJK>
+0xE1BA 0x862F # <CJK>
+0xE1BB 0x76FB # <CJK>
+0xE1BC 0x7708 # <CJK>
+0xE1BD 0x7707 # <CJK>
+0xE1BE 0x7704 # <CJK>
+0xE1BF 0x7729 # <CJK>
+0xE1C0 0x7724 # <CJK>
+0xE1C1 0x771E # <CJK>
+0xE1C2 0x7725 # <CJK>
+0xE1C3 0x7726 # <CJK>
+0xE1C4 0x771B # <CJK>
+0xE1C5 0x7737 # <CJK>
+0xE1C6 0x7738 # <CJK>
+0xE1C7 0x7747 # <CJK>
+0xE1C8 0x775A # <CJK>
+0xE1C9 0x7768 # <CJK>
+0xE1CA 0x776B # <CJK>
+0xE1CB 0x775B # <CJK>
+0xE1CC 0x7765 # <CJK>
+0xE1CD 0x777F # <CJK>
+0xE1CE 0x777E # <CJK>
+0xE1CF 0x7779 # <CJK>
+0xE1D0 0x778E # <CJK>
+0xE1D1 0x778B # <CJK>
+0xE1D2 0x7791 # <CJK>
+0xE1D3 0x77A0 # <CJK>
+0xE1D4 0x779E # <CJK>
+0xE1D5 0x77B0 # <CJK>
+0xE1D6 0x77B6 # <CJK>
+0xE1D7 0x77B9 # <CJK>
+0xE1D8 0x77BF # <CJK>
+0xE1D9 0x77BC # <CJK>
+0xE1DA 0x77BD # <CJK>
+0xE1DB 0x77BB # <CJK>
+0xE1DC 0x77C7 # <CJK>
+0xE1DD 0x77CD # <CJK>
+0xE1DE 0x77D7 # <CJK>
+0xE1DF 0x77DA # <CJK>
+0xE1E0 0x77DC # <CJK>
+0xE1E1 0x77E3 # <CJK>
+0xE1E2 0x77EE # <CJK>
+0xE1E3 0x77FC # <CJK>
+0xE1E4 0x780C # <CJK>
+0xE1E5 0x7812 # <CJK>
+0xE1E6 0x7926 # <CJK>
+0xE1E7 0x7820 # <CJK>
+0xE1E8 0x792A # <CJK>
+0xE1E9 0x7845 # <CJK>
+0xE1EA 0x788E # <CJK>
+0xE1EB 0x7874 # <CJK>
+0xE1EC 0x7886 # <CJK>
+0xE1ED 0x787C # <CJK>
+0xE1EE 0x789A # <CJK>
+0xE1EF 0x788C # <CJK>
+0xE1F0 0x78A3 # <CJK>
+0xE1F1 0x78B5 # <CJK>
+0xE1F2 0x78AA # <CJK>
+0xE1F3 0x78AF # <CJK>
+0xE1F4 0x78D1 # <CJK>
+0xE1F5 0x78C6 # <CJK>
+0xE1F6 0x78CB # <CJK>
+0xE1F7 0x78D4 # <CJK>
+0xE1F8 0x78BE # <CJK>
+0xE1F9 0x78BC # <CJK>
+0xE1FA 0x78C5 # <CJK>
+0xE1FB 0x78CA # <CJK>
+0xE1FC 0x78EC # <CJK>
+0xE240 0x78E7 # <CJK>
+0xE241 0x78DA # <CJK>
+0xE242 0x78FD # <CJK>
+0xE243 0x78F4 # <CJK>
+0xE244 0x7907 # <CJK>
+0xE245 0x7912 # <CJK>
+0xE246 0x7911 # <CJK>
+0xE247 0x7919 # <CJK>
+0xE248 0x792C # <CJK>
+0xE249 0x792B # <CJK>
+0xE24A 0x7940 # <CJK>
+0xE24B 0x7960 # <CJK>
+0xE24C 0x7957 # <CJK>
+0xE24D 0x795F # <CJK>
+0xE24E 0x795A # <CJK>
+0xE24F 0x7955 # <CJK>
+0xE250 0x7953 # <CJK>
+0xE251 0x797A # <CJK>
+0xE252 0x797F # <CJK>
+0xE253 0x798A # <CJK>
+0xE254 0x799D # <CJK>
+0xE255 0x79A7 # <CJK>
+0xE256 0x9F4B # <CJK>
+0xE257 0x79AA # <CJK>
+0xE258 0x79AE # <CJK>
+0xE259 0x79B3 # <CJK>
+0xE25A 0x79B9 # <CJK>
+0xE25B 0x79BA # <CJK>
+0xE25C 0x79C9 # <CJK>
+0xE25D 0x79D5 # <CJK>
+0xE25E 0x79E7 # <CJK>
+0xE25F 0x79EC # <CJK>
+0xE260 0x79E1 # <CJK>
+0xE261 0x79E3 # <CJK>
+0xE262 0x7A08 # <CJK>
+0xE263 0x7A0D # <CJK>
+0xE264 0x7A18 # <CJK>
+0xE265 0x7A19 # <CJK>
+0xE266 0x7A20 # <CJK>
+0xE267 0x7A1F # <CJK>
+0xE268 0x7980 # <CJK>
+0xE269 0x7A31 # <CJK>
+0xE26A 0x7A3B # <CJK>
+0xE26B 0x7A3E # <CJK>
+0xE26C 0x7A37 # <CJK>
+0xE26D 0x7A43 # <CJK>
+0xE26E 0x7A57 # <CJK>
+0xE26F 0x7A49 # <CJK>
+0xE270 0x7A61 # <CJK>
+0xE271 0x7A62 # <CJK>
+0xE272 0x7A69 # <CJK>
+0xE273 0x9F9D # <CJK>
+0xE274 0x7A70 # <CJK>
+0xE275 0x7A79 # <CJK>
+0xE276 0x7A7D # <CJK>
+0xE277 0x7A88 # <CJK>
+0xE278 0x7A97 # <CJK>
+0xE279 0x7A95 # <CJK>
+0xE27A 0x7A98 # <CJK>
+0xE27B 0x7A96 # <CJK>
+0xE27C 0x7AA9 # <CJK>
+0xE27D 0x7AC8 # <CJK>
+0xE27E 0x7AB0 # <CJK>
+0xE280 0x7AB6 # <CJK>
+0xE281 0x7AC5 # <CJK>
+0xE282 0x7AC4 # <CJK>
+0xE283 0x7ABF # <CJK>
+0xE284 0x9083 # <CJK>
+0xE285 0x7AC7 # <CJK>
+0xE286 0x7ACA # <CJK>
+0xE287 0x7ACD # <CJK>
+0xE288 0x7ACF # <CJK>
+0xE289 0x7AD5 # <CJK>
+0xE28A 0x7AD3 # <CJK>
+0xE28B 0x7AD9 # <CJK>
+0xE28C 0x7ADA # <CJK>
+0xE28D 0x7ADD # <CJK>
+0xE28E 0x7AE1 # <CJK>
+0xE28F 0x7AE2 # <CJK>
+0xE290 0x7AE6 # <CJK>
+0xE291 0x7AED # <CJK>
+0xE292 0x7AF0 # <CJK>
+0xE293 0x7B02 # <CJK>
+0xE294 0x7B0F # <CJK>
+0xE295 0x7B0A # <CJK>
+0xE296 0x7B06 # <CJK>
+0xE297 0x7B33 # <CJK>
+0xE298 0x7B18 # <CJK>
+0xE299 0x7B19 # <CJK>
+0xE29A 0x7B1E # <CJK>
+0xE29B 0x7B35 # <CJK>
+0xE29C 0x7B28 # <CJK>
+0xE29D 0x7B36 # <CJK>
+0xE29E 0x7B50 # <CJK>
+0xE29F 0x7B7A # <CJK>
+0xE2A0 0x7B04 # <CJK>
+0xE2A1 0x7B4D # <CJK>
+0xE2A2 0x7B0B # <CJK>
+0xE2A3 0x7B4C # <CJK>
+0xE2A4 0x7B45 # <CJK>
+0xE2A5 0x7B75 # <CJK>
+0xE2A6 0x7B65 # <CJK>
+0xE2A7 0x7B74 # <CJK>
+0xE2A8 0x7B67 # <CJK>
+0xE2A9 0x7B70 # <CJK>
+0xE2AA 0x7B71 # <CJK>
+0xE2AB 0x7B6C # <CJK>
+0xE2AC 0x7B6E # <CJK>
+0xE2AD 0x7B9D # <CJK>
+0xE2AE 0x7B98 # <CJK>
+0xE2AF 0x7B9F # <CJK>
+0xE2B0 0x7B8D # <CJK>
+0xE2B1 0x7B9C # <CJK>
+0xE2B2 0x7B9A # <CJK>
+0xE2B3 0x7B8B # <CJK>
+0xE2B4 0x7B92 # <CJK>
+0xE2B5 0x7B8F # <CJK>
+0xE2B6 0x7B5D # <CJK>
+0xE2B7 0x7B99 # <CJK>
+0xE2B8 0x7BCB # <CJK>
+0xE2B9 0x7BC1 # <CJK>
+0xE2BA 0x7BCC # <CJK>
+0xE2BB 0x7BCF # <CJK>
+0xE2BC 0x7BB4 # <CJK>
+0xE2BD 0x7BC6 # <CJK>
+0xE2BE 0x7BDD # <CJK>
+0xE2BF 0x7BE9 # <CJK>
+0xE2C0 0x7C11 # <CJK>
+0xE2C1 0x7C14 # <CJK>
+0xE2C2 0x7BE6 # <CJK>
+0xE2C3 0x7BE5 # <CJK>
+0xE2C4 0x7C60 # <CJK>
+0xE2C5 0x7C00 # <CJK>
+0xE2C6 0x7C07 # <CJK>
+0xE2C7 0x7C13 # <CJK>
+0xE2C8 0x7BF3 # <CJK>
+0xE2C9 0x7BF7 # <CJK>
+0xE2CA 0x7C17 # <CJK>
+0xE2CB 0x7C0D # <CJK>
+0xE2CC 0x7BF6 # <CJK>
+0xE2CD 0x7C23 # <CJK>
+0xE2CE 0x7C27 # <CJK>
+0xE2CF 0x7C2A # <CJK>
+0xE2D0 0x7C1F # <CJK>
+0xE2D1 0x7C37 # <CJK>
+0xE2D2 0x7C2B # <CJK>
+0xE2D3 0x7C3D # <CJK>
+0xE2D4 0x7C4C # <CJK>
+0xE2D5 0x7C43 # <CJK>
+0xE2D6 0x7C54 # <CJK>
+0xE2D7 0x7C4F # <CJK>
+0xE2D8 0x7C40 # <CJK>
+0xE2D9 0x7C50 # <CJK>
+0xE2DA 0x7C58 # <CJK>
+0xE2DB 0x7C5F # <CJK>
+0xE2DC 0x7C64 # <CJK>
+0xE2DD 0x7C56 # <CJK>
+0xE2DE 0x7C65 # <CJK>
+0xE2DF 0x7C6C # <CJK>
+0xE2E0 0x7C75 # <CJK>
+0xE2E1 0x7C83 # <CJK>
+0xE2E2 0x7C90 # <CJK>
+0xE2E3 0x7CA4 # <CJK>
+0xE2E4 0x7CAD # <CJK>
+0xE2E5 0x7CA2 # <CJK>
+0xE2E6 0x7CAB # <CJK>
+0xE2E7 0x7CA1 # <CJK>
+0xE2E8 0x7CA8 # <CJK>
+0xE2E9 0x7CB3 # <CJK>
+0xE2EA 0x7CB2 # <CJK>
+0xE2EB 0x7CB1 # <CJK>
+0xE2EC 0x7CAE # <CJK>
+0xE2ED 0x7CB9 # <CJK>
+0xE2EE 0x7CBD # <CJK>
+0xE2EF 0x7CC0 # <CJK>
+0xE2F0 0x7CC5 # <CJK>
+0xE2F1 0x7CC2 # <CJK>
+0xE2F2 0x7CD8 # <CJK>
+0xE2F3 0x7CD2 # <CJK>
+0xE2F4 0x7CDC # <CJK>
+0xE2F5 0x7CE2 # <CJK>
+0xE2F6 0x9B3B # <CJK>
+0xE2F7 0x7CEF # <CJK>
+0xE2F8 0x7CF2 # <CJK>
+0xE2F9 0x7CF4 # <CJK>
+0xE2FA 0x7CF6 # <CJK>
+0xE2FB 0x7CFA # <CJK>
+0xE2FC 0x7D06 # <CJK>
+0xE340 0x7D02 # <CJK>
+0xE341 0x7D1C # <CJK>
+0xE342 0x7D15 # <CJK>
+0xE343 0x7D0A # <CJK>
+0xE344 0x7D45 # <CJK>
+0xE345 0x7D4B # <CJK>
+0xE346 0x7D2E # <CJK>
+0xE347 0x7D32 # <CJK>
+0xE348 0x7D3F # <CJK>
+0xE349 0x7D35 # <CJK>
+0xE34A 0x7D46 # <CJK>
+0xE34B 0x7D73 # <CJK>
+0xE34C 0x7D56 # <CJK>
+0xE34D 0x7D4E # <CJK>
+0xE34E 0x7D72 # <CJK>
+0xE34F 0x7D68 # <CJK>
+0xE350 0x7D6E # <CJK>
+0xE351 0x7D4F # <CJK>
+0xE352 0x7D63 # <CJK>
+0xE353 0x7D93 # <CJK>
+0xE354 0x7D89 # <CJK>
+0xE355 0x7D5B # <CJK>
+0xE356 0x7D8F # <CJK>
+0xE357 0x7D7D # <CJK>
+0xE358 0x7D9B # <CJK>
+0xE359 0x7DBA # <CJK>
+0xE35A 0x7DAE # <CJK>
+0xE35B 0x7DA3 # <CJK>
+0xE35C 0x7DB5 # <CJK>
+0xE35D 0x7DC7 # <CJK>
+0xE35E 0x7DBD # <CJK>
+0xE35F 0x7DAB # <CJK>
+0xE360 0x7E3D # <CJK>
+0xE361 0x7DA2 # <CJK>
+0xE362 0x7DAF # <CJK>
+0xE363 0x7DDC # <CJK>
+0xE364 0x7DB8 # <CJK>
+0xE365 0x7D9F # <CJK>
+0xE366 0x7DB0 # <CJK>
+0xE367 0x7DD8 # <CJK>
+0xE368 0x7DDD # <CJK>
+0xE369 0x7DE4 # <CJK>
+0xE36A 0x7DDE # <CJK>
+0xE36B 0x7DFB # <CJK>
+0xE36C 0x7DF2 # <CJK>
+0xE36D 0x7DE1 # <CJK>
+0xE36E 0x7E05 # <CJK>
+0xE36F 0x7E0A # <CJK>
+0xE370 0x7E23 # <CJK>
+0xE371 0x7E21 # <CJK>
+0xE372 0x7E12 # <CJK>
+0xE373 0x7E31 # <CJK>
+0xE374 0x7E1F # <CJK>
+0xE375 0x7E09 # <CJK>
+0xE376 0x7E0B # <CJK>
+0xE377 0x7E22 # <CJK>
+0xE378 0x7E46 # <CJK>
+0xE379 0x7E66 # <CJK>
+0xE37A 0x7E3B # <CJK>
+0xE37B 0x7E35 # <CJK>
+0xE37C 0x7E39 # <CJK>
+0xE37D 0x7E43 # <CJK>
+0xE37E 0x7E37 # <CJK>
+0xE380 0x7E32 # <CJK>
+0xE381 0x7E3A # <CJK>
+0xE382 0x7E67 # <CJK>
+0xE383 0x7E5D # <CJK>
+0xE384 0x7E56 # <CJK>
+0xE385 0x7E5E # <CJK>
+0xE386 0x7E59 # <CJK>
+0xE387 0x7E5A # <CJK>
+0xE388 0x7E79 # <CJK>
+0xE389 0x7E6A # <CJK>
+0xE38A 0x7E69 # <CJK>
+0xE38B 0x7E7C # <CJK>
+0xE38C 0x7E7B # <CJK>
+0xE38D 0x7E83 # <CJK>
+0xE38E 0x7DD5 # <CJK>
+0xE38F 0x7E7D # <CJK>
+0xE390 0x8FAE # <CJK>
+0xE391 0x7E7F # <CJK>
+0xE392 0x7E88 # <CJK>
+0xE393 0x7E89 # <CJK>
+0xE394 0x7E8C # <CJK>
+0xE395 0x7E92 # <CJK>
+0xE396 0x7E90 # <CJK>
+0xE397 0x7E93 # <CJK>
+0xE398 0x7E94 # <CJK>
+0xE399 0x7E96 # <CJK>
+0xE39A 0x7E8E # <CJK>
+0xE39B 0x7E9B # <CJK>
+0xE39C 0x7E9C # <CJK>
+0xE39D 0x7F38 # <CJK>
+0xE39E 0x7F3A # <CJK>
+0xE39F 0x7F45 # <CJK>
+0xE3A0 0x7F4C # <CJK>
+0xE3A1 0x7F4D # <CJK>
+0xE3A2 0x7F4E # <CJK>
+0xE3A3 0x7F50 # <CJK>
+0xE3A4 0x7F51 # <CJK>
+0xE3A5 0x7F55 # <CJK>
+0xE3A6 0x7F54 # <CJK>
+0xE3A7 0x7F58 # <CJK>
+0xE3A8 0x7F5F # <CJK>
+0xE3A9 0x7F60 # <CJK>
+0xE3AA 0x7F68 # <CJK>
+0xE3AB 0x7F69 # <CJK>
+0xE3AC 0x7F67 # <CJK>
+0xE3AD 0x7F78 # <CJK>
+0xE3AE 0x7F82 # <CJK>
+0xE3AF 0x7F86 # <CJK>
+0xE3B0 0x7F83 # <CJK>
+0xE3B1 0x7F88 # <CJK>
+0xE3B2 0x7F87 # <CJK>
+0xE3B3 0x7F8C # <CJK>
+0xE3B4 0x7F94 # <CJK>
+0xE3B5 0x7F9E # <CJK>
+0xE3B6 0x7F9D # <CJK>
+0xE3B7 0x7F9A # <CJK>
+0xE3B8 0x7FA3 # <CJK>
+0xE3B9 0x7FAF # <CJK>
+0xE3BA 0x7FB2 # <CJK>
+0xE3BB 0x7FB9 # <CJK>
+0xE3BC 0x7FAE # <CJK>
+0xE3BD 0x7FB6 # <CJK>
+0xE3BE 0x7FB8 # <CJK>
+0xE3BF 0x8B71 # <CJK>
+0xE3C0 0x7FC5 # <CJK>
+0xE3C1 0x7FC6 # <CJK>
+0xE3C2 0x7FCA # <CJK>
+0xE3C3 0x7FD5 # <CJK>
+0xE3C4 0x7FD4 # <CJK>
+0xE3C5 0x7FE1 # <CJK>
+0xE3C6 0x7FE6 # <CJK>
+0xE3C7 0x7FE9 # <CJK>
+0xE3C8 0x7FF3 # <CJK>
+0xE3C9 0x7FF9 # <CJK>
+0xE3CA 0x98DC # <CJK>
+0xE3CB 0x8006 # <CJK>
+0xE3CC 0x8004 # <CJK>
+0xE3CD 0x800B # <CJK>
+0xE3CE 0x8012 # <CJK>
+0xE3CF 0x8018 # <CJK>
+0xE3D0 0x8019 # <CJK>
+0xE3D1 0x801C # <CJK>
+0xE3D2 0x8021 # <CJK>
+0xE3D3 0x8028 # <CJK>
+0xE3D4 0x803F # <CJK>
+0xE3D5 0x803B # <CJK>
+0xE3D6 0x804A # <CJK>
+0xE3D7 0x8046 # <CJK>
+0xE3D8 0x8052 # <CJK>
+0xE3D9 0x8058 # <CJK>
+0xE3DA 0x805A # <CJK>
+0xE3DB 0x805F # <CJK>
+0xE3DC 0x8062 # <CJK>
+0xE3DD 0x8068 # <CJK>
+0xE3DE 0x8073 # <CJK>
+0xE3DF 0x8072 # <CJK>
+0xE3E0 0x8070 # <CJK>
+0xE3E1 0x8076 # <CJK>
+0xE3E2 0x8079 # <CJK>
+0xE3E3 0x807D # <CJK>
+0xE3E4 0x807F # <CJK>
+0xE3E5 0x8084 # <CJK>
+0xE3E6 0x8086 # <CJK>
+0xE3E7 0x8085 # <CJK>
+0xE3E8 0x809B # <CJK>
+0xE3E9 0x8093 # <CJK>
+0xE3EA 0x809A # <CJK>
+0xE3EB 0x80AD # <CJK>
+0xE3EC 0x5190 # <CJK>
+0xE3ED 0x80AC # <CJK>
+0xE3EE 0x80DB # <CJK>
+0xE3EF 0x80E5 # <CJK>
+0xE3F0 0x80D9 # <CJK>
+0xE3F1 0x80DD # <CJK>
+0xE3F2 0x80C4 # <CJK>
+0xE3F3 0x80DA # <CJK>
+0xE3F4 0x80D6 # <CJK>
+0xE3F5 0x8109 # <CJK>
+0xE3F6 0x80EF # <CJK>
+0xE3F7 0x80F1 # <CJK>
+0xE3F8 0x811B # <CJK>
+0xE3F9 0x8129 # <CJK>
+0xE3FA 0x8123 # <CJK>
+0xE3FB 0x812F # <CJK>
+0xE3FC 0x814B # <CJK>
+0xE440 0x968B # <CJK>
+0xE441 0x8146 # <CJK>
+0xE442 0x813E # <CJK>
+0xE443 0x8153 # <CJK>
+0xE444 0x8151 # <CJK>
+0xE445 0x80FC # <CJK>
+0xE446 0x8171 # <CJK>
+0xE447 0x816E # <CJK>
+0xE448 0x8165 # <CJK>
+0xE449 0x8166 # <CJK>
+0xE44A 0x8174 # <CJK>
+0xE44B 0x8183 # <CJK>
+0xE44C 0x8188 # <CJK>
+0xE44D 0x818A # <CJK>
+0xE44E 0x8180 # <CJK>
+0xE44F 0x8182 # <CJK>
+0xE450 0x81A0 # <CJK>
+0xE451 0x8195 # <CJK>
+0xE452 0x81A4 # <CJK>
+0xE453 0x81A3 # <CJK>
+0xE454 0x815F # <CJK>
+0xE455 0x8193 # <CJK>
+0xE456 0x81A9 # <CJK>
+0xE457 0x81B0 # <CJK>
+0xE458 0x81B5 # <CJK>
+0xE459 0x81BE # <CJK>
+0xE45A 0x81B8 # <CJK>
+0xE45B 0x81BD # <CJK>
+0xE45C 0x81C0 # <CJK>
+0xE45D 0x81C2 # <CJK>
+0xE45E 0x81BA # <CJK>
+0xE45F 0x81C9 # <CJK>
+0xE460 0x81CD # <CJK>
+0xE461 0x81D1 # <CJK>
+0xE462 0x81D9 # <CJK>
+0xE463 0x81D8 # <CJK>
+0xE464 0x81C8 # <CJK>
+0xE465 0x81DA # <CJK>
+0xE466 0x81DF # <CJK>
+0xE467 0x81E0 # <CJK>
+0xE468 0x81E7 # <CJK>
+0xE469 0x81FA # <CJK>
+0xE46A 0x81FB # <CJK>
+0xE46B 0x81FE # <CJK>
+0xE46C 0x8201 # <CJK>
+0xE46D 0x8202 # <CJK>
+0xE46E 0x8205 # <CJK>
+0xE46F 0x8207 # <CJK>
+0xE470 0x820A # <CJK>
+0xE471 0x820D # <CJK>
+0xE472 0x8210 # <CJK>
+0xE473 0x8216 # <CJK>
+0xE474 0x8229 # <CJK>
+0xE475 0x822B # <CJK>
+0xE476 0x8238 # <CJK>
+0xE477 0x8233 # <CJK>
+0xE478 0x8240 # <CJK>
+0xE479 0x8259 # <CJK>
+0xE47A 0x8258 # <CJK>
+0xE47B 0x825D # <CJK>
+0xE47C 0x825A # <CJK>
+0xE47D 0x825F # <CJK>
+0xE47E 0x8264 # <CJK>
+0xE480 0x8262 # <CJK>
+0xE481 0x8268 # <CJK>
+0xE482 0x826A # <CJK>
+0xE483 0x826B # <CJK>
+0xE484 0x822E # <CJK>
+0xE485 0x8271 # <CJK>
+0xE486 0x8277 # <CJK>
+0xE487 0x8278 # <CJK>
+0xE488 0x827E # <CJK>
+0xE489 0x828D # <CJK>
+0xE48A 0x8292 # <CJK>
+0xE48B 0x82AB # <CJK>
+0xE48C 0x829F # <CJK>
+0xE48D 0x82BB # <CJK>
+0xE48E 0x82AC # <CJK>
+0xE48F 0x82E1 # <CJK>
+0xE490 0x82E3 # <CJK>
+0xE491 0x82DF # <CJK>
+0xE492 0x82D2 # <CJK>
+0xE493 0x82F4 # <CJK>
+0xE494 0x82F3 # <CJK>
+0xE495 0x82FA # <CJK>
+0xE496 0x8393 # <CJK>
+0xE497 0x8303 # <CJK>
+0xE498 0x82FB # <CJK>
+0xE499 0x82F9 # <CJK>
+0xE49A 0x82DE # <CJK>
+0xE49B 0x8306 # <CJK>
+0xE49C 0x82DC # <CJK>
+0xE49D 0x8309 # <CJK>
+0xE49E 0x82D9 # <CJK>
+0xE49F 0x8335 # <CJK>
+0xE4A0 0x8334 # <CJK>
+0xE4A1 0x8316 # <CJK>
+0xE4A2 0x8332 # <CJK>
+0xE4A3 0x8331 # <CJK>
+0xE4A4 0x8340 # <CJK>
+0xE4A5 0x8339 # <CJK>
+0xE4A6 0x8350 # <CJK>
+0xE4A7 0x8345 # <CJK>
+0xE4A8 0x832F # <CJK>
+0xE4A9 0x832B # <CJK>
+0xE4AA 0x8317 # <CJK>
+0xE4AB 0x8318 # <CJK>
+0xE4AC 0x8385 # <CJK>
+0xE4AD 0x839A # <CJK>
+0xE4AE 0x83AA # <CJK>
+0xE4AF 0x839F # <CJK>
+0xE4B0 0x83A2 # <CJK>
+0xE4B1 0x8396 # <CJK>
+0xE4B2 0x8323 # <CJK>
+0xE4B3 0x838E # <CJK>
+0xE4B4 0x8387 # <CJK>
+0xE4B5 0x838A # <CJK>
+0xE4B6 0x837C # <CJK>
+0xE4B7 0x83B5 # <CJK>
+0xE4B8 0x8373 # <CJK>
+0xE4B9 0x8375 # <CJK>
+0xE4BA 0x83A0 # <CJK>
+0xE4BB 0x8389 # <CJK>
+0xE4BC 0x83A8 # <CJK>
+0xE4BD 0x83F4 # <CJK>
+0xE4BE 0x8413 # <CJK>
+0xE4BF 0x83EB # <CJK>
+0xE4C0 0x83CE # <CJK>
+0xE4C1 0x83FD # <CJK>
+0xE4C2 0x8403 # <CJK>
+0xE4C3 0x83D8 # <CJK>
+0xE4C4 0x840B # <CJK>
+0xE4C5 0x83C1 # <CJK>
+0xE4C6 0x83F7 # <CJK>
+0xE4C7 0x8407 # <CJK>
+0xE4C8 0x83E0 # <CJK>
+0xE4C9 0x83F2 # <CJK>
+0xE4CA 0x840D # <CJK>
+0xE4CB 0x8422 # <CJK>
+0xE4CC 0x8420 # <CJK>
+0xE4CD 0x83BD # <CJK>
+0xE4CE 0x8438 # <CJK>
+0xE4CF 0x8506 # <CJK>
+0xE4D0 0x83FB # <CJK>
+0xE4D1 0x846D # <CJK>
+0xE4D2 0x842A # <CJK>
+0xE4D3 0x843C # <CJK>
+0xE4D4 0x855A # <CJK>
+0xE4D5 0x8484 # <CJK>
+0xE4D6 0x8477 # <CJK>
+0xE4D7 0x846B # <CJK>
+0xE4D8 0x84AD # <CJK>
+0xE4D9 0x846E # <CJK>
+0xE4DA 0x8482 # <CJK>
+0xE4DB 0x8469 # <CJK>
+0xE4DC 0x8446 # <CJK>
+0xE4DD 0x842C # <CJK>
+0xE4DE 0x846F # <CJK>
+0xE4DF 0x8479 # <CJK>
+0xE4E0 0x8435 # <CJK>
+0xE4E1 0x84CA # <CJK>
+0xE4E2 0x8462 # <CJK>
+0xE4E3 0x84B9 # <CJK>
+0xE4E4 0x84BF # <CJK>
+0xE4E5 0x849F # <CJK>
+0xE4E6 0x84D9 # <CJK>
+0xE4E7 0x84CD # <CJK>
+0xE4E8 0x84BB # <CJK>
+0xE4E9 0x84DA # <CJK>
+0xE4EA 0x84D0 # <CJK>
+0xE4EB 0x84C1 # <CJK>
+0xE4EC 0x84C6 # <CJK>
+0xE4ED 0x84D6 # <CJK>
+0xE4EE 0x84A1 # <CJK>
+0xE4EF 0x8521 # <CJK>
+0xE4F0 0x84FF # <CJK>
+0xE4F1 0x84F4 # <CJK>
+0xE4F2 0x8517 # <CJK>
+0xE4F3 0x8518 # <CJK>
+0xE4F4 0x852C # <CJK>
+0xE4F5 0x851F # <CJK>
+0xE4F6 0x8515 # <CJK>
+0xE4F7 0x8514 # <CJK>
+0xE4F8 0x84FC # <CJK>
+0xE4F9 0x8540 # <CJK>
+0xE4FA 0x8563 # <CJK>
+0xE4FB 0x8558 # <CJK>
+0xE4FC 0x8548 # <CJK>
+0xE540 0x8541 # <CJK>
+0xE541 0x8602 # <CJK>
+0xE542 0x854B # <CJK>
+0xE543 0x8555 # <CJK>
+0xE544 0x8580 # <CJK>
+0xE545 0x85A4 # <CJK>
+0xE546 0x8588 # <CJK>
+0xE547 0x8591 # <CJK>
+0xE548 0x858A # <CJK>
+0xE549 0x85A8 # <CJK>
+0xE54A 0x856D # <CJK>
+0xE54B 0x8594 # <CJK>
+0xE54C 0x859B # <CJK>
+0xE54D 0x85EA # <CJK>
+0xE54E 0x8587 # <CJK>
+0xE54F 0x859C # <CJK>
+0xE550 0x8577 # <CJK>
+0xE551 0x857E # <CJK>
+0xE552 0x8590 # <CJK>
+0xE553 0x85C9 # <CJK>
+0xE554 0x85BA # <CJK>
+0xE555 0x85CF # <CJK>
+0xE556 0x85B9 # <CJK>
+0xE557 0x85D0 # <CJK>
+0xE558 0x85D5 # <CJK>
+0xE559 0x85DD # <CJK>
+0xE55A 0x85E5 # <CJK>
+0xE55B 0x85DC # <CJK>
+0xE55C 0x85F9 # <CJK>
+0xE55D 0x860A # <CJK>
+0xE55E 0x8613 # <CJK>
+0xE55F 0x860B # <CJK>
+0xE560 0x85FE # <CJK>
+0xE561 0x85FA # <CJK>
+0xE562 0x8606 # <CJK>
+0xE563 0x8622 # <CJK>
+0xE564 0x861A # <CJK>
+0xE565 0x8630 # <CJK>
+0xE566 0x863F # <CJK>
+0xE567 0x864D # <CJK>
+0xE568 0x4E55 # <CJK>
+0xE569 0x8654 # <CJK>
+0xE56A 0x865F # <CJK>
+0xE56B 0x8667 # <CJK>
+0xE56C 0x8671 # <CJK>
+0xE56D 0x8693 # <CJK>
+0xE56E 0x86A3 # <CJK>
+0xE56F 0x86A9 # <CJK>
+0xE570 0x86AA # <CJK>
+0xE571 0x868B # <CJK>
+0xE572 0x868C # <CJK>
+0xE573 0x86B6 # <CJK>
+0xE574 0x86AF # <CJK>
+0xE575 0x86C4 # <CJK>
+0xE576 0x86C6 # <CJK>
+0xE577 0x86B0 # <CJK>
+0xE578 0x86C9 # <CJK>
+0xE579 0x8823 # <CJK>
+0xE57A 0x86AB # <CJK>
+0xE57B 0x86D4 # <CJK>
+0xE57C 0x86DE # <CJK>
+0xE57D 0x86E9 # <CJK>
+0xE57E 0x86EC # <CJK>
+0xE580 0x86DF # <CJK>
+0xE581 0x86DB # <CJK>
+0xE582 0x86EF # <CJK>
+0xE583 0x8712 # <CJK>
+0xE584 0x8706 # <CJK>
+0xE585 0x8708 # <CJK>
+0xE586 0x8700 # <CJK>
+0xE587 0x8703 # <CJK>
+0xE588 0x86FB # <CJK>
+0xE589 0x8711 # <CJK>
+0xE58A 0x8709 # <CJK>
+0xE58B 0x870D # <CJK>
+0xE58C 0x86F9 # <CJK>
+0xE58D 0x870A # <CJK>
+0xE58E 0x8734 # <CJK>
+0xE58F 0x873F # <CJK>
+0xE590 0x8737 # <CJK>
+0xE591 0x873B # <CJK>
+0xE592 0x8725 # <CJK>
+0xE593 0x8729 # <CJK>
+0xE594 0x871A # <CJK>
+0xE595 0x8760 # <CJK>
+0xE596 0x875F # <CJK>
+0xE597 0x8778 # <CJK>
+0xE598 0x874C # <CJK>
+0xE599 0x874E # <CJK>
+0xE59A 0x8774 # <CJK>
+0xE59B 0x8757 # <CJK>
+0xE59C 0x8768 # <CJK>
+0xE59D 0x876E # <CJK>
+0xE59E 0x8759 # <CJK>
+0xE59F 0x8753 # <CJK>
+0xE5A0 0x8763 # <CJK>
+0xE5A1 0x876A # <CJK>
+0xE5A2 0x8805 # <CJK>
+0xE5A3 0x87A2 # <CJK>
+0xE5A4 0x879F # <CJK>
+0xE5A5 0x8782 # <CJK>
+0xE5A6 0x87AF # <CJK>
+0xE5A7 0x87CB # <CJK>
+0xE5A8 0x87BD # <CJK>
+0xE5A9 0x87C0 # <CJK>
+0xE5AA 0x87D0 # <CJK>
+0xE5AB 0x96D6 # <CJK>
+0xE5AC 0x87AB # <CJK>
+0xE5AD 0x87C4 # <CJK>
+0xE5AE 0x87B3 # <CJK>
+0xE5AF 0x87C7 # <CJK>
+0xE5B0 0x87C6 # <CJK>
+0xE5B1 0x87BB # <CJK>
+0xE5B2 0x87EF # <CJK>
+0xE5B3 0x87F2 # <CJK>
+0xE5B4 0x87E0 # <CJK>
+0xE5B5 0x880F # <CJK>
+0xE5B6 0x880D # <CJK>
+0xE5B7 0x87FE # <CJK>
+0xE5B8 0x87F6 # <CJK>
+0xE5B9 0x87F7 # <CJK>
+0xE5BA 0x880E # <CJK>
+0xE5BB 0x87D2 # <CJK>
+0xE5BC 0x8811 # <CJK>
+0xE5BD 0x8816 # <CJK>
+0xE5BE 0x8815 # <CJK>
+0xE5BF 0x8822 # <CJK>
+0xE5C0 0x8821 # <CJK>
+0xE5C1 0x8831 # <CJK>
+0xE5C2 0x8836 # <CJK>
+0xE5C3 0x8839 # <CJK>
+0xE5C4 0x8827 # <CJK>
+0xE5C5 0x883B # <CJK>
+0xE5C6 0x8844 # <CJK>
+0xE5C7 0x8842 # <CJK>
+0xE5C8 0x8852 # <CJK>
+0xE5C9 0x8859 # <CJK>
+0xE5CA 0x885E # <CJK>
+0xE5CB 0x8862 # <CJK>
+0xE5CC 0x886B # <CJK>
+0xE5CD 0x8881 # <CJK>
+0xE5CE 0x887E # <CJK>
+0xE5CF 0x889E # <CJK>
+0xE5D0 0x8875 # <CJK>
+0xE5D1 0x887D # <CJK>
+0xE5D2 0x88B5 # <CJK>
+0xE5D3 0x8872 # <CJK>
+0xE5D4 0x8882 # <CJK>
+0xE5D5 0x8897 # <CJK>
+0xE5D6 0x8892 # <CJK>
+0xE5D7 0x88AE # <CJK>
+0xE5D8 0x8899 # <CJK>
+0xE5D9 0x88A2 # <CJK>
+0xE5DA 0x888D # <CJK>
+0xE5DB 0x88A4 # <CJK>
+0xE5DC 0x88B0 # <CJK>
+0xE5DD 0x88BF # <CJK>
+0xE5DE 0x88B1 # <CJK>
+0xE5DF 0x88C3 # <CJK>
+0xE5E0 0x88C4 # <CJK>
+0xE5E1 0x88D4 # <CJK>
+0xE5E2 0x88D8 # <CJK>
+0xE5E3 0x88D9 # <CJK>
+0xE5E4 0x88DD # <CJK>
+0xE5E5 0x88F9 # <CJK>
+0xE5E6 0x8902 # <CJK>
+0xE5E7 0x88FC # <CJK>
+0xE5E8 0x88F4 # <CJK>
+0xE5E9 0x88E8 # <CJK>
+0xE5EA 0x88F2 # <CJK>
+0xE5EB 0x8904 # <CJK>
+0xE5EC 0x890C # <CJK>
+0xE5ED 0x890A # <CJK>
+0xE5EE 0x8913 # <CJK>
+0xE5EF 0x8943 # <CJK>
+0xE5F0 0x891E # <CJK>
+0xE5F1 0x8925 # <CJK>
+0xE5F2 0x892A # <CJK>
+0xE5F3 0x892B # <CJK>
+0xE5F4 0x8941 # <CJK>
+0xE5F5 0x8944 # <CJK>
+0xE5F6 0x893B # <CJK>
+0xE5F7 0x8936 # <CJK>
+0xE5F8 0x8938 # <CJK>
+0xE5F9 0x894C # <CJK>
+0xE5FA 0x891D # <CJK>
+0xE5FB 0x8960 # <CJK>
+0xE5FC 0x895E # <CJK>
+0xE640 0x8966 # <CJK>
+0xE641 0x8964 # <CJK>
+0xE642 0x896D # <CJK>
+0xE643 0x896A # <CJK>
+0xE644 0x896F # <CJK>
+0xE645 0x8974 # <CJK>
+0xE646 0x8977 # <CJK>
+0xE647 0x897E # <CJK>
+0xE648 0x8983 # <CJK>
+0xE649 0x8988 # <CJK>
+0xE64A 0x898A # <CJK>
+0xE64B 0x8993 # <CJK>
+0xE64C 0x8998 # <CJK>
+0xE64D 0x89A1 # <CJK>
+0xE64E 0x89A9 # <CJK>
+0xE64F 0x89A6 # <CJK>
+0xE650 0x89AC # <CJK>
+0xE651 0x89AF # <CJK>
+0xE652 0x89B2 # <CJK>
+0xE653 0x89BA # <CJK>
+0xE654 0x89BD # <CJK>
+0xE655 0x89BF # <CJK>
+0xE656 0x89C0 # <CJK>
+0xE657 0x89DA # <CJK>
+0xE658 0x89DC # <CJK>
+0xE659 0x89DD # <CJK>
+0xE65A 0x89E7 # <CJK>
+0xE65B 0x89F4 # <CJK>
+0xE65C 0x89F8 # <CJK>
+0xE65D 0x8A03 # <CJK>
+0xE65E 0x8A16 # <CJK>
+0xE65F 0x8A10 # <CJK>
+0xE660 0x8A0C # <CJK>
+0xE661 0x8A1B # <CJK>
+0xE662 0x8A1D # <CJK>
+0xE663 0x8A25 # <CJK>
+0xE664 0x8A36 # <CJK>
+0xE665 0x8A41 # <CJK>
+0xE666 0x8A5B # <CJK>
+0xE667 0x8A52 # <CJK>
+0xE668 0x8A46 # <CJK>
+0xE669 0x8A48 # <CJK>
+0xE66A 0x8A7C # <CJK>
+0xE66B 0x8A6D # <CJK>
+0xE66C 0x8A6C # <CJK>
+0xE66D 0x8A62 # <CJK>
+0xE66E 0x8A85 # <CJK>
+0xE66F 0x8A82 # <CJK>
+0xE670 0x8A84 # <CJK>
+0xE671 0x8AA8 # <CJK>
+0xE672 0x8AA1 # <CJK>
+0xE673 0x8A91 # <CJK>
+0xE674 0x8AA5 # <CJK>
+0xE675 0x8AA6 # <CJK>
+0xE676 0x8A9A # <CJK>
+0xE677 0x8AA3 # <CJK>
+0xE678 0x8AC4 # <CJK>
+0xE679 0x8ACD # <CJK>
+0xE67A 0x8AC2 # <CJK>
+0xE67B 0x8ADA # <CJK>
+0xE67C 0x8AEB # <CJK>
+0xE67D 0x8AF3 # <CJK>
+0xE67E 0x8AE7 # <CJK>
+0xE680 0x8AE4 # <CJK>
+0xE681 0x8AF1 # <CJK>
+0xE682 0x8B14 # <CJK>
+0xE683 0x8AE0 # <CJK>
+0xE684 0x8AE2 # <CJK>
+0xE685 0x8AF7 # <CJK>
+0xE686 0x8ADE # <CJK>
+0xE687 0x8ADB # <CJK>
+0xE688 0x8B0C # <CJK>
+0xE689 0x8B07 # <CJK>
+0xE68A 0x8B1A # <CJK>
+0xE68B 0x8AE1 # <CJK>
+0xE68C 0x8B16 # <CJK>
+0xE68D 0x8B10 # <CJK>
+0xE68E 0x8B17 # <CJK>
+0xE68F 0x8B20 # <CJK>
+0xE690 0x8B33 # <CJK>
+0xE691 0x97AB # <CJK>
+0xE692 0x8B26 # <CJK>
+0xE693 0x8B2B # <CJK>
+0xE694 0x8B3E # <CJK>
+0xE695 0x8B28 # <CJK>
+0xE696 0x8B41 # <CJK>
+0xE697 0x8B4C # <CJK>
+0xE698 0x8B4F # <CJK>
+0xE699 0x8B4E # <CJK>
+0xE69A 0x8B49 # <CJK>
+0xE69B 0x8B56 # <CJK>
+0xE69C 0x8B5B # <CJK>
+0xE69D 0x8B5A # <CJK>
+0xE69E 0x8B6B # <CJK>
+0xE69F 0x8B5F # <CJK>
+0xE6A0 0x8B6C # <CJK>
+0xE6A1 0x8B6F # <CJK>
+0xE6A2 0x8B74 # <CJK>
+0xE6A3 0x8B7D # <CJK>
+0xE6A4 0x8B80 # <CJK>
+0xE6A5 0x8B8C # <CJK>
+0xE6A6 0x8B8E # <CJK>
+0xE6A7 0x8B92 # <CJK>
+0xE6A8 0x8B93 # <CJK>
+0xE6A9 0x8B96 # <CJK>
+0xE6AA 0x8B99 # <CJK>
+0xE6AB 0x8B9A # <CJK>
+0xE6AC 0x8C3A # <CJK>
+0xE6AD 0x8C41 # <CJK>
+0xE6AE 0x8C3F # <CJK>
+0xE6AF 0x8C48 # <CJK>
+0xE6B0 0x8C4C # <CJK>
+0xE6B1 0x8C4E # <CJK>
+0xE6B2 0x8C50 # <CJK>
+0xE6B3 0x8C55 # <CJK>
+0xE6B4 0x8C62 # <CJK>
+0xE6B5 0x8C6C # <CJK>
+0xE6B6 0x8C78 # <CJK>
+0xE6B7 0x8C7A # <CJK>
+0xE6B8 0x8C82 # <CJK>
+0xE6B9 0x8C89 # <CJK>
+0xE6BA 0x8C85 # <CJK>
+0xE6BB 0x8C8A # <CJK>
+0xE6BC 0x8C8D # <CJK>
+0xE6BD 0x8C8E # <CJK>
+0xE6BE 0x8C94 # <CJK>
+0xE6BF 0x8C7C # <CJK>
+0xE6C0 0x8C98 # <CJK>
+0xE6C1 0x621D # <CJK>
+0xE6C2 0x8CAD # <CJK>
+0xE6C3 0x8CAA # <CJK>
+0xE6C4 0x8CBD # <CJK>
+0xE6C5 0x8CB2 # <CJK>
+0xE6C6 0x8CB3 # <CJK>
+0xE6C7 0x8CAE # <CJK>
+0xE6C8 0x8CB6 # <CJK>
+0xE6C9 0x8CC8 # <CJK>
+0xE6CA 0x8CC1 # <CJK>
+0xE6CB 0x8CE4 # <CJK>
+0xE6CC 0x8CE3 # <CJK>
+0xE6CD 0x8CDA # <CJK>
+0xE6CE 0x8CFD # <CJK>
+0xE6CF 0x8CFA # <CJK>
+0xE6D0 0x8CFB # <CJK>
+0xE6D1 0x8D04 # <CJK>
+0xE6D2 0x8D05 # <CJK>
+0xE6D3 0x8D0A # <CJK>
+0xE6D4 0x8D07 # <CJK>
+0xE6D5 0x8D0F # <CJK>
+0xE6D6 0x8D0D # <CJK>
+0xE6D7 0x8D10 # <CJK>
+0xE6D8 0x9F4E # <CJK>
+0xE6D9 0x8D13 # <CJK>
+0xE6DA 0x8CCD # <CJK>
+0xE6DB 0x8D14 # <CJK>
+0xE6DC 0x8D16 # <CJK>
+0xE6DD 0x8D67 # <CJK>
+0xE6DE 0x8D6D # <CJK>
+0xE6DF 0x8D71 # <CJK>
+0xE6E0 0x8D73 # <CJK>
+0xE6E1 0x8D81 # <CJK>
+0xE6E2 0x8D99 # <CJK>
+0xE6E3 0x8DC2 # <CJK>
+0xE6E4 0x8DBE # <CJK>
+0xE6E5 0x8DBA # <CJK>
+0xE6E6 0x8DCF # <CJK>
+0xE6E7 0x8DDA # <CJK>
+0xE6E8 0x8DD6 # <CJK>
+0xE6E9 0x8DCC # <CJK>
+0xE6EA 0x8DDB # <CJK>
+0xE6EB 0x8DCB # <CJK>
+0xE6EC 0x8DEA # <CJK>
+0xE6ED 0x8DEB # <CJK>
+0xE6EE 0x8DDF # <CJK>
+0xE6EF 0x8DE3 # <CJK>
+0xE6F0 0x8DFC # <CJK>
+0xE6F1 0x8E08 # <CJK>
+0xE6F2 0x8E09 # <CJK>
+0xE6F3 0x8DFF # <CJK>
+0xE6F4 0x8E1D # <CJK>
+0xE6F5 0x8E1E # <CJK>
+0xE6F6 0x8E10 # <CJK>
+0xE6F7 0x8E1F # <CJK>
+0xE6F8 0x8E42 # <CJK>
+0xE6F9 0x8E35 # <CJK>
+0xE6FA 0x8E30 # <CJK>
+0xE6FB 0x8E34 # <CJK>
+0xE6FC 0x8E4A # <CJK>
+0xE740 0x8E47 # <CJK>
+0xE741 0x8E49 # <CJK>
+0xE742 0x8E4C # <CJK>
+0xE743 0x8E50 # <CJK>
+0xE744 0x8E48 # <CJK>
+0xE745 0x8E59 # <CJK>
+0xE746 0x8E64 # <CJK>
+0xE747 0x8E60 # <CJK>
+0xE748 0x8E2A # <CJK>
+0xE749 0x8E63 # <CJK>
+0xE74A 0x8E55 # <CJK>
+0xE74B 0x8E76 # <CJK>
+0xE74C 0x8E72 # <CJK>
+0xE74D 0x8E7C # <CJK>
+0xE74E 0x8E81 # <CJK>
+0xE74F 0x8E87 # <CJK>
+0xE750 0x8E85 # <CJK>
+0xE751 0x8E84 # <CJK>
+0xE752 0x8E8B # <CJK>
+0xE753 0x8E8A # <CJK>
+0xE754 0x8E93 # <CJK>
+0xE755 0x8E91 # <CJK>
+0xE756 0x8E94 # <CJK>
+0xE757 0x8E99 # <CJK>
+0xE758 0x8EAA # <CJK>
+0xE759 0x8EA1 # <CJK>
+0xE75A 0x8EAC # <CJK>
+0xE75B 0x8EB0 # <CJK>
+0xE75C 0x8EC6 # <CJK>
+0xE75D 0x8EB1 # <CJK>
+0xE75E 0x8EBE # <CJK>
+0xE75F 0x8EC5 # <CJK>
+0xE760 0x8EC8 # <CJK>
+0xE761 0x8ECB # <CJK>
+0xE762 0x8EDB # <CJK>
+0xE763 0x8EE3 # <CJK>
+0xE764 0x8EFC # <CJK>
+0xE765 0x8EFB # <CJK>
+0xE766 0x8EEB # <CJK>
+0xE767 0x8EFE # <CJK>
+0xE768 0x8F0A # <CJK>
+0xE769 0x8F05 # <CJK>
+0xE76A 0x8F15 # <CJK>
+0xE76B 0x8F12 # <CJK>
+0xE76C 0x8F19 # <CJK>
+0xE76D 0x8F13 # <CJK>
+0xE76E 0x8F1C # <CJK>
+0xE76F 0x8F1F # <CJK>
+0xE770 0x8F1B # <CJK>
+0xE771 0x8F0C # <CJK>
+0xE772 0x8F26 # <CJK>
+0xE773 0x8F33 # <CJK>
+0xE774 0x8F3B # <CJK>
+0xE775 0x8F39 # <CJK>
+0xE776 0x8F45 # <CJK>
+0xE777 0x8F42 # <CJK>
+0xE778 0x8F3E # <CJK>
+0xE779 0x8F4C # <CJK>
+0xE77A 0x8F49 # <CJK>
+0xE77B 0x8F46 # <CJK>
+0xE77C 0x8F4E # <CJK>
+0xE77D 0x8F57 # <CJK>
+0xE77E 0x8F5C # <CJK>
+0xE780 0x8F62 # <CJK>
+0xE781 0x8F63 # <CJK>
+0xE782 0x8F64 # <CJK>
+0xE783 0x8F9C # <CJK>
+0xE784 0x8F9F # <CJK>
+0xE785 0x8FA3 # <CJK>
+0xE786 0x8FAD # <CJK>
+0xE787 0x8FAF # <CJK>
+0xE788 0x8FB7 # <CJK>
+0xE789 0x8FDA # <CJK>
+0xE78A 0x8FE5 # <CJK>
+0xE78B 0x8FE2 # <CJK>
+0xE78C 0x8FEA # <CJK>
+0xE78D 0x8FEF # <CJK>
+0xE78E 0x9087 # <CJK>
+0xE78F 0x8FF4 # <CJK>
+0xE790 0x9005 # <CJK>
+0xE791 0x8FF9 # <CJK>
+0xE792 0x8FFA # <CJK>
+0xE793 0x9011 # <CJK>
+0xE794 0x9015 # <CJK>
+0xE795 0x9021 # <CJK>
+0xE796 0x900D # <CJK>
+0xE797 0x901E # <CJK>
+0xE798 0x9016 # <CJK>
+0xE799 0x900B # <CJK>
+0xE79A 0x9027 # <CJK>
+0xE79B 0x9036 # <CJK>
+0xE79C 0x9035 # <CJK>
+0xE79D 0x9039 # <CJK>
+0xE79E 0x8FF8 # <CJK>
+0xE79F 0x904F # <CJK>
+0xE7A0 0x9050 # <CJK>
+0xE7A1 0x9051 # <CJK>
+0xE7A2 0x9052 # <CJK>
+0xE7A3 0x900E # <CJK>
+0xE7A4 0x9049 # <CJK>
+0xE7A5 0x903E # <CJK>
+0xE7A6 0x9056 # <CJK>
+0xE7A7 0x9058 # <CJK>
+0xE7A8 0x905E # <CJK>
+0xE7A9 0x9068 # <CJK>
+0xE7AA 0x906F # <CJK>
+0xE7AB 0x9076 # <CJK>
+0xE7AC 0x96A8 # <CJK>
+0xE7AD 0x9072 # <CJK>
+0xE7AE 0x9082 # <CJK>
+0xE7AF 0x907D # <CJK>
+0xE7B0 0x9081 # <CJK>
+0xE7B1 0x9080 # <CJK>
+0xE7B2 0x908A # <CJK>
+0xE7B3 0x9089 # <CJK>
+0xE7B4 0x908F # <CJK>
+0xE7B5 0x90A8 # <CJK>
+0xE7B6 0x90AF # <CJK>
+0xE7B7 0x90B1 # <CJK>
+0xE7B8 0x90B5 # <CJK>
+0xE7B9 0x90E2 # <CJK>
+0xE7BA 0x90E4 # <CJK>
+0xE7BB 0x6248 # <CJK>
+0xE7BC 0x90DB # <CJK>
+0xE7BD 0x9102 # <CJK>
+0xE7BE 0x9112 # <CJK>
+0xE7BF 0x9119 # <CJK>
+0xE7C0 0x9132 # <CJK>
+0xE7C1 0x9130 # <CJK>
+0xE7C2 0x914A # <CJK>
+0xE7C3 0x9156 # <CJK>
+0xE7C4 0x9158 # <CJK>
+0xE7C5 0x9163 # <CJK>
+0xE7C6 0x9165 # <CJK>
+0xE7C7 0x9169 # <CJK>
+0xE7C8 0x9173 # <CJK>
+0xE7C9 0x9172 # <CJK>
+0xE7CA 0x918B # <CJK>
+0xE7CB 0x9189 # <CJK>
+0xE7CC 0x9182 # <CJK>
+0xE7CD 0x91A2 # <CJK>
+0xE7CE 0x91AB # <CJK>
+0xE7CF 0x91AF # <CJK>
+0xE7D0 0x91AA # <CJK>
+0xE7D1 0x91B5 # <CJK>
+0xE7D2 0x91B4 # <CJK>
+0xE7D3 0x91BA # <CJK>
+0xE7D4 0x91C0 # <CJK>
+0xE7D5 0x91C1 # <CJK>
+0xE7D6 0x91C9 # <CJK>
+0xE7D7 0x91CB # <CJK>
+0xE7D8 0x91D0 # <CJK>
+0xE7D9 0x91D6 # <CJK>
+0xE7DA 0x91DF # <CJK>
+0xE7DB 0x91E1 # <CJK>
+0xE7DC 0x91DB # <CJK>
+0xE7DD 0x91FC # <CJK>
+0xE7DE 0x91F5 # <CJK>
+0xE7DF 0x91F6 # <CJK>
+0xE7E0 0x921E # <CJK>
+0xE7E1 0x91FF # <CJK>
+0xE7E2 0x9214 # <CJK>
+0xE7E3 0x922C # <CJK>
+0xE7E4 0x9215 # <CJK>
+0xE7E5 0x9211 # <CJK>
+0xE7E6 0x925E # <CJK>
+0xE7E7 0x9257 # <CJK>
+0xE7E8 0x9245 # <CJK>
+0xE7E9 0x9249 # <CJK>
+0xE7EA 0x9264 # <CJK>
+0xE7EB 0x9248 # <CJK>
+0xE7EC 0x9295 # <CJK>
+0xE7ED 0x923F # <CJK>
+0xE7EE 0x924B # <CJK>
+0xE7EF 0x9250 # <CJK>
+0xE7F0 0x929C # <CJK>
+0xE7F1 0x9296 # <CJK>
+0xE7F2 0x9293 # <CJK>
+0xE7F3 0x929B # <CJK>
+0xE7F4 0x925A # <CJK>
+0xE7F5 0x92CF # <CJK>
+0xE7F6 0x92B9 # <CJK>
+0xE7F7 0x92B7 # <CJK>
+0xE7F8 0x92E9 # <CJK>
+0xE7F9 0x930F # <CJK>
+0xE7FA 0x92FA # <CJK>
+0xE7FB 0x9344 # <CJK>
+0xE7FC 0x932E # <CJK>
+0xE840 0x9319 # <CJK>
+0xE841 0x9322 # <CJK>
+0xE842 0x931A # <CJK>
+0xE843 0x9323 # <CJK>
+0xE844 0x933A # <CJK>
+0xE845 0x9335 # <CJK>
+0xE846 0x933B # <CJK>
+0xE847 0x935C # <CJK>
+0xE848 0x9360 # <CJK>
+0xE849 0x937C # <CJK>
+0xE84A 0x936E # <CJK>
+0xE84B 0x9356 # <CJK>
+0xE84C 0x93B0 # <CJK>
+0xE84D 0x93AC # <CJK>
+0xE84E 0x93AD # <CJK>
+0xE84F 0x9394 # <CJK>
+0xE850 0x93B9 # <CJK>
+0xE851 0x93D6 # <CJK>
+0xE852 0x93D7 # <CJK>
+0xE853 0x93E8 # <CJK>
+0xE854 0x93E5 # <CJK>
+0xE855 0x93D8 # <CJK>
+0xE856 0x93C3 # <CJK>
+0xE857 0x93DD # <CJK>
+0xE858 0x93D0 # <CJK>
+0xE859 0x93C8 # <CJK>
+0xE85A 0x93E4 # <CJK>
+0xE85B 0x941A # <CJK>
+0xE85C 0x9414 # <CJK>
+0xE85D 0x9413 # <CJK>
+0xE85E 0x9403 # <CJK>
+0xE85F 0x9407 # <CJK>
+0xE860 0x9410 # <CJK>
+0xE861 0x9436 # <CJK>
+0xE862 0x942B # <CJK>
+0xE863 0x9435 # <CJK>
+0xE864 0x9421 # <CJK>
+0xE865 0x943A # <CJK>
+0xE866 0x9441 # <CJK>
+0xE867 0x9452 # <CJK>
+0xE868 0x9444 # <CJK>
+0xE869 0x945B # <CJK>
+0xE86A 0x9460 # <CJK>
+0xE86B 0x9462 # <CJK>
+0xE86C 0x945E # <CJK>
+0xE86D 0x946A # <CJK>
+0xE86E 0x9229 # <CJK>
+0xE86F 0x9470 # <CJK>
+0xE870 0x9475 # <CJK>
+0xE871 0x9477 # <CJK>
+0xE872 0x947D # <CJK>
+0xE873 0x945A # <CJK>
+0xE874 0x947C # <CJK>
+0xE875 0x947E # <CJK>
+0xE876 0x9481 # <CJK>
+0xE877 0x947F # <CJK>
+0xE878 0x9582 # <CJK>
+0xE879 0x9587 # <CJK>
+0xE87A 0x958A # <CJK>
+0xE87B 0x9594 # <CJK>
+0xE87C 0x9596 # <CJK>
+0xE87D 0x9598 # <CJK>
+0xE87E 0x9599 # <CJK>
+0xE880 0x95A0 # <CJK>
+0xE881 0x95A8 # <CJK>
+0xE882 0x95A7 # <CJK>
+0xE883 0x95AD # <CJK>
+0xE884 0x95BC # <CJK>
+0xE885 0x95BB # <CJK>
+0xE886 0x95B9 # <CJK>
+0xE887 0x95BE # <CJK>
+0xE888 0x95CA # <CJK>
+0xE889 0x6FF6 # <CJK>
+0xE88A 0x95C3 # <CJK>
+0xE88B 0x95CD # <CJK>
+0xE88C 0x95CC # <CJK>
+0xE88D 0x95D5 # <CJK>
+0xE88E 0x95D4 # <CJK>
+0xE88F 0x95D6 # <CJK>
+0xE890 0x95DC # <CJK>
+0xE891 0x95E1 # <CJK>
+0xE892 0x95E5 # <CJK>
+0xE893 0x95E2 # <CJK>
+0xE894 0x9621 # <CJK>
+0xE895 0x9628 # <CJK>
+0xE896 0x962E # <CJK>
+0xE897 0x962F # <CJK>
+0xE898 0x9642 # <CJK>
+0xE899 0x964C # <CJK>
+0xE89A 0x964F # <CJK>
+0xE89B 0x964B # <CJK>
+0xE89C 0x9677 # <CJK>
+0xE89D 0x965C # <CJK>
+0xE89E 0x965E # <CJK>
+0xE89F 0x965D # <CJK>
+0xE8A0 0x965F # <CJK>
+0xE8A1 0x9666 # <CJK>
+0xE8A2 0x9672 # <CJK>
+0xE8A3 0x966C # <CJK>
+0xE8A4 0x968D # <CJK>
+0xE8A5 0x9698 # <CJK>
+0xE8A6 0x9695 # <CJK>
+0xE8A7 0x9697 # <CJK>
+0xE8A8 0x96AA # <CJK>
+0xE8A9 0x96A7 # <CJK>
+0xE8AA 0x96B1 # <CJK>
+0xE8AB 0x96B2 # <CJK>
+0xE8AC 0x96B0 # <CJK>
+0xE8AD 0x96B4 # <CJK>
+0xE8AE 0x96B6 # <CJK>
+0xE8AF 0x96B8 # <CJK>
+0xE8B0 0x96B9 # <CJK>
+0xE8B1 0x96CE # <CJK>
+0xE8B2 0x96CB # <CJK>
+0xE8B3 0x96C9 # <CJK>
+0xE8B4 0x96CD # <CJK>
+0xE8B5 0x894D # <CJK>
+0xE8B6 0x96DC # <CJK>
+0xE8B7 0x970D # <CJK>
+0xE8B8 0x96D5 # <CJK>
+0xE8B9 0x96F9 # <CJK>
+0xE8BA 0x9704 # <CJK>
+0xE8BB 0x9706 # <CJK>
+0xE8BC 0x9708 # <CJK>
+0xE8BD 0x9713 # <CJK>
+0xE8BE 0x970E # <CJK>
+0xE8BF 0x9711 # <CJK>
+0xE8C0 0x970F # <CJK>
+0xE8C1 0x9716 # <CJK>
+0xE8C2 0x9719 # <CJK>
+0xE8C3 0x9724 # <CJK>
+0xE8C4 0x972A # <CJK>
+0xE8C5 0x9730 # <CJK>
+0xE8C6 0x9739 # <CJK>
+0xE8C7 0x973D # <CJK>
+0xE8C8 0x973E # <CJK>
+0xE8C9 0x9744 # <CJK>
+0xE8CA 0x9746 # <CJK>
+0xE8CB 0x9748 # <CJK>
+0xE8CC 0x9742 # <CJK>
+0xE8CD 0x9749 # <CJK>
+0xE8CE 0x975C # <CJK>
+0xE8CF 0x9760 # <CJK>
+0xE8D0 0x9764 # <CJK>
+0xE8D1 0x9766 # <CJK>
+0xE8D2 0x9768 # <CJK>
+0xE8D3 0x52D2 # <CJK>
+0xE8D4 0x976B # <CJK>
+0xE8D5 0x9771 # <CJK>
+0xE8D6 0x9779 # <CJK>
+0xE8D7 0x9785 # <CJK>
+0xE8D8 0x977C # <CJK>
+0xE8D9 0x9781 # <CJK>
+0xE8DA 0x977A # <CJK>
+0xE8DB 0x9786 # <CJK>
+0xE8DC 0x978B # <CJK>
+0xE8DD 0x978F # <CJK>
+0xE8DE 0x9790 # <CJK>
+0xE8DF 0x979C # <CJK>
+0xE8E0 0x97A8 # <CJK>
+0xE8E1 0x97A6 # <CJK>
+0xE8E2 0x97A3 # <CJK>
+0xE8E3 0x97B3 # <CJK>
+0xE8E4 0x97B4 # <CJK>
+0xE8E5 0x97C3 # <CJK>
+0xE8E6 0x97C6 # <CJK>
+0xE8E7 0x97C8 # <CJK>
+0xE8E8 0x97CB # <CJK>
+0xE8E9 0x97DC # <CJK>
+0xE8EA 0x97ED # <CJK>
+0xE8EB 0x9F4F # <CJK>
+0xE8EC 0x97F2 # <CJK>
+0xE8ED 0x7ADF # <CJK>
+0xE8EE 0x97F6 # <CJK>
+0xE8EF 0x97F5 # <CJK>
+0xE8F0 0x980F # <CJK>
+0xE8F1 0x980C # <CJK>
+0xE8F2 0x9838 # <CJK>
+0xE8F3 0x9824 # <CJK>
+0xE8F4 0x9821 # <CJK>
+0xE8F5 0x9837 # <CJK>
+0xE8F6 0x983D # <CJK>
+0xE8F7 0x9846 # <CJK>
+0xE8F8 0x984F # <CJK>
+0xE8F9 0x984B # <CJK>
+0xE8FA 0x986B # <CJK>
+0xE8FB 0x986F # <CJK>
+0xE8FC 0x9870 # <CJK>
+0xE940 0x9871 # <CJK>
+0xE941 0x9874 # <CJK>
+0xE942 0x9873 # <CJK>
+0xE943 0x98AA # <CJK>
+0xE944 0x98AF # <CJK>
+0xE945 0x98B1 # <CJK>
+0xE946 0x98B6 # <CJK>
+0xE947 0x98C4 # <CJK>
+0xE948 0x98C3 # <CJK>
+0xE949 0x98C6 # <CJK>
+0xE94A 0x98E9 # <CJK>
+0xE94B 0x98EB # <CJK>
+0xE94C 0x9903 # <CJK>
+0xE94D 0x9909 # <CJK>
+0xE94E 0x9912 # <CJK>
+0xE94F 0x9914 # <CJK>
+0xE950 0x9918 # <CJK>
+0xE951 0x9921 # <CJK>
+0xE952 0x991D # <CJK>
+0xE953 0x991E # <CJK>
+0xE954 0x9924 # <CJK>
+0xE955 0x9920 # <CJK>
+0xE956 0x992C # <CJK>
+0xE957 0x992E # <CJK>
+0xE958 0x993D # <CJK>
+0xE959 0x993E # <CJK>
+0xE95A 0x9942 # <CJK>
+0xE95B 0x9949 # <CJK>
+0xE95C 0x9945 # <CJK>
+0xE95D 0x9950 # <CJK>
+0xE95E 0x994B # <CJK>
+0xE95F 0x9951 # <CJK>
+0xE960 0x9952 # <CJK>
+0xE961 0x994C # <CJK>
+0xE962 0x9955 # <CJK>
+0xE963 0x9997 # <CJK>
+0xE964 0x9998 # <CJK>
+0xE965 0x99A5 # <CJK>
+0xE966 0x99AD # <CJK>
+0xE967 0x99AE # <CJK>
+0xE968 0x99BC # <CJK>
+0xE969 0x99DF # <CJK>
+0xE96A 0x99DB # <CJK>
+0xE96B 0x99DD # <CJK>
+0xE96C 0x99D8 # <CJK>
+0xE96D 0x99D1 # <CJK>
+0xE96E 0x99ED # <CJK>
+0xE96F 0x99EE # <CJK>
+0xE970 0x99F1 # <CJK>
+0xE971 0x99F2 # <CJK>
+0xE972 0x99FB # <CJK>
+0xE973 0x99F8 # <CJK>
+0xE974 0x9A01 # <CJK>
+0xE975 0x9A0F # <CJK>
+0xE976 0x9A05 # <CJK>
+0xE977 0x99E2 # <CJK>
+0xE978 0x9A19 # <CJK>
+0xE979 0x9A2B # <CJK>
+0xE97A 0x9A37 # <CJK>
+0xE97B 0x9A45 # <CJK>
+0xE97C 0x9A42 # <CJK>
+0xE97D 0x9A40 # <CJK>
+0xE97E 0x9A43 # <CJK>
+0xE980 0x9A3E # <CJK>
+0xE981 0x9A55 # <CJK>
+0xE982 0x9A4D # <CJK>
+0xE983 0x9A5B # <CJK>
+0xE984 0x9A57 # <CJK>
+0xE985 0x9A5F # <CJK>
+0xE986 0x9A62 # <CJK>
+0xE987 0x9A65 # <CJK>
+0xE988 0x9A64 # <CJK>
+0xE989 0x9A69 # <CJK>
+0xE98A 0x9A6B # <CJK>
+0xE98B 0x9A6A # <CJK>
+0xE98C 0x9AAD # <CJK>
+0xE98D 0x9AB0 # <CJK>
+0xE98E 0x9ABC # <CJK>
+0xE98F 0x9AC0 # <CJK>
+0xE990 0x9ACF # <CJK>
+0xE991 0x9AD1 # <CJK>
+0xE992 0x9AD3 # <CJK>
+0xE993 0x9AD4 # <CJK>
+0xE994 0x9ADE # <CJK>
+0xE995 0x9ADF # <CJK>
+0xE996 0x9AE2 # <CJK>
+0xE997 0x9AE3 # <CJK>
+0xE998 0x9AE6 # <CJK>
+0xE999 0x9AEF # <CJK>
+0xE99A 0x9AEB # <CJK>
+0xE99B 0x9AEE # <CJK>
+0xE99C 0x9AF4 # <CJK>
+0xE99D 0x9AF1 # <CJK>
+0xE99E 0x9AF7 # <CJK>
+0xE99F 0x9AFB # <CJK>
+0xE9A0 0x9B06 # <CJK>
+0xE9A1 0x9B18 # <CJK>
+0xE9A2 0x9B1A # <CJK>
+0xE9A3 0x9B1F # <CJK>
+0xE9A4 0x9B22 # <CJK>
+0xE9A5 0x9B23 # <CJK>
+0xE9A6 0x9B25 # <CJK>
+0xE9A7 0x9B27 # <CJK>
+0xE9A8 0x9B28 # <CJK>
+0xE9A9 0x9B29 # <CJK>
+0xE9AA 0x9B2A # <CJK>
+0xE9AB 0x9B2E # <CJK>
+0xE9AC 0x9B2F # <CJK>
+0xE9AD 0x9B32 # <CJK>
+0xE9AE 0x9B44 # <CJK>
+0xE9AF 0x9B43 # <CJK>
+0xE9B0 0x9B4F # <CJK>
+0xE9B1 0x9B4D # <CJK>
+0xE9B2 0x9B4E # <CJK>
+0xE9B3 0x9B51 # <CJK>
+0xE9B4 0x9B58 # <CJK>
+0xE9B5 0x9B74 # <CJK>
+0xE9B6 0x9B93 # <CJK>
+0xE9B7 0x9B83 # <CJK>
+0xE9B8 0x9B91 # <CJK>
+0xE9B9 0x9B96 # <CJK>
+0xE9BA 0x9B97 # <CJK>
+0xE9BB 0x9B9F # <CJK>
+0xE9BC 0x9BA0 # <CJK>
+0xE9BD 0x9BA8 # <CJK>
+0xE9BE 0x9BB4 # <CJK>
+0xE9BF 0x9BC0 # <CJK>
+0xE9C0 0x9BCA # <CJK>
+0xE9C1 0x9BB9 # <CJK>
+0xE9C2 0x9BC6 # <CJK>
+0xE9C3 0x9BCF # <CJK>
+0xE9C4 0x9BD1 # <CJK>
+0xE9C5 0x9BD2 # <CJK>
+0xE9C6 0x9BE3 # <CJK>
+0xE9C7 0x9BE2 # <CJK>
+0xE9C8 0x9BE4 # <CJK>
+0xE9C9 0x9BD4 # <CJK>
+0xE9CA 0x9BE1 # <CJK>
+0xE9CB 0x9C3A # <CJK>
+0xE9CC 0x9BF2 # <CJK>
+0xE9CD 0x9BF1 # <CJK>
+0xE9CE 0x9BF0 # <CJK>
+0xE9CF 0x9C15 # <CJK>
+0xE9D0 0x9C14 # <CJK>
+0xE9D1 0x9C09 # <CJK>
+0xE9D2 0x9C13 # <CJK>
+0xE9D3 0x9C0C # <CJK>
+0xE9D4 0x9C06 # <CJK>
+0xE9D5 0x9C08 # <CJK>
+0xE9D6 0x9C12 # <CJK>
+0xE9D7 0x9C0A # <CJK>
+0xE9D8 0x9C04 # <CJK>
+0xE9D9 0x9C2E # <CJK>
+0xE9DA 0x9C1B # <CJK>
+0xE9DB 0x9C25 # <CJK>
+0xE9DC 0x9C24 # <CJK>
+0xE9DD 0x9C21 # <CJK>
+0xE9DE 0x9C30 # <CJK>
+0xE9DF 0x9C47 # <CJK>
+0xE9E0 0x9C32 # <CJK>
+0xE9E1 0x9C46 # <CJK>
+0xE9E2 0x9C3E # <CJK>
+0xE9E3 0x9C5A # <CJK>
+0xE9E4 0x9C60 # <CJK>
+0xE9E5 0x9C67 # <CJK>
+0xE9E6 0x9C76 # <CJK>
+0xE9E7 0x9C78 # <CJK>
+0xE9E8 0x9CE7 # <CJK>
+0xE9E9 0x9CEC # <CJK>
+0xE9EA 0x9CF0 # <CJK>
+0xE9EB 0x9D09 # <CJK>
+0xE9EC 0x9D08 # <CJK>
+0xE9ED 0x9CEB # <CJK>
+0xE9EE 0x9D03 # <CJK>
+0xE9EF 0x9D06 # <CJK>
+0xE9F0 0x9D2A # <CJK>
+0xE9F1 0x9D26 # <CJK>
+0xE9F2 0x9DAF # <CJK>
+0xE9F3 0x9D23 # <CJK>
+0xE9F4 0x9D1F # <CJK>
+0xE9F5 0x9D44 # <CJK>
+0xE9F6 0x9D15 # <CJK>
+0xE9F7 0x9D12 # <CJK>
+0xE9F8 0x9D41 # <CJK>
+0xE9F9 0x9D3F # <CJK>
+0xE9FA 0x9D3E # <CJK>
+0xE9FB 0x9D46 # <CJK>
+0xE9FC 0x9D48 # <CJK>
+0xEA40 0x9D5D # <CJK>
+0xEA41 0x9D5E # <CJK>
+0xEA42 0x9D64 # <CJK>
+0xEA43 0x9D51 # <CJK>
+0xEA44 0x9D50 # <CJK>
+0xEA45 0x9D59 # <CJK>
+0xEA46 0x9D72 # <CJK>
+0xEA47 0x9D89 # <CJK>
+0xEA48 0x9D87 # <CJK>
+0xEA49 0x9DAB # <CJK>
+0xEA4A 0x9D6F # <CJK>
+0xEA4B 0x9D7A # <CJK>
+0xEA4C 0x9D9A # <CJK>
+0xEA4D 0x9DA4 # <CJK>
+0xEA4E 0x9DA9 # <CJK>
+0xEA4F 0x9DB2 # <CJK>
+0xEA50 0x9DC4 # <CJK>
+0xEA51 0x9DC1 # <CJK>
+0xEA52 0x9DBB # <CJK>
+0xEA53 0x9DB8 # <CJK>
+0xEA54 0x9DBA # <CJK>
+0xEA55 0x9DC6 # <CJK>
+0xEA56 0x9DCF # <CJK>
+0xEA57 0x9DC2 # <CJK>
+0xEA58 0x9DD9 # <CJK>
+0xEA59 0x9DD3 # <CJK>
+0xEA5A 0x9DF8 # <CJK>
+0xEA5B 0x9DE6 # <CJK>
+0xEA5C 0x9DED # <CJK>
+0xEA5D 0x9DEF # <CJK>
+0xEA5E 0x9DFD # <CJK>
+0xEA5F 0x9E1A # <CJK>
+0xEA60 0x9E1B # <CJK>
+0xEA61 0x9E1E # <CJK>
+0xEA62 0x9E75 # <CJK>
+0xEA63 0x9E79 # <CJK>
+0xEA64 0x9E7D # <CJK>
+0xEA65 0x9E81 # <CJK>
+0xEA66 0x9E88 # <CJK>
+0xEA67 0x9E8B # <CJK>
+0xEA68 0x9E8C # <CJK>
+0xEA69 0x9E92 # <CJK>
+0xEA6A 0x9E95 # <CJK>
+0xEA6B 0x9E91 # <CJK>
+0xEA6C 0x9E9D # <CJK>
+0xEA6D 0x9EA5 # <CJK>
+0xEA6E 0x9EA9 # <CJK>
+0xEA6F 0x9EB8 # <CJK>
+0xEA70 0x9EAA # <CJK>
+0xEA71 0x9EAD # <CJK>
+0xEA72 0x9761 # <CJK>
+0xEA73 0x9ECC # <CJK>
+0xEA74 0x9ECE # <CJK>
+0xEA75 0x9ECF # <CJK>
+0xEA76 0x9ED0 # <CJK>
+0xEA77 0x9ED4 # <CJK>
+0xEA78 0x9EDC # <CJK>
+0xEA79 0x9EDE # <CJK>
+0xEA7A 0x9EDD # <CJK>
+0xEA7B 0x9EE0 # <CJK>
+0xEA7C 0x9EE5 # <CJK>
+0xEA7D 0x9EE8 # <CJK>
+0xEA7E 0x9EEF # <CJK>
+0xEA80 0x9EF4 # <CJK>
+0xEA81 0x9EF6 # <CJK>
+0xEA82 0x9EF7 # <CJK>
+0xEA83 0x9EF9 # <CJK>
+0xEA84 0x9EFB # <CJK>
+0xEA85 0x9EFC # <CJK>
+0xEA86 0x9EFD # <CJK>
+0xEA87 0x9F07 # <CJK>
+0xEA88 0x9F08 # <CJK>
+0xEA89 0x76B7 # <CJK>
+0xEA8A 0x9F15 # <CJK>
+0xEA8B 0x9F21 # <CJK>
+0xEA8C 0x9F2C # <CJK>
+0xEA8D 0x9F3E # <CJK>
+0xEA8E 0x9F4A # <CJK>
+0xEA8F 0x9F52 # <CJK>
+0xEA90 0x9F54 # <CJK>
+0xEA91 0x9F63 # <CJK>
+0xEA92 0x9F5F # <CJK>
+0xEA93 0x9F60 # <CJK>
+0xEA94 0x9F61 # <CJK>
+0xEA95 0x9F66 # <CJK>
+0xEA96 0x9F67 # <CJK>
+0xEA97 0x9F6C # <CJK>
+0xEA98 0x9F6A # <CJK>
+0xEA99 0x9F77 # <CJK>
+0xEA9A 0x9F72 # <CJK>
+0xEA9B 0x9F76 # <CJK>
+0xEA9C 0x9F95 # <CJK>
+0xEA9D 0x9F9C # <CJK>
+0xEA9E 0x9FA0 # <CJK>
+0xEA9F 0x582F # <CJK>
+0xEAA0 0x69C7 # <CJK>
+0xEAA1 0x9059 # <CJK>
+0xEAA2 0x7464 # <CJK>
+0xEAA3 0x51DC # <CJK>
+0xEAA4 0x7199 # <CJK>
+
+# Apple additions - vertical forms
+0xEB41 0x3001+0xF87E # vertical form for IDEOGRAPHIC COMMA
+0xEB42 0x3002+0xF87E # vertical form for IDEOGRAPHIC FULL STOP
+0xEB50 0xFFE3+0xF87E # vertical form for FULLWIDTH MACRON
+0xEB51 0xFE33 # PRESENTATION FORM FOR VERTICAL LOW LINE, U+FF3F
+0xEB5B 0x30FC+0xF87E # vertical form for KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xEB5C 0xFE31 # PRESENTATION FORM FOR VERTICAL EM DASH, U+2014
+0xEB5D 0x2010+0xF87E # vertical form for HYPHEN
+0xEB60 0x301C+0xF87E # vertical form for WAVE DASH
+0xEB61 0x2016+0xF87E # vertical form for DOUBLE VERTICAL LINE
+0xEB62 0xFF5C+0xF87E # vertical form for FULLWIDTH VERTICAL LINE
+0xEB63 0x2026+0xF87E # vertical form for HORIZONTAL ELLIPSIS
+0xEB64 0xFE30 # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER, U+2025
+0xEB69 0xFE35 # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS, U+FF08
+0xEB6A 0xFE36 # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS, U+FF09
+0xEB6B 0xFE39 # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET, U+3014
+0xEB6C 0xFE3A # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET, U+3015
+0xEB6D 0xFF3B+0xF87E # vertical form for FULLWIDTH LEFT SQUARE BRACKET # or for Unicode 4.0, 0xFE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+0xEB6E 0xFF3D+0xF87E # vertical form for FULLWIDTH RIGHT SQUARE BRACKET # or for Unicode 4.0, 0xFE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+0xEB6F 0xFE37 # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET, U+FF5B
+0xEB70 0xFE38 # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET, U+FF5D
+0xEB71 0xFE3F # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET, U+3008
+0xEB72 0xFE40 # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET, U+3009
+0xEB73 0xFE3D # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET, U+300A
+0xEB74 0xFE3E # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET, U+300B
+0xEB75 0xFE41 # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET, U+300C
+0xEB76 0xFE42 # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET, U+300D
+0xEB77 0xFE43 # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET, U+300E
+0xEB78 0xFE44 # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET, U+300F
+0xEB79 0xFE3B # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET, U+3010
+0xEB7A 0xFE3C # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET, U+3011
+0xEB81 0xFF1D+0xF87E # vertical form for FULLWIDTH EQUALS SIGN
+0xEC9F 0x3041+0xF87E # vertical form for HIRAGANA LETTER SMALL A
+0xECA1 0x3043+0xF87E # vertical form for HIRAGANA LETTER SMALL I
+0xECA3 0x3045+0xF87E # vertical form for HIRAGANA LETTER SMALL U
+0xECA5 0x3047+0xF87E # vertical form for HIRAGANA LETTER SMALL E
+0xECA7 0x3049+0xF87E # vertical form for HIRAGANA LETTER SMALL O
+0xECC1 0x3063+0xF87E # vertical form for HIRAGANA LETTER SMALL TU
+0xECE1 0x3083+0xF87E # vertical form for HIRAGANA LETTER SMALL YA
+0xECE3 0x3085+0xF87E # vertical form for HIRAGANA LETTER SMALL YU
+0xECE5 0x3087+0xF87E # vertical form for HIRAGANA LETTER SMALL YO
+0xECEC 0x308E+0xF87E # vertical form for HIRAGANA LETTER SMALL WA
+0xED40 0x30A1+0xF87E # vertical form for KATAKANA LETTER SMALL A
+0xED42 0x30A3+0xF87E # vertical form for KATAKANA LETTER SMALL I
+0xED44 0x30A5+0xF87E # vertical form for KATAKANA LETTER SMALL U
+0xED46 0x30A7+0xF87E # vertical form for KATAKANA LETTER SMALL E
+0xED48 0x30A9+0xF87E # vertical form for KATAKANA LETTER SMALL O
+0xED62 0x30C3+0xF87E # vertical form for KATAKANA LETTER SMALL TU
+0xED83 0x30E3+0xF87E # vertical form for KATAKANA LETTER SMALL YA
+0xED85 0x30E5+0xF87E # vertical form for KATAKANA LETTER SMALL YU
+0xED87 0x30E7+0xF87E # vertical form for KATAKANA LETTER SMALL YO
+0xED8E 0x30EE+0xF87E # vertical form for KATAKANA LETTER SMALL WA
+0xED95 0x30F5+0xF87E # vertical form for KATAKANA LETTER SMALL KA
+0xED96 0x30F6+0xF87E # vertical form for KATAKANA LETTER SMALL KE
diff --git a/ext/mbstring/tests/data/SHIFTJIS.txt b/ext/mbstring/tests/data/SHIFTJIS.txt
new file mode 100644
index 0000000000..757d5a1099
--- /dev/null
+++ b/ext/mbstring/tests/data/SHIFTJIS.txt
@@ -0,0 +1,7097 @@
+# SHIFTJIS.TXT
+# Date: 2015-12-02 23:52:00 GMT [KW]
+# © 2015 Unicode®, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Name: Shift-JIS to Unicode
+# Unicode version: 1.1
+# Table version: 2.0
+# Table format: Format A
+# Date: 2011 October 14 (header updated: 2015 December 02)
+#
+# General notes:
+#
+#
+# This table contains one set of mappings from Shift-JIS into Unicode.
+# Note that these data are *possible* mappings only and may not be the
+# same as those used by actual products, nor may they be the best suited
+# for all uses. For more information on the mappings between various code
+# pages incorporating the repertoire of Shift-JIS and Unicode, consult the
+# VENDORS mapping data.
+#
+#
+# Format: Three tab-separated columns
+# Column #1 is the shift-JIS code (in hex)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+# The official names for Unicode characters U+4E00
+# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
+# where XXXX is the code point. Including all these
+# names in this file increases its size substantially
+# and needlessly. The token "<CJK>" is used for the
+# name of these characters. If necessary, it can be
+# expanded algorithmically by a parser or editor.
+#
+# The entries are ordered by their Shift-JIS codes as follows:
+# Single-byte characters precede double-byte characters
+# The single-byte and double-byte blocks are in ascending
+# hexadecimal order
+# There is an alternative order some people might be preferred,
+# where all the entries are in order of the top (or only) byte.
+# This alternate order can be generated from the one given here
+# by a simple sort.
+#
+# Revision History:
+#
+# [v2.0, 2015 December 02]
+# updates to copyright notice and terms of use
+# no changes to character mappings
+#
+# [v1.0, 2011 October 14]
+# Updated terms of use to current wording.
+# Updated contact information.
+# No changes to the mapping data.
+#
+# [v0.9, 8 March 1994]
+# First release.
+#
+# Use the Unicode reporting form <http://www.unicode.org/reporting.html>
+# for any questions or comments or to report errors in the data.
+#
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x00A5 # YEN SIGN
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x203E # OVERLINE
+0x8140 0x3000 # IDEOGRAPHIC SPACE
+0x8141 0x3001 # IDEOGRAPHIC COMMA
+0x8142 0x3002 # IDEOGRAPHIC FULL STOP
+0x8143 0xFF0C # FULLWIDTH COMMA
+0x8144 0xFF0E # FULLWIDTH FULL STOP
+0x8145 0x30FB # KATAKANA MIDDLE DOT
+0x8146 0xFF1A # FULLWIDTH COLON
+0x8147 0xFF1B # FULLWIDTH SEMICOLON
+0x8148 0xFF1F # FULLWIDTH QUESTION MARK
+0x8149 0xFF01 # FULLWIDTH EXCLAMATION MARK
+0x814A 0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B 0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C 0x00B4 # ACUTE ACCENT
+0x814D 0xFF40 # FULLWIDTH GRAVE ACCENT
+0x814E 0x00A8 # DIAERESIS
+0x814F 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 0xFFE3 # FULLWIDTH MACRON
+0x8151 0xFF3F # FULLWIDTH LOW LINE
+0x8152 0x30FD # KATAKANA ITERATION MARK
+0x8153 0x30FE # KATAKANA VOICED ITERATION MARK
+0x8154 0x309D # HIRAGANA ITERATION MARK
+0x8155 0x309E # HIRAGANA VOICED ITERATION MARK
+0x8156 0x3003 # DITTO MARK
+0x8157 0x4EDD # <CJK>
+0x8158 0x3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 0x3006 # IDEOGRAPHIC CLOSING MARK
+0x815A 0x3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B 0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C 0x2015 # HORIZONTAL BAR
+0x815D 0x2010 # HYPHEN
+0x815E 0xFF0F # FULLWIDTH SOLIDUS
+0x815F 0x005C # REVERSE SOLIDUS
+0x8160 0x301C # WAVE DASH
+0x8161 0x2016 # DOUBLE VERTICAL LINE
+0x8162 0xFF5C # FULLWIDTH VERTICAL LINE
+0x8163 0x2026 # HORIZONTAL ELLIPSIS
+0x8164 0x2025 # TWO DOT LEADER
+0x8165 0x2018 # LEFT SINGLE QUOTATION MARK
+0x8166 0x2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 0x201C # LEFT DOUBLE QUOTATION MARK
+0x8168 0x201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 0xFF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A 0xFF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B 0x3014 # LEFT TORTOISE SHELL BRACKET
+0x816C 0x3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F 0xFF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 0x3008 # LEFT ANGLE BRACKET
+0x8172 0x3009 # RIGHT ANGLE BRACKET
+0x8173 0x300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 0x300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 0x300C # LEFT CORNER BRACKET
+0x8176 0x300D # RIGHT CORNER BRACKET
+0x8177 0x300E # LEFT WHITE CORNER BRACKET
+0x8178 0x300F # RIGHT WHITE CORNER BRACKET
+0x8179 0x3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A 0x3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B 0xFF0B # FULLWIDTH PLUS SIGN
+0x817C 0x2212 # MINUS SIGN
+0x817D 0x00B1 # PLUS-MINUS SIGN
+0x817E 0x00D7 # MULTIPLICATION SIGN
+0x8180 0x00F7 # DIVISION SIGN
+0x8181 0xFF1D # FULLWIDTH EQUALS SIGN
+0x8182 0x2260 # NOT EQUAL TO
+0x8183 0xFF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 0xFF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 0x2266 # LESS-THAN OVER EQUAL TO
+0x8186 0x2267 # GREATER-THAN OVER EQUAL TO
+0x8187 0x221E # INFINITY
+0x8188 0x2234 # THEREFORE
+0x8189 0x2642 # MALE SIGN
+0x818A 0x2640 # FEMALE SIGN
+0x818B 0x00B0 # DEGREE SIGN
+0x818C 0x2032 # PRIME
+0x818D 0x2033 # DOUBLE PRIME
+0x818E 0x2103 # DEGREE CELSIUS
+0x818F 0xFFE5 # FULLWIDTH YEN SIGN
+0x8190 0xFF04 # FULLWIDTH DOLLAR SIGN
+0x8191 0x00A2 # CENT SIGN
+0x8192 0x00A3 # POUND SIGN
+0x8193 0xFF05 # FULLWIDTH PERCENT SIGN
+0x8194 0xFF03 # FULLWIDTH NUMBER SIGN
+0x8195 0xFF06 # FULLWIDTH AMPERSAND
+0x8196 0xFF0A # FULLWIDTH ASTERISK
+0x8197 0xFF20 # FULLWIDTH COMMERCIAL AT
+0x8198 0x00A7 # SECTION SIGN
+0x8199 0x2606 # WHITE STAR
+0x819A 0x2605 # BLACK STAR
+0x819B 0x25CB # WHITE CIRCLE
+0x819C 0x25CF # BLACK CIRCLE
+0x819D 0x25CE # BULLSEYE
+0x819E 0x25C7 # WHITE DIAMOND
+0x819F 0x25C6 # BLACK DIAMOND
+0x81A0 0x25A1 # WHITE SQUARE
+0x81A1 0x25A0 # BLACK SQUARE
+0x81A2 0x25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 0x25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 0x25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 0x25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 0x203B # REFERENCE MARK
+0x81A7 0x3012 # POSTAL MARK
+0x81A8 0x2192 # RIGHTWARDS ARROW
+0x81A9 0x2190 # LEFTWARDS ARROW
+0x81AA 0x2191 # UPWARDS ARROW
+0x81AB 0x2193 # DOWNWARDS ARROW
+0x81AC 0x3013 # GETA MARK
+0x81B8 0x2208 # ELEMENT OF
+0x81B9 0x220B # CONTAINS AS MEMBER
+0x81BA 0x2286 # SUBSET OF OR EQUAL TO
+0x81BB 0x2287 # SUPERSET OF OR EQUAL TO
+0x81BC 0x2282 # SUBSET OF
+0x81BD 0x2283 # SUPERSET OF
+0x81BE 0x222A # UNION
+0x81BF 0x2229 # INTERSECTION
+0x81C8 0x2227 # LOGICAL AND
+0x81C9 0x2228 # LOGICAL OR
+0x81CA 0x00AC # NOT SIGN
+0x81CB 0x21D2 # RIGHTWARDS DOUBLE ARROW
+0x81CC 0x21D4 # LEFT RIGHT DOUBLE ARROW
+0x81CD 0x2200 # FOR ALL
+0x81CE 0x2203 # THERE EXISTS
+0x81DA 0x2220 # ANGLE
+0x81DB 0x22A5 # UP TACK
+0x81DC 0x2312 # ARC
+0x81DD 0x2202 # PARTIAL DIFFERENTIAL
+0x81DE 0x2207 # NABLA
+0x81DF 0x2261 # IDENTICAL TO
+0x81E0 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+0x81E1 0x226A # MUCH LESS-THAN
+0x81E2 0x226B # MUCH GREATER-THAN
+0x81E3 0x221A # SQUARE ROOT
+0x81E4 0x223D # REVERSED TILDE
+0x81E5 0x221D # PROPORTIONAL TO
+0x81E6 0x2235 # BECAUSE
+0x81E7 0x222B # INTEGRAL
+0x81E8 0x222C # DOUBLE INTEGRAL
+0x81F0 0x212B # ANGSTROM SIGN
+0x81F1 0x2030 # PER MILLE SIGN
+0x81F2 0x266F # MUSIC SHARP SIGN
+0x81F3 0x266D # MUSIC FLAT SIGN
+0x81F4 0x266A # EIGHTH NOTE
+0x81F5 0x2020 # DAGGER
+0x81F6 0x2021 # DOUBLE DAGGER
+0x81F7 0x00B6 # PILCROW SIGN
+0x81FC 0x25EF # LARGE CIRCLE
+0x824F 0xFF10 # FULLWIDTH DIGIT ZERO
+0x8250 0xFF11 # FULLWIDTH DIGIT ONE
+0x8251 0xFF12 # FULLWIDTH DIGIT TWO
+0x8252 0xFF13 # FULLWIDTH DIGIT THREE
+0x8253 0xFF14 # FULLWIDTH DIGIT FOUR
+0x8254 0xFF15 # FULLWIDTH DIGIT FIVE
+0x8255 0xFF16 # FULLWIDTH DIGIT SIX
+0x8256 0xFF17 # FULLWIDTH DIGIT SEVEN
+0x8257 0xFF18 # FULLWIDTH DIGIT EIGHT
+0x8258 0xFF19 # FULLWIDTH DIGIT NINE
+0x8260 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x8281 0xFF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 0xFF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 0xFF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 0xFF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 0xFF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 0xFF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 0xFF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 0xFF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 0xFF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 0xFF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 0xFF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 0xFF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 0xFF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 0xFF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 0xFF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 0xFF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 0xFF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829F 0x3041 # HIRAGANA LETTER SMALL A
+0x82A0 0x3042 # HIRAGANA LETTER A
+0x82A1 0x3043 # HIRAGANA LETTER SMALL I
+0x82A2 0x3044 # HIRAGANA LETTER I
+0x82A3 0x3045 # HIRAGANA LETTER SMALL U
+0x82A4 0x3046 # HIRAGANA LETTER U
+0x82A5 0x3047 # HIRAGANA LETTER SMALL E
+0x82A6 0x3048 # HIRAGANA LETTER E
+0x82A7 0x3049 # HIRAGANA LETTER SMALL O
+0x82A8 0x304A # HIRAGANA LETTER O
+0x82A9 0x304B # HIRAGANA LETTER KA
+0x82AA 0x304C # HIRAGANA LETTER GA
+0x82AB 0x304D # HIRAGANA LETTER KI
+0x82AC 0x304E # HIRAGANA LETTER GI
+0x82AD 0x304F # HIRAGANA LETTER KU
+0x82AE 0x3050 # HIRAGANA LETTER GU
+0x82AF 0x3051 # HIRAGANA LETTER KE
+0x82B0 0x3052 # HIRAGANA LETTER GE
+0x82B1 0x3053 # HIRAGANA LETTER KO
+0x82B2 0x3054 # HIRAGANA LETTER GO
+0x82B3 0x3055 # HIRAGANA LETTER SA
+0x82B4 0x3056 # HIRAGANA LETTER ZA
+0x82B5 0x3057 # HIRAGANA LETTER SI
+0x82B6 0x3058 # HIRAGANA LETTER ZI
+0x82B7 0x3059 # HIRAGANA LETTER SU
+0x82B8 0x305A # HIRAGANA LETTER ZU
+0x82B9 0x305B # HIRAGANA LETTER SE
+0x82BA 0x305C # HIRAGANA LETTER ZE
+0x82BB 0x305D # HIRAGANA LETTER SO
+0x82BC 0x305E # HIRAGANA LETTER ZO
+0x82BD 0x305F # HIRAGANA LETTER TA
+0x82BE 0x3060 # HIRAGANA LETTER DA
+0x82BF 0x3061 # HIRAGANA LETTER TI
+0x82C0 0x3062 # HIRAGANA LETTER DI
+0x82C1 0x3063 # HIRAGANA LETTER SMALL TU
+0x82C2 0x3064 # HIRAGANA LETTER TU
+0x82C3 0x3065 # HIRAGANA LETTER DU
+0x82C4 0x3066 # HIRAGANA LETTER TE
+0x82C5 0x3067 # HIRAGANA LETTER DE
+0x82C6 0x3068 # HIRAGANA LETTER TO
+0x82C7 0x3069 # HIRAGANA LETTER DO
+0x82C8 0x306A # HIRAGANA LETTER NA
+0x82C9 0x306B # HIRAGANA LETTER NI
+0x82CA 0x306C # HIRAGANA LETTER NU
+0x82CB 0x306D # HIRAGANA LETTER NE
+0x82CC 0x306E # HIRAGANA LETTER NO
+0x82CD 0x306F # HIRAGANA LETTER HA
+0x82CE 0x3070 # HIRAGANA LETTER BA
+0x82CF 0x3071 # HIRAGANA LETTER PA
+0x82D0 0x3072 # HIRAGANA LETTER HI
+0x82D1 0x3073 # HIRAGANA LETTER BI
+0x82D2 0x3074 # HIRAGANA LETTER PI
+0x82D3 0x3075 # HIRAGANA LETTER HU
+0x82D4 0x3076 # HIRAGANA LETTER BU
+0x82D5 0x3077 # HIRAGANA LETTER PU
+0x82D6 0x3078 # HIRAGANA LETTER HE
+0x82D7 0x3079 # HIRAGANA LETTER BE
+0x82D8 0x307A # HIRAGANA LETTER PE
+0x82D9 0x307B # HIRAGANA LETTER HO
+0x82DA 0x307C # HIRAGANA LETTER BO
+0x82DB 0x307D # HIRAGANA LETTER PO
+0x82DC 0x307E # HIRAGANA LETTER MA
+0x82DD 0x307F # HIRAGANA LETTER MI
+0x82DE 0x3080 # HIRAGANA LETTER MU
+0x82DF 0x3081 # HIRAGANA LETTER ME
+0x82E0 0x3082 # HIRAGANA LETTER MO
+0x82E1 0x3083 # HIRAGANA LETTER SMALL YA
+0x82E2 0x3084 # HIRAGANA LETTER YA
+0x82E3 0x3085 # HIRAGANA LETTER SMALL YU
+0x82E4 0x3086 # HIRAGANA LETTER YU
+0x82E5 0x3087 # HIRAGANA LETTER SMALL YO
+0x82E6 0x3088 # HIRAGANA LETTER YO
+0x82E7 0x3089 # HIRAGANA LETTER RA
+0x82E8 0x308A # HIRAGANA LETTER RI
+0x82E9 0x308B # HIRAGANA LETTER RU
+0x82EA 0x308C # HIRAGANA LETTER RE
+0x82EB 0x308D # HIRAGANA LETTER RO
+0x82EC 0x308E # HIRAGANA LETTER SMALL WA
+0x82ED 0x308F # HIRAGANA LETTER WA
+0x82EE 0x3090 # HIRAGANA LETTER WI
+0x82EF 0x3091 # HIRAGANA LETTER WE
+0x82F0 0x3092 # HIRAGANA LETTER WO
+0x82F1 0x3093 # HIRAGANA LETTER N
+0x8340 0x30A1 # KATAKANA LETTER SMALL A
+0x8341 0x30A2 # KATAKANA LETTER A
+0x8342 0x30A3 # KATAKANA LETTER SMALL I
+0x8343 0x30A4 # KATAKANA LETTER I
+0x8344 0x30A5 # KATAKANA LETTER SMALL U
+0x8345 0x30A6 # KATAKANA LETTER U
+0x8346 0x30A7 # KATAKANA LETTER SMALL E
+0x8347 0x30A8 # KATAKANA LETTER E
+0x8348 0x30A9 # KATAKANA LETTER SMALL O
+0x8349 0x30AA # KATAKANA LETTER O
+0x834A 0x30AB # KATAKANA LETTER KA
+0x834B 0x30AC # KATAKANA LETTER GA
+0x834C 0x30AD # KATAKANA LETTER KI
+0x834D 0x30AE # KATAKANA LETTER GI
+0x834E 0x30AF # KATAKANA LETTER KU
+0x834F 0x30B0 # KATAKANA LETTER GU
+0x8350 0x30B1 # KATAKANA LETTER KE
+0x8351 0x30B2 # KATAKANA LETTER GE
+0x8352 0x30B3 # KATAKANA LETTER KO
+0x8353 0x30B4 # KATAKANA LETTER GO
+0x8354 0x30B5 # KATAKANA LETTER SA
+0x8355 0x30B6 # KATAKANA LETTER ZA
+0x8356 0x30B7 # KATAKANA LETTER SI
+0x8357 0x30B8 # KATAKANA LETTER ZI
+0x8358 0x30B9 # KATAKANA LETTER SU
+0x8359 0x30BA # KATAKANA LETTER ZU
+0x835A 0x30BB # KATAKANA LETTER SE
+0x835B 0x30BC # KATAKANA LETTER ZE
+0x835C 0x30BD # KATAKANA LETTER SO
+0x835D 0x30BE # KATAKANA LETTER ZO
+0x835E 0x30BF # KATAKANA LETTER TA
+0x835F 0x30C0 # KATAKANA LETTER DA
+0x8360 0x30C1 # KATAKANA LETTER TI
+0x8361 0x30C2 # KATAKANA LETTER DI
+0x8362 0x30C3 # KATAKANA LETTER SMALL TU
+0x8363 0x30C4 # KATAKANA LETTER TU
+0x8364 0x30C5 # KATAKANA LETTER DU
+0x8365 0x30C6 # KATAKANA LETTER TE
+0x8366 0x30C7 # KATAKANA LETTER DE
+0x8367 0x30C8 # KATAKANA LETTER TO
+0x8368 0x30C9 # KATAKANA LETTER DO
+0x8369 0x30CA # KATAKANA LETTER NA
+0x836A 0x30CB # KATAKANA LETTER NI
+0x836B 0x30CC # KATAKANA LETTER NU
+0x836C 0x30CD # KATAKANA LETTER NE
+0x836D 0x30CE # KATAKANA LETTER NO
+0x836E 0x30CF # KATAKANA LETTER HA
+0x836F 0x30D0 # KATAKANA LETTER BA
+0x8370 0x30D1 # KATAKANA LETTER PA
+0x8371 0x30D2 # KATAKANA LETTER HI
+0x8372 0x30D3 # KATAKANA LETTER BI
+0x8373 0x30D4 # KATAKANA LETTER PI
+0x8374 0x30D5 # KATAKANA LETTER HU
+0x8375 0x30D6 # KATAKANA LETTER BU
+0x8376 0x30D7 # KATAKANA LETTER PU
+0x8377 0x30D8 # KATAKANA LETTER HE
+0x8378 0x30D9 # KATAKANA LETTER BE
+0x8379 0x30DA # KATAKANA LETTER PE
+0x837A 0x30DB # KATAKANA LETTER HO
+0x837B 0x30DC # KATAKANA LETTER BO
+0x837C 0x30DD # KATAKANA LETTER PO
+0x837D 0x30DE # KATAKANA LETTER MA
+0x837E 0x30DF # KATAKANA LETTER MI
+0x8380 0x30E0 # KATAKANA LETTER MU
+0x8381 0x30E1 # KATAKANA LETTER ME
+0x8382 0x30E2 # KATAKANA LETTER MO
+0x8383 0x30E3 # KATAKANA LETTER SMALL YA
+0x8384 0x30E4 # KATAKANA LETTER YA
+0x8385 0x30E5 # KATAKANA LETTER SMALL YU
+0x8386 0x30E6 # KATAKANA LETTER YU
+0x8387 0x30E7 # KATAKANA LETTER SMALL YO
+0x8388 0x30E8 # KATAKANA LETTER YO
+0x8389 0x30E9 # KATAKANA LETTER RA
+0x838A 0x30EA # KATAKANA LETTER RI
+0x838B 0x30EB # KATAKANA LETTER RU
+0x838C 0x30EC # KATAKANA LETTER RE
+0x838D 0x30ED # KATAKANA LETTER RO
+0x838E 0x30EE # KATAKANA LETTER SMALL WA
+0x838F 0x30EF # KATAKANA LETTER WA
+0x8390 0x30F0 # KATAKANA LETTER WI
+0x8391 0x30F1 # KATAKANA LETTER WE
+0x8392 0x30F2 # KATAKANA LETTER WO
+0x8393 0x30F3 # KATAKANA LETTER N
+0x8394 0x30F4 # KATAKANA LETTER VU
+0x8395 0x30F5 # KATAKANA LETTER SMALL KA
+0x8396 0x30F6 # KATAKANA LETTER SMALL KE
+0x839F 0x0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 0x0392 # GREEK CAPITAL LETTER BETA
+0x83A1 0x0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 0x0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 0x0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 0x0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 0x0397 # GREEK CAPITAL LETTER ETA
+0x83A6 0x0398 # GREEK CAPITAL LETTER THETA
+0x83A7 0x0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 0x039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 0x039B # GREEK CAPITAL LETTER LAMDA
+0x83AA 0x039C # GREEK CAPITAL LETTER MU
+0x83AB 0x039D # GREEK CAPITAL LETTER NU
+0x83AC 0x039E # GREEK CAPITAL LETTER XI
+0x83AD 0x039F # GREEK CAPITAL LETTER OMICRON
+0x83AE 0x03A0 # GREEK CAPITAL LETTER PI
+0x83AF 0x03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 0x03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 0x03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 0x03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 0x03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 0x03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 0x03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 0x03A9 # GREEK CAPITAL LETTER OMEGA
+0x83BF 0x03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 0x03B2 # GREEK SMALL LETTER BETA
+0x83C1 0x03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 0x03B4 # GREEK SMALL LETTER DELTA
+0x83C3 0x03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 0x03B6 # GREEK SMALL LETTER ZETA
+0x83C5 0x03B7 # GREEK SMALL LETTER ETA
+0x83C6 0x03B8 # GREEK SMALL LETTER THETA
+0x83C7 0x03B9 # GREEK SMALL LETTER IOTA
+0x83C8 0x03BA # GREEK SMALL LETTER KAPPA
+0x83C9 0x03BB # GREEK SMALL LETTER LAMDA
+0x83CA 0x03BC # GREEK SMALL LETTER MU
+0x83CB 0x03BD # GREEK SMALL LETTER NU
+0x83CC 0x03BE # GREEK SMALL LETTER XI
+0x83CD 0x03BF # GREEK SMALL LETTER OMICRON
+0x83CE 0x03C0 # GREEK SMALL LETTER PI
+0x83CF 0x03C1 # GREEK SMALL LETTER RHO
+0x83D0 0x03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 0x03C4 # GREEK SMALL LETTER TAU
+0x83D2 0x03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 0x03C6 # GREEK SMALL LETTER PHI
+0x83D4 0x03C7 # GREEK SMALL LETTER CHI
+0x83D5 0x03C8 # GREEK SMALL LETTER PSI
+0x83D6 0x03C9 # GREEK SMALL LETTER OMEGA
+0x8440 0x0410 # CYRILLIC CAPITAL LETTER A
+0x8441 0x0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 0x0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 0x0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 0x0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 0x0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 0x0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 0x0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 0x0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 0x0418 # CYRILLIC CAPITAL LETTER I
+0x844A 0x0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B 0x041A # CYRILLIC CAPITAL LETTER KA
+0x844C 0x041B # CYRILLIC CAPITAL LETTER EL
+0x844D 0x041C # CYRILLIC CAPITAL LETTER EM
+0x844E 0x041D # CYRILLIC CAPITAL LETTER EN
+0x844F 0x041E # CYRILLIC CAPITAL LETTER O
+0x8450 0x041F # CYRILLIC CAPITAL LETTER PE
+0x8451 0x0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 0x0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 0x0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 0x0423 # CYRILLIC CAPITAL LETTER U
+0x8455 0x0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 0x0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 0x0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 0x0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 0x0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A 0x0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C 0x042B # CYRILLIC CAPITAL LETTER YERU
+0x845D 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E 0x042D # CYRILLIC CAPITAL LETTER E
+0x845F 0x042E # CYRILLIC CAPITAL LETTER YU
+0x8460 0x042F # CYRILLIC CAPITAL LETTER YA
+0x8470 0x0430 # CYRILLIC SMALL LETTER A
+0x8471 0x0431 # CYRILLIC SMALL LETTER BE
+0x8472 0x0432 # CYRILLIC SMALL LETTER VE
+0x8473 0x0433 # CYRILLIC SMALL LETTER GHE
+0x8474 0x0434 # CYRILLIC SMALL LETTER DE
+0x8475 0x0435 # CYRILLIC SMALL LETTER IE
+0x8476 0x0451 # CYRILLIC SMALL LETTER IO
+0x8477 0x0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 0x0437 # CYRILLIC SMALL LETTER ZE
+0x8479 0x0438 # CYRILLIC SMALL LETTER I
+0x847A 0x0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B 0x043A # CYRILLIC SMALL LETTER KA
+0x847C 0x043B # CYRILLIC SMALL LETTER EL
+0x847D 0x043C # CYRILLIC SMALL LETTER EM
+0x847E 0x043D # CYRILLIC SMALL LETTER EN
+0x8480 0x043E # CYRILLIC SMALL LETTER O
+0x8481 0x043F # CYRILLIC SMALL LETTER PE
+0x8482 0x0440 # CYRILLIC SMALL LETTER ER
+0x8483 0x0441 # CYRILLIC SMALL LETTER ES
+0x8484 0x0442 # CYRILLIC SMALL LETTER TE
+0x8485 0x0443 # CYRILLIC SMALL LETTER U
+0x8486 0x0444 # CYRILLIC SMALL LETTER EF
+0x8487 0x0445 # CYRILLIC SMALL LETTER HA
+0x8488 0x0446 # CYRILLIC SMALL LETTER TSE
+0x8489 0x0447 # CYRILLIC SMALL LETTER CHE
+0x848A 0x0448 # CYRILLIC SMALL LETTER SHA
+0x848B 0x0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C 0x044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D 0x044B # CYRILLIC SMALL LETTER YERU
+0x848E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F 0x044D # CYRILLIC SMALL LETTER E
+0x8490 0x044E # CYRILLIC SMALL LETTER YU
+0x8491 0x044F # CYRILLIC SMALL LETTER YA
+0x849F 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL
+0x84A0 0x2502 # BOX DRAWINGS LIGHT VERTICAL
+0x84A1 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT
+0x84A2 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT
+0x84A3 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT
+0x84A4 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT
+0x84A5 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+0x84A6 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+0x84A7 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT
+0x84A8 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL
+0x84A9 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+0x84AA 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
+0x84AB 0x2503 # BOX DRAWINGS HEAVY VERTICAL
+0x84AC 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT
+0x84AD 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT
+0x84AE 0x251B # BOX DRAWINGS HEAVY UP AND LEFT
+0x84AF 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT
+0x84B0 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+0x84B1 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+0x84B2 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT
+0x84B3 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL
+0x84B4 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+0x84B5 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+0x84B6 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+0x84B7 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+0x84B8 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+0x84B9 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+0x84BA 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+0x84BB 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+0x84BC 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+0x84BD 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+0x84BE 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+0x889F 0x4E9C # <CJK>
+0x88A0 0x5516 # <CJK>
+0x88A1 0x5A03 # <CJK>
+0x88A2 0x963F # <CJK>
+0x88A3 0x54C0 # <CJK>
+0x88A4 0x611B # <CJK>
+0x88A5 0x6328 # <CJK>
+0x88A6 0x59F6 # <CJK>
+0x88A7 0x9022 # <CJK>
+0x88A8 0x8475 # <CJK>
+0x88A9 0x831C # <CJK>
+0x88AA 0x7A50 # <CJK>
+0x88AB 0x60AA # <CJK>
+0x88AC 0x63E1 # <CJK>
+0x88AD 0x6E25 # <CJK>
+0x88AE 0x65ED # <CJK>
+0x88AF 0x8466 # <CJK>
+0x88B0 0x82A6 # <CJK>
+0x88B1 0x9BF5 # <CJK>
+0x88B2 0x6893 # <CJK>
+0x88B3 0x5727 # <CJK>
+0x88B4 0x65A1 # <CJK>
+0x88B5 0x6271 # <CJK>
+0x88B6 0x5B9B # <CJK>
+0x88B7 0x59D0 # <CJK>
+0x88B8 0x867B # <CJK>
+0x88B9 0x98F4 # <CJK>
+0x88BA 0x7D62 # <CJK>
+0x88BB 0x7DBE # <CJK>
+0x88BC 0x9B8E # <CJK>
+0x88BD 0x6216 # <CJK>
+0x88BE 0x7C9F # <CJK>
+0x88BF 0x88B7 # <CJK>
+0x88C0 0x5B89 # <CJK>
+0x88C1 0x5EB5 # <CJK>
+0x88C2 0x6309 # <CJK>
+0x88C3 0x6697 # <CJK>
+0x88C4 0x6848 # <CJK>
+0x88C5 0x95C7 # <CJK>
+0x88C6 0x978D # <CJK>
+0x88C7 0x674F # <CJK>
+0x88C8 0x4EE5 # <CJK>
+0x88C9 0x4F0A # <CJK>
+0x88CA 0x4F4D # <CJK>
+0x88CB 0x4F9D # <CJK>
+0x88CC 0x5049 # <CJK>
+0x88CD 0x56F2 # <CJK>
+0x88CE 0x5937 # <CJK>
+0x88CF 0x59D4 # <CJK>
+0x88D0 0x5A01 # <CJK>
+0x88D1 0x5C09 # <CJK>
+0x88D2 0x60DF # <CJK>
+0x88D3 0x610F # <CJK>
+0x88D4 0x6170 # <CJK>
+0x88D5 0x6613 # <CJK>
+0x88D6 0x6905 # <CJK>
+0x88D7 0x70BA # <CJK>
+0x88D8 0x754F # <CJK>
+0x88D9 0x7570 # <CJK>
+0x88DA 0x79FB # <CJK>
+0x88DB 0x7DAD # <CJK>
+0x88DC 0x7DEF # <CJK>
+0x88DD 0x80C3 # <CJK>
+0x88DE 0x840E # <CJK>
+0x88DF 0x8863 # <CJK>
+0x88E0 0x8B02 # <CJK>
+0x88E1 0x9055 # <CJK>
+0x88E2 0x907A # <CJK>
+0x88E3 0x533B # <CJK>
+0x88E4 0x4E95 # <CJK>
+0x88E5 0x4EA5 # <CJK>
+0x88E6 0x57DF # <CJK>
+0x88E7 0x80B2 # <CJK>
+0x88E8 0x90C1 # <CJK>
+0x88E9 0x78EF # <CJK>
+0x88EA 0x4E00 # <CJK>
+0x88EB 0x58F1 # <CJK>
+0x88EC 0x6EA2 # <CJK>
+0x88ED 0x9038 # <CJK>
+0x88EE 0x7A32 # <CJK>
+0x88EF 0x8328 # <CJK>
+0x88F0 0x828B # <CJK>
+0x88F1 0x9C2F # <CJK>
+0x88F2 0x5141 # <CJK>
+0x88F3 0x5370 # <CJK>
+0x88F4 0x54BD # <CJK>
+0x88F5 0x54E1 # <CJK>
+0x88F6 0x56E0 # <CJK>
+0x88F7 0x59FB # <CJK>
+0x88F8 0x5F15 # <CJK>
+0x88F9 0x98F2 # <CJK>
+0x88FA 0x6DEB # <CJK>
+0x88FB 0x80E4 # <CJK>
+0x88FC 0x852D # <CJK>
+0x8940 0x9662 # <CJK>
+0x8941 0x9670 # <CJK>
+0x8942 0x96A0 # <CJK>
+0x8943 0x97FB # <CJK>
+0x8944 0x540B # <CJK>
+0x8945 0x53F3 # <CJK>
+0x8946 0x5B87 # <CJK>
+0x8947 0x70CF # <CJK>
+0x8948 0x7FBD # <CJK>
+0x8949 0x8FC2 # <CJK>
+0x894A 0x96E8 # <CJK>
+0x894B 0x536F # <CJK>
+0x894C 0x9D5C # <CJK>
+0x894D 0x7ABA # <CJK>
+0x894E 0x4E11 # <CJK>
+0x894F 0x7893 # <CJK>
+0x8950 0x81FC # <CJK>
+0x8951 0x6E26 # <CJK>
+0x8952 0x5618 # <CJK>
+0x8953 0x5504 # <CJK>
+0x8954 0x6B1D # <CJK>
+0x8955 0x851A # <CJK>
+0x8956 0x9C3B # <CJK>
+0x8957 0x59E5 # <CJK>
+0x8958 0x53A9 # <CJK>
+0x8959 0x6D66 # <CJK>
+0x895A 0x74DC # <CJK>
+0x895B 0x958F # <CJK>
+0x895C 0x5642 # <CJK>
+0x895D 0x4E91 # <CJK>
+0x895E 0x904B # <CJK>
+0x895F 0x96F2 # <CJK>
+0x8960 0x834F # <CJK>
+0x8961 0x990C # <CJK>
+0x8962 0x53E1 # <CJK>
+0x8963 0x55B6 # <CJK>
+0x8964 0x5B30 # <CJK>
+0x8965 0x5F71 # <CJK>
+0x8966 0x6620 # <CJK>
+0x8967 0x66F3 # <CJK>
+0x8968 0x6804 # <CJK>
+0x8969 0x6C38 # <CJK>
+0x896A 0x6CF3 # <CJK>
+0x896B 0x6D29 # <CJK>
+0x896C 0x745B # <CJK>
+0x896D 0x76C8 # <CJK>
+0x896E 0x7A4E # <CJK>
+0x896F 0x9834 # <CJK>
+0x8970 0x82F1 # <CJK>
+0x8971 0x885B # <CJK>
+0x8972 0x8A60 # <CJK>
+0x8973 0x92ED # <CJK>
+0x8974 0x6DB2 # <CJK>
+0x8975 0x75AB # <CJK>
+0x8976 0x76CA # <CJK>
+0x8977 0x99C5 # <CJK>
+0x8978 0x60A6 # <CJK>
+0x8979 0x8B01 # <CJK>
+0x897A 0x8D8A # <CJK>
+0x897B 0x95B2 # <CJK>
+0x897C 0x698E # <CJK>
+0x897D 0x53AD # <CJK>
+0x897E 0x5186 # <CJK>
+0x8980 0x5712 # <CJK>
+0x8981 0x5830 # <CJK>
+0x8982 0x5944 # <CJK>
+0x8983 0x5BB4 # <CJK>
+0x8984 0x5EF6 # <CJK>
+0x8985 0x6028 # <CJK>
+0x8986 0x63A9 # <CJK>
+0x8987 0x63F4 # <CJK>
+0x8988 0x6CBF # <CJK>
+0x8989 0x6F14 # <CJK>
+0x898A 0x708E # <CJK>
+0x898B 0x7114 # <CJK>
+0x898C 0x7159 # <CJK>
+0x898D 0x71D5 # <CJK>
+0x898E 0x733F # <CJK>
+0x898F 0x7E01 # <CJK>
+0x8990 0x8276 # <CJK>
+0x8991 0x82D1 # <CJK>
+0x8992 0x8597 # <CJK>
+0x8993 0x9060 # <CJK>
+0x8994 0x925B # <CJK>
+0x8995 0x9D1B # <CJK>
+0x8996 0x5869 # <CJK>
+0x8997 0x65BC # <CJK>
+0x8998 0x6C5A # <CJK>
+0x8999 0x7525 # <CJK>
+0x899A 0x51F9 # <CJK>
+0x899B 0x592E # <CJK>
+0x899C 0x5965 # <CJK>
+0x899D 0x5F80 # <CJK>
+0x899E 0x5FDC # <CJK>
+0x899F 0x62BC # <CJK>
+0x89A0 0x65FA # <CJK>
+0x89A1 0x6A2A # <CJK>
+0x89A2 0x6B27 # <CJK>
+0x89A3 0x6BB4 # <CJK>
+0x89A4 0x738B # <CJK>
+0x89A5 0x7FC1 # <CJK>
+0x89A6 0x8956 # <CJK>
+0x89A7 0x9D2C # <CJK>
+0x89A8 0x9D0E # <CJK>
+0x89A9 0x9EC4 # <CJK>
+0x89AA 0x5CA1 # <CJK>
+0x89AB 0x6C96 # <CJK>
+0x89AC 0x837B # <CJK>
+0x89AD 0x5104 # <CJK>
+0x89AE 0x5C4B # <CJK>
+0x89AF 0x61B6 # <CJK>
+0x89B0 0x81C6 # <CJK>
+0x89B1 0x6876 # <CJK>
+0x89B2 0x7261 # <CJK>
+0x89B3 0x4E59 # <CJK>
+0x89B4 0x4FFA # <CJK>
+0x89B5 0x5378 # <CJK>
+0x89B6 0x6069 # <CJK>
+0x89B7 0x6E29 # <CJK>
+0x89B8 0x7A4F # <CJK>
+0x89B9 0x97F3 # <CJK>
+0x89BA 0x4E0B # <CJK>
+0x89BB 0x5316 # <CJK>
+0x89BC 0x4EEE # <CJK>
+0x89BD 0x4F55 # <CJK>
+0x89BE 0x4F3D # <CJK>
+0x89BF 0x4FA1 # <CJK>
+0x89C0 0x4F73 # <CJK>
+0x89C1 0x52A0 # <CJK>
+0x89C2 0x53EF # <CJK>
+0x89C3 0x5609 # <CJK>
+0x89C4 0x590F # <CJK>
+0x89C5 0x5AC1 # <CJK>
+0x89C6 0x5BB6 # <CJK>
+0x89C7 0x5BE1 # <CJK>
+0x89C8 0x79D1 # <CJK>
+0x89C9 0x6687 # <CJK>
+0x89CA 0x679C # <CJK>
+0x89CB 0x67B6 # <CJK>
+0x89CC 0x6B4C # <CJK>
+0x89CD 0x6CB3 # <CJK>
+0x89CE 0x706B # <CJK>
+0x89CF 0x73C2 # <CJK>
+0x89D0 0x798D # <CJK>
+0x89D1 0x79BE # <CJK>
+0x89D2 0x7A3C # <CJK>
+0x89D3 0x7B87 # <CJK>
+0x89D4 0x82B1 # <CJK>
+0x89D5 0x82DB # <CJK>
+0x89D6 0x8304 # <CJK>
+0x89D7 0x8377 # <CJK>
+0x89D8 0x83EF # <CJK>
+0x89D9 0x83D3 # <CJK>
+0x89DA 0x8766 # <CJK>
+0x89DB 0x8AB2 # <CJK>
+0x89DC 0x5629 # <CJK>
+0x89DD 0x8CA8 # <CJK>
+0x89DE 0x8FE6 # <CJK>
+0x89DF 0x904E # <CJK>
+0x89E0 0x971E # <CJK>
+0x89E1 0x868A # <CJK>
+0x89E2 0x4FC4 # <CJK>
+0x89E3 0x5CE8 # <CJK>
+0x89E4 0x6211 # <CJK>
+0x89E5 0x7259 # <CJK>
+0x89E6 0x753B # <CJK>
+0x89E7 0x81E5 # <CJK>
+0x89E8 0x82BD # <CJK>
+0x89E9 0x86FE # <CJK>
+0x89EA 0x8CC0 # <CJK>
+0x89EB 0x96C5 # <CJK>
+0x89EC 0x9913 # <CJK>
+0x89ED 0x99D5 # <CJK>
+0x89EE 0x4ECB # <CJK>
+0x89EF 0x4F1A # <CJK>
+0x89F0 0x89E3 # <CJK>
+0x89F1 0x56DE # <CJK>
+0x89F2 0x584A # <CJK>
+0x89F3 0x58CA # <CJK>
+0x89F4 0x5EFB # <CJK>
+0x89F5 0x5FEB # <CJK>
+0x89F6 0x602A # <CJK>
+0x89F7 0x6094 # <CJK>
+0x89F8 0x6062 # <CJK>
+0x89F9 0x61D0 # <CJK>
+0x89FA 0x6212 # <CJK>
+0x89FB 0x62D0 # <CJK>
+0x89FC 0x6539 # <CJK>
+0x8A40 0x9B41 # <CJK>
+0x8A41 0x6666 # <CJK>
+0x8A42 0x68B0 # <CJK>
+0x8A43 0x6D77 # <CJK>
+0x8A44 0x7070 # <CJK>
+0x8A45 0x754C # <CJK>
+0x8A46 0x7686 # <CJK>
+0x8A47 0x7D75 # <CJK>
+0x8A48 0x82A5 # <CJK>
+0x8A49 0x87F9 # <CJK>
+0x8A4A 0x958B # <CJK>
+0x8A4B 0x968E # <CJK>
+0x8A4C 0x8C9D # <CJK>
+0x8A4D 0x51F1 # <CJK>
+0x8A4E 0x52BE # <CJK>
+0x8A4F 0x5916 # <CJK>
+0x8A50 0x54B3 # <CJK>
+0x8A51 0x5BB3 # <CJK>
+0x8A52 0x5D16 # <CJK>
+0x8A53 0x6168 # <CJK>
+0x8A54 0x6982 # <CJK>
+0x8A55 0x6DAF # <CJK>
+0x8A56 0x788D # <CJK>
+0x8A57 0x84CB # <CJK>
+0x8A58 0x8857 # <CJK>
+0x8A59 0x8A72 # <CJK>
+0x8A5A 0x93A7 # <CJK>
+0x8A5B 0x9AB8 # <CJK>
+0x8A5C 0x6D6C # <CJK>
+0x8A5D 0x99A8 # <CJK>
+0x8A5E 0x86D9 # <CJK>
+0x8A5F 0x57A3 # <CJK>
+0x8A60 0x67FF # <CJK>
+0x8A61 0x86CE # <CJK>
+0x8A62 0x920E # <CJK>
+0x8A63 0x5283 # <CJK>
+0x8A64 0x5687 # <CJK>
+0x8A65 0x5404 # <CJK>
+0x8A66 0x5ED3 # <CJK>
+0x8A67 0x62E1 # <CJK>
+0x8A68 0x64B9 # <CJK>
+0x8A69 0x683C # <CJK>
+0x8A6A 0x6838 # <CJK>
+0x8A6B 0x6BBB # <CJK>
+0x8A6C 0x7372 # <CJK>
+0x8A6D 0x78BA # <CJK>
+0x8A6E 0x7A6B # <CJK>
+0x8A6F 0x899A # <CJK>
+0x8A70 0x89D2 # <CJK>
+0x8A71 0x8D6B # <CJK>
+0x8A72 0x8F03 # <CJK>
+0x8A73 0x90ED # <CJK>
+0x8A74 0x95A3 # <CJK>
+0x8A75 0x9694 # <CJK>
+0x8A76 0x9769 # <CJK>
+0x8A77 0x5B66 # <CJK>
+0x8A78 0x5CB3 # <CJK>
+0x8A79 0x697D # <CJK>
+0x8A7A 0x984D # <CJK>
+0x8A7B 0x984E # <CJK>
+0x8A7C 0x639B # <CJK>
+0x8A7D 0x7B20 # <CJK>
+0x8A7E 0x6A2B # <CJK>
+0x8A80 0x6A7F # <CJK>
+0x8A81 0x68B6 # <CJK>
+0x8A82 0x9C0D # <CJK>
+0x8A83 0x6F5F # <CJK>
+0x8A84 0x5272 # <CJK>
+0x8A85 0x559D # <CJK>
+0x8A86 0x6070 # <CJK>
+0x8A87 0x62EC # <CJK>
+0x8A88 0x6D3B # <CJK>
+0x8A89 0x6E07 # <CJK>
+0x8A8A 0x6ED1 # <CJK>
+0x8A8B 0x845B # <CJK>
+0x8A8C 0x8910 # <CJK>
+0x8A8D 0x8F44 # <CJK>
+0x8A8E 0x4E14 # <CJK>
+0x8A8F 0x9C39 # <CJK>
+0x8A90 0x53F6 # <CJK>
+0x8A91 0x691B # <CJK>
+0x8A92 0x6A3A # <CJK>
+0x8A93 0x9784 # <CJK>
+0x8A94 0x682A # <CJK>
+0x8A95 0x515C # <CJK>
+0x8A96 0x7AC3 # <CJK>
+0x8A97 0x84B2 # <CJK>
+0x8A98 0x91DC # <CJK>
+0x8A99 0x938C # <CJK>
+0x8A9A 0x565B # <CJK>
+0x8A9B 0x9D28 # <CJK>
+0x8A9C 0x6822 # <CJK>
+0x8A9D 0x8305 # <CJK>
+0x8A9E 0x8431 # <CJK>
+0x8A9F 0x7CA5 # <CJK>
+0x8AA0 0x5208 # <CJK>
+0x8AA1 0x82C5 # <CJK>
+0x8AA2 0x74E6 # <CJK>
+0x8AA3 0x4E7E # <CJK>
+0x8AA4 0x4F83 # <CJK>
+0x8AA5 0x51A0 # <CJK>
+0x8AA6 0x5BD2 # <CJK>
+0x8AA7 0x520A # <CJK>
+0x8AA8 0x52D8 # <CJK>
+0x8AA9 0x52E7 # <CJK>
+0x8AAA 0x5DFB # <CJK>
+0x8AAB 0x559A # <CJK>
+0x8AAC 0x582A # <CJK>
+0x8AAD 0x59E6 # <CJK>
+0x8AAE 0x5B8C # <CJK>
+0x8AAF 0x5B98 # <CJK>
+0x8AB0 0x5BDB # <CJK>
+0x8AB1 0x5E72 # <CJK>
+0x8AB2 0x5E79 # <CJK>
+0x8AB3 0x60A3 # <CJK>
+0x8AB4 0x611F # <CJK>
+0x8AB5 0x6163 # <CJK>
+0x8AB6 0x61BE # <CJK>
+0x8AB7 0x63DB # <CJK>
+0x8AB8 0x6562 # <CJK>
+0x8AB9 0x67D1 # <CJK>
+0x8ABA 0x6853 # <CJK>
+0x8ABB 0x68FA # <CJK>
+0x8ABC 0x6B3E # <CJK>
+0x8ABD 0x6B53 # <CJK>
+0x8ABE 0x6C57 # <CJK>
+0x8ABF 0x6F22 # <CJK>
+0x8AC0 0x6F97 # <CJK>
+0x8AC1 0x6F45 # <CJK>
+0x8AC2 0x74B0 # <CJK>
+0x8AC3 0x7518 # <CJK>
+0x8AC4 0x76E3 # <CJK>
+0x8AC5 0x770B # <CJK>
+0x8AC6 0x7AFF # <CJK>
+0x8AC7 0x7BA1 # <CJK>
+0x8AC8 0x7C21 # <CJK>
+0x8AC9 0x7DE9 # <CJK>
+0x8ACA 0x7F36 # <CJK>
+0x8ACB 0x7FF0 # <CJK>
+0x8ACC 0x809D # <CJK>
+0x8ACD 0x8266 # <CJK>
+0x8ACE 0x839E # <CJK>
+0x8ACF 0x89B3 # <CJK>
+0x8AD0 0x8ACC # <CJK>
+0x8AD1 0x8CAB # <CJK>
+0x8AD2 0x9084 # <CJK>
+0x8AD3 0x9451 # <CJK>
+0x8AD4 0x9593 # <CJK>
+0x8AD5 0x9591 # <CJK>
+0x8AD6 0x95A2 # <CJK>
+0x8AD7 0x9665 # <CJK>
+0x8AD8 0x97D3 # <CJK>
+0x8AD9 0x9928 # <CJK>
+0x8ADA 0x8218 # <CJK>
+0x8ADB 0x4E38 # <CJK>
+0x8ADC 0x542B # <CJK>
+0x8ADD 0x5CB8 # <CJK>
+0x8ADE 0x5DCC # <CJK>
+0x8ADF 0x73A9 # <CJK>
+0x8AE0 0x764C # <CJK>
+0x8AE1 0x773C # <CJK>
+0x8AE2 0x5CA9 # <CJK>
+0x8AE3 0x7FEB # <CJK>
+0x8AE4 0x8D0B # <CJK>
+0x8AE5 0x96C1 # <CJK>
+0x8AE6 0x9811 # <CJK>
+0x8AE7 0x9854 # <CJK>
+0x8AE8 0x9858 # <CJK>
+0x8AE9 0x4F01 # <CJK>
+0x8AEA 0x4F0E # <CJK>
+0x8AEB 0x5371 # <CJK>
+0x8AEC 0x559C # <CJK>
+0x8AED 0x5668 # <CJK>
+0x8AEE 0x57FA # <CJK>
+0x8AEF 0x5947 # <CJK>
+0x8AF0 0x5B09 # <CJK>
+0x8AF1 0x5BC4 # <CJK>
+0x8AF2 0x5C90 # <CJK>
+0x8AF3 0x5E0C # <CJK>
+0x8AF4 0x5E7E # <CJK>
+0x8AF5 0x5FCC # <CJK>
+0x8AF6 0x63EE # <CJK>
+0x8AF7 0x673A # <CJK>
+0x8AF8 0x65D7 # <CJK>
+0x8AF9 0x65E2 # <CJK>
+0x8AFA 0x671F # <CJK>
+0x8AFB 0x68CB # <CJK>
+0x8AFC 0x68C4 # <CJK>
+0x8B40 0x6A5F # <CJK>
+0x8B41 0x5E30 # <CJK>
+0x8B42 0x6BC5 # <CJK>
+0x8B43 0x6C17 # <CJK>
+0x8B44 0x6C7D # <CJK>
+0x8B45 0x757F # <CJK>
+0x8B46 0x7948 # <CJK>
+0x8B47 0x5B63 # <CJK>
+0x8B48 0x7A00 # <CJK>
+0x8B49 0x7D00 # <CJK>
+0x8B4A 0x5FBD # <CJK>
+0x8B4B 0x898F # <CJK>
+0x8B4C 0x8A18 # <CJK>
+0x8B4D 0x8CB4 # <CJK>
+0x8B4E 0x8D77 # <CJK>
+0x8B4F 0x8ECC # <CJK>
+0x8B50 0x8F1D # <CJK>
+0x8B51 0x98E2 # <CJK>
+0x8B52 0x9A0E # <CJK>
+0x8B53 0x9B3C # <CJK>
+0x8B54 0x4E80 # <CJK>
+0x8B55 0x507D # <CJK>
+0x8B56 0x5100 # <CJK>
+0x8B57 0x5993 # <CJK>
+0x8B58 0x5B9C # <CJK>
+0x8B59 0x622F # <CJK>
+0x8B5A 0x6280 # <CJK>
+0x8B5B 0x64EC # <CJK>
+0x8B5C 0x6B3A # <CJK>
+0x8B5D 0x72A0 # <CJK>
+0x8B5E 0x7591 # <CJK>
+0x8B5F 0x7947 # <CJK>
+0x8B60 0x7FA9 # <CJK>
+0x8B61 0x87FB # <CJK>
+0x8B62 0x8ABC # <CJK>
+0x8B63 0x8B70 # <CJK>
+0x8B64 0x63AC # <CJK>
+0x8B65 0x83CA # <CJK>
+0x8B66 0x97A0 # <CJK>
+0x8B67 0x5409 # <CJK>
+0x8B68 0x5403 # <CJK>
+0x8B69 0x55AB # <CJK>
+0x8B6A 0x6854 # <CJK>
+0x8B6B 0x6A58 # <CJK>
+0x8B6C 0x8A70 # <CJK>
+0x8B6D 0x7827 # <CJK>
+0x8B6E 0x6775 # <CJK>
+0x8B6F 0x9ECD # <CJK>
+0x8B70 0x5374 # <CJK>
+0x8B71 0x5BA2 # <CJK>
+0x8B72 0x811A # <CJK>
+0x8B73 0x8650 # <CJK>
+0x8B74 0x9006 # <CJK>
+0x8B75 0x4E18 # <CJK>
+0x8B76 0x4E45 # <CJK>
+0x8B77 0x4EC7 # <CJK>
+0x8B78 0x4F11 # <CJK>
+0x8B79 0x53CA # <CJK>
+0x8B7A 0x5438 # <CJK>
+0x8B7B 0x5BAE # <CJK>
+0x8B7C 0x5F13 # <CJK>
+0x8B7D 0x6025 # <CJK>
+0x8B7E 0x6551 # <CJK>
+0x8B80 0x673D # <CJK>
+0x8B81 0x6C42 # <CJK>
+0x8B82 0x6C72 # <CJK>
+0x8B83 0x6CE3 # <CJK>
+0x8B84 0x7078 # <CJK>
+0x8B85 0x7403 # <CJK>
+0x8B86 0x7A76 # <CJK>
+0x8B87 0x7AAE # <CJK>
+0x8B88 0x7B08 # <CJK>
+0x8B89 0x7D1A # <CJK>
+0x8B8A 0x7CFE # <CJK>
+0x8B8B 0x7D66 # <CJK>
+0x8B8C 0x65E7 # <CJK>
+0x8B8D 0x725B # <CJK>
+0x8B8E 0x53BB # <CJK>
+0x8B8F 0x5C45 # <CJK>
+0x8B90 0x5DE8 # <CJK>
+0x8B91 0x62D2 # <CJK>
+0x8B92 0x62E0 # <CJK>
+0x8B93 0x6319 # <CJK>
+0x8B94 0x6E20 # <CJK>
+0x8B95 0x865A # <CJK>
+0x8B96 0x8A31 # <CJK>
+0x8B97 0x8DDD # <CJK>
+0x8B98 0x92F8 # <CJK>
+0x8B99 0x6F01 # <CJK>
+0x8B9A 0x79A6 # <CJK>
+0x8B9B 0x9B5A # <CJK>
+0x8B9C 0x4EA8 # <CJK>
+0x8B9D 0x4EAB # <CJK>
+0x8B9E 0x4EAC # <CJK>
+0x8B9F 0x4F9B # <CJK>
+0x8BA0 0x4FA0 # <CJK>
+0x8BA1 0x50D1 # <CJK>
+0x8BA2 0x5147 # <CJK>
+0x8BA3 0x7AF6 # <CJK>
+0x8BA4 0x5171 # <CJK>
+0x8BA5 0x51F6 # <CJK>
+0x8BA6 0x5354 # <CJK>
+0x8BA7 0x5321 # <CJK>
+0x8BA8 0x537F # <CJK>
+0x8BA9 0x53EB # <CJK>
+0x8BAA 0x55AC # <CJK>
+0x8BAB 0x5883 # <CJK>
+0x8BAC 0x5CE1 # <CJK>
+0x8BAD 0x5F37 # <CJK>
+0x8BAE 0x5F4A # <CJK>
+0x8BAF 0x602F # <CJK>
+0x8BB0 0x6050 # <CJK>
+0x8BB1 0x606D # <CJK>
+0x8BB2 0x631F # <CJK>
+0x8BB3 0x6559 # <CJK>
+0x8BB4 0x6A4B # <CJK>
+0x8BB5 0x6CC1 # <CJK>
+0x8BB6 0x72C2 # <CJK>
+0x8BB7 0x72ED # <CJK>
+0x8BB8 0x77EF # <CJK>
+0x8BB9 0x80F8 # <CJK>
+0x8BBA 0x8105 # <CJK>
+0x8BBB 0x8208 # <CJK>
+0x8BBC 0x854E # <CJK>
+0x8BBD 0x90F7 # <CJK>
+0x8BBE 0x93E1 # <CJK>
+0x8BBF 0x97FF # <CJK>
+0x8BC0 0x9957 # <CJK>
+0x8BC1 0x9A5A # <CJK>
+0x8BC2 0x4EF0 # <CJK>
+0x8BC3 0x51DD # <CJK>
+0x8BC4 0x5C2D # <CJK>
+0x8BC5 0x6681 # <CJK>
+0x8BC6 0x696D # <CJK>
+0x8BC7 0x5C40 # <CJK>
+0x8BC8 0x66F2 # <CJK>
+0x8BC9 0x6975 # <CJK>
+0x8BCA 0x7389 # <CJK>
+0x8BCB 0x6850 # <CJK>
+0x8BCC 0x7C81 # <CJK>
+0x8BCD 0x50C5 # <CJK>
+0x8BCE 0x52E4 # <CJK>
+0x8BCF 0x5747 # <CJK>
+0x8BD0 0x5DFE # <CJK>
+0x8BD1 0x9326 # <CJK>
+0x8BD2 0x65A4 # <CJK>
+0x8BD3 0x6B23 # <CJK>
+0x8BD4 0x6B3D # <CJK>
+0x8BD5 0x7434 # <CJK>
+0x8BD6 0x7981 # <CJK>
+0x8BD7 0x79BD # <CJK>
+0x8BD8 0x7B4B # <CJK>
+0x8BD9 0x7DCA # <CJK>
+0x8BDA 0x82B9 # <CJK>
+0x8BDB 0x83CC # <CJK>
+0x8BDC 0x887F # <CJK>
+0x8BDD 0x895F # <CJK>
+0x8BDE 0x8B39 # <CJK>
+0x8BDF 0x8FD1 # <CJK>
+0x8BE0 0x91D1 # <CJK>
+0x8BE1 0x541F # <CJK>
+0x8BE2 0x9280 # <CJK>
+0x8BE3 0x4E5D # <CJK>
+0x8BE4 0x5036 # <CJK>
+0x8BE5 0x53E5 # <CJK>
+0x8BE6 0x533A # <CJK>
+0x8BE7 0x72D7 # <CJK>
+0x8BE8 0x7396 # <CJK>
+0x8BE9 0x77E9 # <CJK>
+0x8BEA 0x82E6 # <CJK>
+0x8BEB 0x8EAF # <CJK>
+0x8BEC 0x99C6 # <CJK>
+0x8BED 0x99C8 # <CJK>
+0x8BEE 0x99D2 # <CJK>
+0x8BEF 0x5177 # <CJK>
+0x8BF0 0x611A # <CJK>
+0x8BF1 0x865E # <CJK>
+0x8BF2 0x55B0 # <CJK>
+0x8BF3 0x7A7A # <CJK>
+0x8BF4 0x5076 # <CJK>
+0x8BF5 0x5BD3 # <CJK>
+0x8BF6 0x9047 # <CJK>
+0x8BF7 0x9685 # <CJK>
+0x8BF8 0x4E32 # <CJK>
+0x8BF9 0x6ADB # <CJK>
+0x8BFA 0x91E7 # <CJK>
+0x8BFB 0x5C51 # <CJK>
+0x8BFC 0x5C48 # <CJK>
+0x8C40 0x6398 # <CJK>
+0x8C41 0x7A9F # <CJK>
+0x8C42 0x6C93 # <CJK>
+0x8C43 0x9774 # <CJK>
+0x8C44 0x8F61 # <CJK>
+0x8C45 0x7AAA # <CJK>
+0x8C46 0x718A # <CJK>
+0x8C47 0x9688 # <CJK>
+0x8C48 0x7C82 # <CJK>
+0x8C49 0x6817 # <CJK>
+0x8C4A 0x7E70 # <CJK>
+0x8C4B 0x6851 # <CJK>
+0x8C4C 0x936C # <CJK>
+0x8C4D 0x52F2 # <CJK>
+0x8C4E 0x541B # <CJK>
+0x8C4F 0x85AB # <CJK>
+0x8C50 0x8A13 # <CJK>
+0x8C51 0x7FA4 # <CJK>
+0x8C52 0x8ECD # <CJK>
+0x8C53 0x90E1 # <CJK>
+0x8C54 0x5366 # <CJK>
+0x8C55 0x8888 # <CJK>
+0x8C56 0x7941 # <CJK>
+0x8C57 0x4FC2 # <CJK>
+0x8C58 0x50BE # <CJK>
+0x8C59 0x5211 # <CJK>
+0x8C5A 0x5144 # <CJK>
+0x8C5B 0x5553 # <CJK>
+0x8C5C 0x572D # <CJK>
+0x8C5D 0x73EA # <CJK>
+0x8C5E 0x578B # <CJK>
+0x8C5F 0x5951 # <CJK>
+0x8C60 0x5F62 # <CJK>
+0x8C61 0x5F84 # <CJK>
+0x8C62 0x6075 # <CJK>
+0x8C63 0x6176 # <CJK>
+0x8C64 0x6167 # <CJK>
+0x8C65 0x61A9 # <CJK>
+0x8C66 0x63B2 # <CJK>
+0x8C67 0x643A # <CJK>
+0x8C68 0x656C # <CJK>
+0x8C69 0x666F # <CJK>
+0x8C6A 0x6842 # <CJK>
+0x8C6B 0x6E13 # <CJK>
+0x8C6C 0x7566 # <CJK>
+0x8C6D 0x7A3D # <CJK>
+0x8C6E 0x7CFB # <CJK>
+0x8C6F 0x7D4C # <CJK>
+0x8C70 0x7D99 # <CJK>
+0x8C71 0x7E4B # <CJK>
+0x8C72 0x7F6B # <CJK>
+0x8C73 0x830E # <CJK>
+0x8C74 0x834A # <CJK>
+0x8C75 0x86CD # <CJK>
+0x8C76 0x8A08 # <CJK>
+0x8C77 0x8A63 # <CJK>
+0x8C78 0x8B66 # <CJK>
+0x8C79 0x8EFD # <CJK>
+0x8C7A 0x981A # <CJK>
+0x8C7B 0x9D8F # <CJK>
+0x8C7C 0x82B8 # <CJK>
+0x8C7D 0x8FCE # <CJK>
+0x8C7E 0x9BE8 # <CJK>
+0x8C80 0x5287 # <CJK>
+0x8C81 0x621F # <CJK>
+0x8C82 0x6483 # <CJK>
+0x8C83 0x6FC0 # <CJK>
+0x8C84 0x9699 # <CJK>
+0x8C85 0x6841 # <CJK>
+0x8C86 0x5091 # <CJK>
+0x8C87 0x6B20 # <CJK>
+0x8C88 0x6C7A # <CJK>
+0x8C89 0x6F54 # <CJK>
+0x8C8A 0x7A74 # <CJK>
+0x8C8B 0x7D50 # <CJK>
+0x8C8C 0x8840 # <CJK>
+0x8C8D 0x8A23 # <CJK>
+0x8C8E 0x6708 # <CJK>
+0x8C8F 0x4EF6 # <CJK>
+0x8C90 0x5039 # <CJK>
+0x8C91 0x5026 # <CJK>
+0x8C92 0x5065 # <CJK>
+0x8C93 0x517C # <CJK>
+0x8C94 0x5238 # <CJK>
+0x8C95 0x5263 # <CJK>
+0x8C96 0x55A7 # <CJK>
+0x8C97 0x570F # <CJK>
+0x8C98 0x5805 # <CJK>
+0x8C99 0x5ACC # <CJK>
+0x8C9A 0x5EFA # <CJK>
+0x8C9B 0x61B2 # <CJK>
+0x8C9C 0x61F8 # <CJK>
+0x8C9D 0x62F3 # <CJK>
+0x8C9E 0x6372 # <CJK>
+0x8C9F 0x691C # <CJK>
+0x8CA0 0x6A29 # <CJK>
+0x8CA1 0x727D # <CJK>
+0x8CA2 0x72AC # <CJK>
+0x8CA3 0x732E # <CJK>
+0x8CA4 0x7814 # <CJK>
+0x8CA5 0x786F # <CJK>
+0x8CA6 0x7D79 # <CJK>
+0x8CA7 0x770C # <CJK>
+0x8CA8 0x80A9 # <CJK>
+0x8CA9 0x898B # <CJK>
+0x8CAA 0x8B19 # <CJK>
+0x8CAB 0x8CE2 # <CJK>
+0x8CAC 0x8ED2 # <CJK>
+0x8CAD 0x9063 # <CJK>
+0x8CAE 0x9375 # <CJK>
+0x8CAF 0x967A # <CJK>
+0x8CB0 0x9855 # <CJK>
+0x8CB1 0x9A13 # <CJK>
+0x8CB2 0x9E78 # <CJK>
+0x8CB3 0x5143 # <CJK>
+0x8CB4 0x539F # <CJK>
+0x8CB5 0x53B3 # <CJK>
+0x8CB6 0x5E7B # <CJK>
+0x8CB7 0x5F26 # <CJK>
+0x8CB8 0x6E1B # <CJK>
+0x8CB9 0x6E90 # <CJK>
+0x8CBA 0x7384 # <CJK>
+0x8CBB 0x73FE # <CJK>
+0x8CBC 0x7D43 # <CJK>
+0x8CBD 0x8237 # <CJK>
+0x8CBE 0x8A00 # <CJK>
+0x8CBF 0x8AFA # <CJK>
+0x8CC0 0x9650 # <CJK>
+0x8CC1 0x4E4E # <CJK>
+0x8CC2 0x500B # <CJK>
+0x8CC3 0x53E4 # <CJK>
+0x8CC4 0x547C # <CJK>
+0x8CC5 0x56FA # <CJK>
+0x8CC6 0x59D1 # <CJK>
+0x8CC7 0x5B64 # <CJK>
+0x8CC8 0x5DF1 # <CJK>
+0x8CC9 0x5EAB # <CJK>
+0x8CCA 0x5F27 # <CJK>
+0x8CCB 0x6238 # <CJK>
+0x8CCC 0x6545 # <CJK>
+0x8CCD 0x67AF # <CJK>
+0x8CCE 0x6E56 # <CJK>
+0x8CCF 0x72D0 # <CJK>
+0x8CD0 0x7CCA # <CJK>
+0x8CD1 0x88B4 # <CJK>
+0x8CD2 0x80A1 # <CJK>
+0x8CD3 0x80E1 # <CJK>
+0x8CD4 0x83F0 # <CJK>
+0x8CD5 0x864E # <CJK>
+0x8CD6 0x8A87 # <CJK>
+0x8CD7 0x8DE8 # <CJK>
+0x8CD8 0x9237 # <CJK>
+0x8CD9 0x96C7 # <CJK>
+0x8CDA 0x9867 # <CJK>
+0x8CDB 0x9F13 # <CJK>
+0x8CDC 0x4E94 # <CJK>
+0x8CDD 0x4E92 # <CJK>
+0x8CDE 0x4F0D # <CJK>
+0x8CDF 0x5348 # <CJK>
+0x8CE0 0x5449 # <CJK>
+0x8CE1 0x543E # <CJK>
+0x8CE2 0x5A2F # <CJK>
+0x8CE3 0x5F8C # <CJK>
+0x8CE4 0x5FA1 # <CJK>
+0x8CE5 0x609F # <CJK>
+0x8CE6 0x68A7 # <CJK>
+0x8CE7 0x6A8E # <CJK>
+0x8CE8 0x745A # <CJK>
+0x8CE9 0x7881 # <CJK>
+0x8CEA 0x8A9E # <CJK>
+0x8CEB 0x8AA4 # <CJK>
+0x8CEC 0x8B77 # <CJK>
+0x8CED 0x9190 # <CJK>
+0x8CEE 0x4E5E # <CJK>
+0x8CEF 0x9BC9 # <CJK>
+0x8CF0 0x4EA4 # <CJK>
+0x8CF1 0x4F7C # <CJK>
+0x8CF2 0x4FAF # <CJK>
+0x8CF3 0x5019 # <CJK>
+0x8CF4 0x5016 # <CJK>
+0x8CF5 0x5149 # <CJK>
+0x8CF6 0x516C # <CJK>
+0x8CF7 0x529F # <CJK>
+0x8CF8 0x52B9 # <CJK>
+0x8CF9 0x52FE # <CJK>
+0x8CFA 0x539A # <CJK>
+0x8CFB 0x53E3 # <CJK>
+0x8CFC 0x5411 # <CJK>
+0x8D40 0x540E # <CJK>
+0x8D41 0x5589 # <CJK>
+0x8D42 0x5751 # <CJK>
+0x8D43 0x57A2 # <CJK>
+0x8D44 0x597D # <CJK>
+0x8D45 0x5B54 # <CJK>
+0x8D46 0x5B5D # <CJK>
+0x8D47 0x5B8F # <CJK>
+0x8D48 0x5DE5 # <CJK>
+0x8D49 0x5DE7 # <CJK>
+0x8D4A 0x5DF7 # <CJK>
+0x8D4B 0x5E78 # <CJK>
+0x8D4C 0x5E83 # <CJK>
+0x8D4D 0x5E9A # <CJK>
+0x8D4E 0x5EB7 # <CJK>
+0x8D4F 0x5F18 # <CJK>
+0x8D50 0x6052 # <CJK>
+0x8D51 0x614C # <CJK>
+0x8D52 0x6297 # <CJK>
+0x8D53 0x62D8 # <CJK>
+0x8D54 0x63A7 # <CJK>
+0x8D55 0x653B # <CJK>
+0x8D56 0x6602 # <CJK>
+0x8D57 0x6643 # <CJK>
+0x8D58 0x66F4 # <CJK>
+0x8D59 0x676D # <CJK>
+0x8D5A 0x6821 # <CJK>
+0x8D5B 0x6897 # <CJK>
+0x8D5C 0x69CB # <CJK>
+0x8D5D 0x6C5F # <CJK>
+0x8D5E 0x6D2A # <CJK>
+0x8D5F 0x6D69 # <CJK>
+0x8D60 0x6E2F # <CJK>
+0x8D61 0x6E9D # <CJK>
+0x8D62 0x7532 # <CJK>
+0x8D63 0x7687 # <CJK>
+0x8D64 0x786C # <CJK>
+0x8D65 0x7A3F # <CJK>
+0x8D66 0x7CE0 # <CJK>
+0x8D67 0x7D05 # <CJK>
+0x8D68 0x7D18 # <CJK>
+0x8D69 0x7D5E # <CJK>
+0x8D6A 0x7DB1 # <CJK>
+0x8D6B 0x8015 # <CJK>
+0x8D6C 0x8003 # <CJK>
+0x8D6D 0x80AF # <CJK>
+0x8D6E 0x80B1 # <CJK>
+0x8D6F 0x8154 # <CJK>
+0x8D70 0x818F # <CJK>
+0x8D71 0x822A # <CJK>
+0x8D72 0x8352 # <CJK>
+0x8D73 0x884C # <CJK>
+0x8D74 0x8861 # <CJK>
+0x8D75 0x8B1B # <CJK>
+0x8D76 0x8CA2 # <CJK>
+0x8D77 0x8CFC # <CJK>
+0x8D78 0x90CA # <CJK>
+0x8D79 0x9175 # <CJK>
+0x8D7A 0x9271 # <CJK>
+0x8D7B 0x783F # <CJK>
+0x8D7C 0x92FC # <CJK>
+0x8D7D 0x95A4 # <CJK>
+0x8D7E 0x964D # <CJK>
+0x8D80 0x9805 # <CJK>
+0x8D81 0x9999 # <CJK>
+0x8D82 0x9AD8 # <CJK>
+0x8D83 0x9D3B # <CJK>
+0x8D84 0x525B # <CJK>
+0x8D85 0x52AB # <CJK>
+0x8D86 0x53F7 # <CJK>
+0x8D87 0x5408 # <CJK>
+0x8D88 0x58D5 # <CJK>
+0x8D89 0x62F7 # <CJK>
+0x8D8A 0x6FE0 # <CJK>
+0x8D8B 0x8C6A # <CJK>
+0x8D8C 0x8F5F # <CJK>
+0x8D8D 0x9EB9 # <CJK>
+0x8D8E 0x514B # <CJK>
+0x8D8F 0x523B # <CJK>
+0x8D90 0x544A # <CJK>
+0x8D91 0x56FD # <CJK>
+0x8D92 0x7A40 # <CJK>
+0x8D93 0x9177 # <CJK>
+0x8D94 0x9D60 # <CJK>
+0x8D95 0x9ED2 # <CJK>
+0x8D96 0x7344 # <CJK>
+0x8D97 0x6F09 # <CJK>
+0x8D98 0x8170 # <CJK>
+0x8D99 0x7511 # <CJK>
+0x8D9A 0x5FFD # <CJK>
+0x8D9B 0x60DA # <CJK>
+0x8D9C 0x9AA8 # <CJK>
+0x8D9D 0x72DB # <CJK>
+0x8D9E 0x8FBC # <CJK>
+0x8D9F 0x6B64 # <CJK>
+0x8DA0 0x9803 # <CJK>
+0x8DA1 0x4ECA # <CJK>
+0x8DA2 0x56F0 # <CJK>
+0x8DA3 0x5764 # <CJK>
+0x8DA4 0x58BE # <CJK>
+0x8DA5 0x5A5A # <CJK>
+0x8DA6 0x6068 # <CJK>
+0x8DA7 0x61C7 # <CJK>
+0x8DA8 0x660F # <CJK>
+0x8DA9 0x6606 # <CJK>
+0x8DAA 0x6839 # <CJK>
+0x8DAB 0x68B1 # <CJK>
+0x8DAC 0x6DF7 # <CJK>
+0x8DAD 0x75D5 # <CJK>
+0x8DAE 0x7D3A # <CJK>
+0x8DAF 0x826E # <CJK>
+0x8DB0 0x9B42 # <CJK>
+0x8DB1 0x4E9B # <CJK>
+0x8DB2 0x4F50 # <CJK>
+0x8DB3 0x53C9 # <CJK>
+0x8DB4 0x5506 # <CJK>
+0x8DB5 0x5D6F # <CJK>
+0x8DB6 0x5DE6 # <CJK>
+0x8DB7 0x5DEE # <CJK>
+0x8DB8 0x67FB # <CJK>
+0x8DB9 0x6C99 # <CJK>
+0x8DBA 0x7473 # <CJK>
+0x8DBB 0x7802 # <CJK>
+0x8DBC 0x8A50 # <CJK>
+0x8DBD 0x9396 # <CJK>
+0x8DBE 0x88DF # <CJK>
+0x8DBF 0x5750 # <CJK>
+0x8DC0 0x5EA7 # <CJK>
+0x8DC1 0x632B # <CJK>
+0x8DC2 0x50B5 # <CJK>
+0x8DC3 0x50AC # <CJK>
+0x8DC4 0x518D # <CJK>
+0x8DC5 0x6700 # <CJK>
+0x8DC6 0x54C9 # <CJK>
+0x8DC7 0x585E # <CJK>
+0x8DC8 0x59BB # <CJK>
+0x8DC9 0x5BB0 # <CJK>
+0x8DCA 0x5F69 # <CJK>
+0x8DCB 0x624D # <CJK>
+0x8DCC 0x63A1 # <CJK>
+0x8DCD 0x683D # <CJK>
+0x8DCE 0x6B73 # <CJK>
+0x8DCF 0x6E08 # <CJK>
+0x8DD0 0x707D # <CJK>
+0x8DD1 0x91C7 # <CJK>
+0x8DD2 0x7280 # <CJK>
+0x8DD3 0x7815 # <CJK>
+0x8DD4 0x7826 # <CJK>
+0x8DD5 0x796D # <CJK>
+0x8DD6 0x658E # <CJK>
+0x8DD7 0x7D30 # <CJK>
+0x8DD8 0x83DC # <CJK>
+0x8DD9 0x88C1 # <CJK>
+0x8DDA 0x8F09 # <CJK>
+0x8DDB 0x969B # <CJK>
+0x8DDC 0x5264 # <CJK>
+0x8DDD 0x5728 # <CJK>
+0x8DDE 0x6750 # <CJK>
+0x8DDF 0x7F6A # <CJK>
+0x8DE0 0x8CA1 # <CJK>
+0x8DE1 0x51B4 # <CJK>
+0x8DE2 0x5742 # <CJK>
+0x8DE3 0x962A # <CJK>
+0x8DE4 0x583A # <CJK>
+0x8DE5 0x698A # <CJK>
+0x8DE6 0x80B4 # <CJK>
+0x8DE7 0x54B2 # <CJK>
+0x8DE8 0x5D0E # <CJK>
+0x8DE9 0x57FC # <CJK>
+0x8DEA 0x7895 # <CJK>
+0x8DEB 0x9DFA # <CJK>
+0x8DEC 0x4F5C # <CJK>
+0x8DED 0x524A # <CJK>
+0x8DEE 0x548B # <CJK>
+0x8DEF 0x643E # <CJK>
+0x8DF0 0x6628 # <CJK>
+0x8DF1 0x6714 # <CJK>
+0x8DF2 0x67F5 # <CJK>
+0x8DF3 0x7A84 # <CJK>
+0x8DF4 0x7B56 # <CJK>
+0x8DF5 0x7D22 # <CJK>
+0x8DF6 0x932F # <CJK>
+0x8DF7 0x685C # <CJK>
+0x8DF8 0x9BAD # <CJK>
+0x8DF9 0x7B39 # <CJK>
+0x8DFA 0x5319 # <CJK>
+0x8DFB 0x518A # <CJK>
+0x8DFC 0x5237 # <CJK>
+0x8E40 0x5BDF # <CJK>
+0x8E41 0x62F6 # <CJK>
+0x8E42 0x64AE # <CJK>
+0x8E43 0x64E6 # <CJK>
+0x8E44 0x672D # <CJK>
+0x8E45 0x6BBA # <CJK>
+0x8E46 0x85A9 # <CJK>
+0x8E47 0x96D1 # <CJK>
+0x8E48 0x7690 # <CJK>
+0x8E49 0x9BD6 # <CJK>
+0x8E4A 0x634C # <CJK>
+0x8E4B 0x9306 # <CJK>
+0x8E4C 0x9BAB # <CJK>
+0x8E4D 0x76BF # <CJK>
+0x8E4E 0x6652 # <CJK>
+0x8E4F 0x4E09 # <CJK>
+0x8E50 0x5098 # <CJK>
+0x8E51 0x53C2 # <CJK>
+0x8E52 0x5C71 # <CJK>
+0x8E53 0x60E8 # <CJK>
+0x8E54 0x6492 # <CJK>
+0x8E55 0x6563 # <CJK>
+0x8E56 0x685F # <CJK>
+0x8E57 0x71E6 # <CJK>
+0x8E58 0x73CA # <CJK>
+0x8E59 0x7523 # <CJK>
+0x8E5A 0x7B97 # <CJK>
+0x8E5B 0x7E82 # <CJK>
+0x8E5C 0x8695 # <CJK>
+0x8E5D 0x8B83 # <CJK>
+0x8E5E 0x8CDB # <CJK>
+0x8E5F 0x9178 # <CJK>
+0x8E60 0x9910 # <CJK>
+0x8E61 0x65AC # <CJK>
+0x8E62 0x66AB # <CJK>
+0x8E63 0x6B8B # <CJK>
+0x8E64 0x4ED5 # <CJK>
+0x8E65 0x4ED4 # <CJK>
+0x8E66 0x4F3A # <CJK>
+0x8E67 0x4F7F # <CJK>
+0x8E68 0x523A # <CJK>
+0x8E69 0x53F8 # <CJK>
+0x8E6A 0x53F2 # <CJK>
+0x8E6B 0x55E3 # <CJK>
+0x8E6C 0x56DB # <CJK>
+0x8E6D 0x58EB # <CJK>
+0x8E6E 0x59CB # <CJK>
+0x8E6F 0x59C9 # <CJK>
+0x8E70 0x59FF # <CJK>
+0x8E71 0x5B50 # <CJK>
+0x8E72 0x5C4D # <CJK>
+0x8E73 0x5E02 # <CJK>
+0x8E74 0x5E2B # <CJK>
+0x8E75 0x5FD7 # <CJK>
+0x8E76 0x601D # <CJK>
+0x8E77 0x6307 # <CJK>
+0x8E78 0x652F # <CJK>
+0x8E79 0x5B5C # <CJK>
+0x8E7A 0x65AF # <CJK>
+0x8E7B 0x65BD # <CJK>
+0x8E7C 0x65E8 # <CJK>
+0x8E7D 0x679D # <CJK>
+0x8E7E 0x6B62 # <CJK>
+0x8E80 0x6B7B # <CJK>
+0x8E81 0x6C0F # <CJK>
+0x8E82 0x7345 # <CJK>
+0x8E83 0x7949 # <CJK>
+0x8E84 0x79C1 # <CJK>
+0x8E85 0x7CF8 # <CJK>
+0x8E86 0x7D19 # <CJK>
+0x8E87 0x7D2B # <CJK>
+0x8E88 0x80A2 # <CJK>
+0x8E89 0x8102 # <CJK>
+0x8E8A 0x81F3 # <CJK>
+0x8E8B 0x8996 # <CJK>
+0x8E8C 0x8A5E # <CJK>
+0x8E8D 0x8A69 # <CJK>
+0x8E8E 0x8A66 # <CJK>
+0x8E8F 0x8A8C # <CJK>
+0x8E90 0x8AEE # <CJK>
+0x8E91 0x8CC7 # <CJK>
+0x8E92 0x8CDC # <CJK>
+0x8E93 0x96CC # <CJK>
+0x8E94 0x98FC # <CJK>
+0x8E95 0x6B6F # <CJK>
+0x8E96 0x4E8B # <CJK>
+0x8E97 0x4F3C # <CJK>
+0x8E98 0x4F8D # <CJK>
+0x8E99 0x5150 # <CJK>
+0x8E9A 0x5B57 # <CJK>
+0x8E9B 0x5BFA # <CJK>
+0x8E9C 0x6148 # <CJK>
+0x8E9D 0x6301 # <CJK>
+0x8E9E 0x6642 # <CJK>
+0x8E9F 0x6B21 # <CJK>
+0x8EA0 0x6ECB # <CJK>
+0x8EA1 0x6CBB # <CJK>
+0x8EA2 0x723E # <CJK>
+0x8EA3 0x74BD # <CJK>
+0x8EA4 0x75D4 # <CJK>
+0x8EA5 0x78C1 # <CJK>
+0x8EA6 0x793A # <CJK>
+0x8EA7 0x800C # <CJK>
+0x8EA8 0x8033 # <CJK>
+0x8EA9 0x81EA # <CJK>
+0x8EAA 0x8494 # <CJK>
+0x8EAB 0x8F9E # <CJK>
+0x8EAC 0x6C50 # <CJK>
+0x8EAD 0x9E7F # <CJK>
+0x8EAE 0x5F0F # <CJK>
+0x8EAF 0x8B58 # <CJK>
+0x8EB0 0x9D2B # <CJK>
+0x8EB1 0x7AFA # <CJK>
+0x8EB2 0x8EF8 # <CJK>
+0x8EB3 0x5B8D # <CJK>
+0x8EB4 0x96EB # <CJK>
+0x8EB5 0x4E03 # <CJK>
+0x8EB6 0x53F1 # <CJK>
+0x8EB7 0x57F7 # <CJK>
+0x8EB8 0x5931 # <CJK>
+0x8EB9 0x5AC9 # <CJK>
+0x8EBA 0x5BA4 # <CJK>
+0x8EBB 0x6089 # <CJK>
+0x8EBC 0x6E7F # <CJK>
+0x8EBD 0x6F06 # <CJK>
+0x8EBE 0x75BE # <CJK>
+0x8EBF 0x8CEA # <CJK>
+0x8EC0 0x5B9F # <CJK>
+0x8EC1 0x8500 # <CJK>
+0x8EC2 0x7BE0 # <CJK>
+0x8EC3 0x5072 # <CJK>
+0x8EC4 0x67F4 # <CJK>
+0x8EC5 0x829D # <CJK>
+0x8EC6 0x5C61 # <CJK>
+0x8EC7 0x854A # <CJK>
+0x8EC8 0x7E1E # <CJK>
+0x8EC9 0x820E # <CJK>
+0x8ECA 0x5199 # <CJK>
+0x8ECB 0x5C04 # <CJK>
+0x8ECC 0x6368 # <CJK>
+0x8ECD 0x8D66 # <CJK>
+0x8ECE 0x659C # <CJK>
+0x8ECF 0x716E # <CJK>
+0x8ED0 0x793E # <CJK>
+0x8ED1 0x7D17 # <CJK>
+0x8ED2 0x8005 # <CJK>
+0x8ED3 0x8B1D # <CJK>
+0x8ED4 0x8ECA # <CJK>
+0x8ED5 0x906E # <CJK>
+0x8ED6 0x86C7 # <CJK>
+0x8ED7 0x90AA # <CJK>
+0x8ED8 0x501F # <CJK>
+0x8ED9 0x52FA # <CJK>
+0x8EDA 0x5C3A # <CJK>
+0x8EDB 0x6753 # <CJK>
+0x8EDC 0x707C # <CJK>
+0x8EDD 0x7235 # <CJK>
+0x8EDE 0x914C # <CJK>
+0x8EDF 0x91C8 # <CJK>
+0x8EE0 0x932B # <CJK>
+0x8EE1 0x82E5 # <CJK>
+0x8EE2 0x5BC2 # <CJK>
+0x8EE3 0x5F31 # <CJK>
+0x8EE4 0x60F9 # <CJK>
+0x8EE5 0x4E3B # <CJK>
+0x8EE6 0x53D6 # <CJK>
+0x8EE7 0x5B88 # <CJK>
+0x8EE8 0x624B # <CJK>
+0x8EE9 0x6731 # <CJK>
+0x8EEA 0x6B8A # <CJK>
+0x8EEB 0x72E9 # <CJK>
+0x8EEC 0x73E0 # <CJK>
+0x8EED 0x7A2E # <CJK>
+0x8EEE 0x816B # <CJK>
+0x8EEF 0x8DA3 # <CJK>
+0x8EF0 0x9152 # <CJK>
+0x8EF1 0x9996 # <CJK>
+0x8EF2 0x5112 # <CJK>
+0x8EF3 0x53D7 # <CJK>
+0x8EF4 0x546A # <CJK>
+0x8EF5 0x5BFF # <CJK>
+0x8EF6 0x6388 # <CJK>
+0x8EF7 0x6A39 # <CJK>
+0x8EF8 0x7DAC # <CJK>
+0x8EF9 0x9700 # <CJK>
+0x8EFA 0x56DA # <CJK>
+0x8EFB 0x53CE # <CJK>
+0x8EFC 0x5468 # <CJK>
+0x8F40 0x5B97 # <CJK>
+0x8F41 0x5C31 # <CJK>
+0x8F42 0x5DDE # <CJK>
+0x8F43 0x4FEE # <CJK>
+0x8F44 0x6101 # <CJK>
+0x8F45 0x62FE # <CJK>
+0x8F46 0x6D32 # <CJK>
+0x8F47 0x79C0 # <CJK>
+0x8F48 0x79CB # <CJK>
+0x8F49 0x7D42 # <CJK>
+0x8F4A 0x7E4D # <CJK>
+0x8F4B 0x7FD2 # <CJK>
+0x8F4C 0x81ED # <CJK>
+0x8F4D 0x821F # <CJK>
+0x8F4E 0x8490 # <CJK>
+0x8F4F 0x8846 # <CJK>
+0x8F50 0x8972 # <CJK>
+0x8F51 0x8B90 # <CJK>
+0x8F52 0x8E74 # <CJK>
+0x8F53 0x8F2F # <CJK>
+0x8F54 0x9031 # <CJK>
+0x8F55 0x914B # <CJK>
+0x8F56 0x916C # <CJK>
+0x8F57 0x96C6 # <CJK>
+0x8F58 0x919C # <CJK>
+0x8F59 0x4EC0 # <CJK>
+0x8F5A 0x4F4F # <CJK>
+0x8F5B 0x5145 # <CJK>
+0x8F5C 0x5341 # <CJK>
+0x8F5D 0x5F93 # <CJK>
+0x8F5E 0x620E # <CJK>
+0x8F5F 0x67D4 # <CJK>
+0x8F60 0x6C41 # <CJK>
+0x8F61 0x6E0B # <CJK>
+0x8F62 0x7363 # <CJK>
+0x8F63 0x7E26 # <CJK>
+0x8F64 0x91CD # <CJK>
+0x8F65 0x9283 # <CJK>
+0x8F66 0x53D4 # <CJK>
+0x8F67 0x5919 # <CJK>
+0x8F68 0x5BBF # <CJK>
+0x8F69 0x6DD1 # <CJK>
+0x8F6A 0x795D # <CJK>
+0x8F6B 0x7E2E # <CJK>
+0x8F6C 0x7C9B # <CJK>
+0x8F6D 0x587E # <CJK>
+0x8F6E 0x719F # <CJK>
+0x8F6F 0x51FA # <CJK>
+0x8F70 0x8853 # <CJK>
+0x8F71 0x8FF0 # <CJK>
+0x8F72 0x4FCA # <CJK>
+0x8F73 0x5CFB # <CJK>
+0x8F74 0x6625 # <CJK>
+0x8F75 0x77AC # <CJK>
+0x8F76 0x7AE3 # <CJK>
+0x8F77 0x821C # <CJK>
+0x8F78 0x99FF # <CJK>
+0x8F79 0x51C6 # <CJK>
+0x8F7A 0x5FAA # <CJK>
+0x8F7B 0x65EC # <CJK>
+0x8F7C 0x696F # <CJK>
+0x8F7D 0x6B89 # <CJK>
+0x8F7E 0x6DF3 # <CJK>
+0x8F80 0x6E96 # <CJK>
+0x8F81 0x6F64 # <CJK>
+0x8F82 0x76FE # <CJK>
+0x8F83 0x7D14 # <CJK>
+0x8F84 0x5DE1 # <CJK>
+0x8F85 0x9075 # <CJK>
+0x8F86 0x9187 # <CJK>
+0x8F87 0x9806 # <CJK>
+0x8F88 0x51E6 # <CJK>
+0x8F89 0x521D # <CJK>
+0x8F8A 0x6240 # <CJK>
+0x8F8B 0x6691 # <CJK>
+0x8F8C 0x66D9 # <CJK>
+0x8F8D 0x6E1A # <CJK>
+0x8F8E 0x5EB6 # <CJK>
+0x8F8F 0x7DD2 # <CJK>
+0x8F90 0x7F72 # <CJK>
+0x8F91 0x66F8 # <CJK>
+0x8F92 0x85AF # <CJK>
+0x8F93 0x85F7 # <CJK>
+0x8F94 0x8AF8 # <CJK>
+0x8F95 0x52A9 # <CJK>
+0x8F96 0x53D9 # <CJK>
+0x8F97 0x5973 # <CJK>
+0x8F98 0x5E8F # <CJK>
+0x8F99 0x5F90 # <CJK>
+0x8F9A 0x6055 # <CJK>
+0x8F9B 0x92E4 # <CJK>
+0x8F9C 0x9664 # <CJK>
+0x8F9D 0x50B7 # <CJK>
+0x8F9E 0x511F # <CJK>
+0x8F9F 0x52DD # <CJK>
+0x8FA0 0x5320 # <CJK>
+0x8FA1 0x5347 # <CJK>
+0x8FA2 0x53EC # <CJK>
+0x8FA3 0x54E8 # <CJK>
+0x8FA4 0x5546 # <CJK>
+0x8FA5 0x5531 # <CJK>
+0x8FA6 0x5617 # <CJK>
+0x8FA7 0x5968 # <CJK>
+0x8FA8 0x59BE # <CJK>
+0x8FA9 0x5A3C # <CJK>
+0x8FAA 0x5BB5 # <CJK>
+0x8FAB 0x5C06 # <CJK>
+0x8FAC 0x5C0F # <CJK>
+0x8FAD 0x5C11 # <CJK>
+0x8FAE 0x5C1A # <CJK>
+0x8FAF 0x5E84 # <CJK>
+0x8FB0 0x5E8A # <CJK>
+0x8FB1 0x5EE0 # <CJK>
+0x8FB2 0x5F70 # <CJK>
+0x8FB3 0x627F # <CJK>
+0x8FB4 0x6284 # <CJK>
+0x8FB5 0x62DB # <CJK>
+0x8FB6 0x638C # <CJK>
+0x8FB7 0x6377 # <CJK>
+0x8FB8 0x6607 # <CJK>
+0x8FB9 0x660C # <CJK>
+0x8FBA 0x662D # <CJK>
+0x8FBB 0x6676 # <CJK>
+0x8FBC 0x677E # <CJK>
+0x8FBD 0x68A2 # <CJK>
+0x8FBE 0x6A1F # <CJK>
+0x8FBF 0x6A35 # <CJK>
+0x8FC0 0x6CBC # <CJK>
+0x8FC1 0x6D88 # <CJK>
+0x8FC2 0x6E09 # <CJK>
+0x8FC3 0x6E58 # <CJK>
+0x8FC4 0x713C # <CJK>
+0x8FC5 0x7126 # <CJK>
+0x8FC6 0x7167 # <CJK>
+0x8FC7 0x75C7 # <CJK>
+0x8FC8 0x7701 # <CJK>
+0x8FC9 0x785D # <CJK>
+0x8FCA 0x7901 # <CJK>
+0x8FCB 0x7965 # <CJK>
+0x8FCC 0x79F0 # <CJK>
+0x8FCD 0x7AE0 # <CJK>
+0x8FCE 0x7B11 # <CJK>
+0x8FCF 0x7CA7 # <CJK>
+0x8FD0 0x7D39 # <CJK>
+0x8FD1 0x8096 # <CJK>
+0x8FD2 0x83D6 # <CJK>
+0x8FD3 0x848B # <CJK>
+0x8FD4 0x8549 # <CJK>
+0x8FD5 0x885D # <CJK>
+0x8FD6 0x88F3 # <CJK>
+0x8FD7 0x8A1F # <CJK>
+0x8FD8 0x8A3C # <CJK>
+0x8FD9 0x8A54 # <CJK>
+0x8FDA 0x8A73 # <CJK>
+0x8FDB 0x8C61 # <CJK>
+0x8FDC 0x8CDE # <CJK>
+0x8FDD 0x91A4 # <CJK>
+0x8FDE 0x9266 # <CJK>
+0x8FDF 0x937E # <CJK>
+0x8FE0 0x9418 # <CJK>
+0x8FE1 0x969C # <CJK>
+0x8FE2 0x9798 # <CJK>
+0x8FE3 0x4E0A # <CJK>
+0x8FE4 0x4E08 # <CJK>
+0x8FE5 0x4E1E # <CJK>
+0x8FE6 0x4E57 # <CJK>
+0x8FE7 0x5197 # <CJK>
+0x8FE8 0x5270 # <CJK>
+0x8FE9 0x57CE # <CJK>
+0x8FEA 0x5834 # <CJK>
+0x8FEB 0x58CC # <CJK>
+0x8FEC 0x5B22 # <CJK>
+0x8FED 0x5E38 # <CJK>
+0x8FEE 0x60C5 # <CJK>
+0x8FEF 0x64FE # <CJK>
+0x8FF0 0x6761 # <CJK>
+0x8FF1 0x6756 # <CJK>
+0x8FF2 0x6D44 # <CJK>
+0x8FF3 0x72B6 # <CJK>
+0x8FF4 0x7573 # <CJK>
+0x8FF5 0x7A63 # <CJK>
+0x8FF6 0x84B8 # <CJK>
+0x8FF7 0x8B72 # <CJK>
+0x8FF8 0x91B8 # <CJK>
+0x8FF9 0x9320 # <CJK>
+0x8FFA 0x5631 # <CJK>
+0x8FFB 0x57F4 # <CJK>
+0x8FFC 0x98FE # <CJK>
+0x9040 0x62ED # <CJK>
+0x9041 0x690D # <CJK>
+0x9042 0x6B96 # <CJK>
+0x9043 0x71ED # <CJK>
+0x9044 0x7E54 # <CJK>
+0x9045 0x8077 # <CJK>
+0x9046 0x8272 # <CJK>
+0x9047 0x89E6 # <CJK>
+0x9048 0x98DF # <CJK>
+0x9049 0x8755 # <CJK>
+0x904A 0x8FB1 # <CJK>
+0x904B 0x5C3B # <CJK>
+0x904C 0x4F38 # <CJK>
+0x904D 0x4FE1 # <CJK>
+0x904E 0x4FB5 # <CJK>
+0x904F 0x5507 # <CJK>
+0x9050 0x5A20 # <CJK>
+0x9051 0x5BDD # <CJK>
+0x9052 0x5BE9 # <CJK>
+0x9053 0x5FC3 # <CJK>
+0x9054 0x614E # <CJK>
+0x9055 0x632F # <CJK>
+0x9056 0x65B0 # <CJK>
+0x9057 0x664B # <CJK>
+0x9058 0x68EE # <CJK>
+0x9059 0x699B # <CJK>
+0x905A 0x6D78 # <CJK>
+0x905B 0x6DF1 # <CJK>
+0x905C 0x7533 # <CJK>
+0x905D 0x75B9 # <CJK>
+0x905E 0x771F # <CJK>
+0x905F 0x795E # <CJK>
+0x9060 0x79E6 # <CJK>
+0x9061 0x7D33 # <CJK>
+0x9062 0x81E3 # <CJK>
+0x9063 0x82AF # <CJK>
+0x9064 0x85AA # <CJK>
+0x9065 0x89AA # <CJK>
+0x9066 0x8A3A # <CJK>
+0x9067 0x8EAB # <CJK>
+0x9068 0x8F9B # <CJK>
+0x9069 0x9032 # <CJK>
+0x906A 0x91DD # <CJK>
+0x906B 0x9707 # <CJK>
+0x906C 0x4EBA # <CJK>
+0x906D 0x4EC1 # <CJK>
+0x906E 0x5203 # <CJK>
+0x906F 0x5875 # <CJK>
+0x9070 0x58EC # <CJK>
+0x9071 0x5C0B # <CJK>
+0x9072 0x751A # <CJK>
+0x9073 0x5C3D # <CJK>
+0x9074 0x814E # <CJK>
+0x9075 0x8A0A # <CJK>
+0x9076 0x8FC5 # <CJK>
+0x9077 0x9663 # <CJK>
+0x9078 0x976D # <CJK>
+0x9079 0x7B25 # <CJK>
+0x907A 0x8ACF # <CJK>
+0x907B 0x9808 # <CJK>
+0x907C 0x9162 # <CJK>
+0x907D 0x56F3 # <CJK>
+0x907E 0x53A8 # <CJK>
+0x9080 0x9017 # <CJK>
+0x9081 0x5439 # <CJK>
+0x9082 0x5782 # <CJK>
+0x9083 0x5E25 # <CJK>
+0x9084 0x63A8 # <CJK>
+0x9085 0x6C34 # <CJK>
+0x9086 0x708A # <CJK>
+0x9087 0x7761 # <CJK>
+0x9088 0x7C8B # <CJK>
+0x9089 0x7FE0 # <CJK>
+0x908A 0x8870 # <CJK>
+0x908B 0x9042 # <CJK>
+0x908C 0x9154 # <CJK>
+0x908D 0x9310 # <CJK>
+0x908E 0x9318 # <CJK>
+0x908F 0x968F # <CJK>
+0x9090 0x745E # <CJK>
+0x9091 0x9AC4 # <CJK>
+0x9092 0x5D07 # <CJK>
+0x9093 0x5D69 # <CJK>
+0x9094 0x6570 # <CJK>
+0x9095 0x67A2 # <CJK>
+0x9096 0x8DA8 # <CJK>
+0x9097 0x96DB # <CJK>
+0x9098 0x636E # <CJK>
+0x9099 0x6749 # <CJK>
+0x909A 0x6919 # <CJK>
+0x909B 0x83C5 # <CJK>
+0x909C 0x9817 # <CJK>
+0x909D 0x96C0 # <CJK>
+0x909E 0x88FE # <CJK>
+0x909F 0x6F84 # <CJK>
+0x90A0 0x647A # <CJK>
+0x90A1 0x5BF8 # <CJK>
+0x90A2 0x4E16 # <CJK>
+0x90A3 0x702C # <CJK>
+0x90A4 0x755D # <CJK>
+0x90A5 0x662F # <CJK>
+0x90A6 0x51C4 # <CJK>
+0x90A7 0x5236 # <CJK>
+0x90A8 0x52E2 # <CJK>
+0x90A9 0x59D3 # <CJK>
+0x90AA 0x5F81 # <CJK>
+0x90AB 0x6027 # <CJK>
+0x90AC 0x6210 # <CJK>
+0x90AD 0x653F # <CJK>
+0x90AE 0x6574 # <CJK>
+0x90AF 0x661F # <CJK>
+0x90B0 0x6674 # <CJK>
+0x90B1 0x68F2 # <CJK>
+0x90B2 0x6816 # <CJK>
+0x90B3 0x6B63 # <CJK>
+0x90B4 0x6E05 # <CJK>
+0x90B5 0x7272 # <CJK>
+0x90B6 0x751F # <CJK>
+0x90B7 0x76DB # <CJK>
+0x90B8 0x7CBE # <CJK>
+0x90B9 0x8056 # <CJK>
+0x90BA 0x58F0 # <CJK>
+0x90BB 0x88FD # <CJK>
+0x90BC 0x897F # <CJK>
+0x90BD 0x8AA0 # <CJK>
+0x90BE 0x8A93 # <CJK>
+0x90BF 0x8ACB # <CJK>
+0x90C0 0x901D # <CJK>
+0x90C1 0x9192 # <CJK>
+0x90C2 0x9752 # <CJK>
+0x90C3 0x9759 # <CJK>
+0x90C4 0x6589 # <CJK>
+0x90C5 0x7A0E # <CJK>
+0x90C6 0x8106 # <CJK>
+0x90C7 0x96BB # <CJK>
+0x90C8 0x5E2D # <CJK>
+0x90C9 0x60DC # <CJK>
+0x90CA 0x621A # <CJK>
+0x90CB 0x65A5 # <CJK>
+0x90CC 0x6614 # <CJK>
+0x90CD 0x6790 # <CJK>
+0x90CE 0x77F3 # <CJK>
+0x90CF 0x7A4D # <CJK>
+0x90D0 0x7C4D # <CJK>
+0x90D1 0x7E3E # <CJK>
+0x90D2 0x810A # <CJK>
+0x90D3 0x8CAC # <CJK>
+0x90D4 0x8D64 # <CJK>
+0x90D5 0x8DE1 # <CJK>
+0x90D6 0x8E5F # <CJK>
+0x90D7 0x78A9 # <CJK>
+0x90D8 0x5207 # <CJK>
+0x90D9 0x62D9 # <CJK>
+0x90DA 0x63A5 # <CJK>
+0x90DB 0x6442 # <CJK>
+0x90DC 0x6298 # <CJK>
+0x90DD 0x8A2D # <CJK>
+0x90DE 0x7A83 # <CJK>
+0x90DF 0x7BC0 # <CJK>
+0x90E0 0x8AAC # <CJK>
+0x90E1 0x96EA # <CJK>
+0x90E2 0x7D76 # <CJK>
+0x90E3 0x820C # <CJK>
+0x90E4 0x8749 # <CJK>
+0x90E5 0x4ED9 # <CJK>
+0x90E6 0x5148 # <CJK>
+0x90E7 0x5343 # <CJK>
+0x90E8 0x5360 # <CJK>
+0x90E9 0x5BA3 # <CJK>
+0x90EA 0x5C02 # <CJK>
+0x90EB 0x5C16 # <CJK>
+0x90EC 0x5DDD # <CJK>
+0x90ED 0x6226 # <CJK>
+0x90EE 0x6247 # <CJK>
+0x90EF 0x64B0 # <CJK>
+0x90F0 0x6813 # <CJK>
+0x90F1 0x6834 # <CJK>
+0x90F2 0x6CC9 # <CJK>
+0x90F3 0x6D45 # <CJK>
+0x90F4 0x6D17 # <CJK>
+0x90F5 0x67D3 # <CJK>
+0x90F6 0x6F5C # <CJK>
+0x90F7 0x714E # <CJK>
+0x90F8 0x717D # <CJK>
+0x90F9 0x65CB # <CJK>
+0x90FA 0x7A7F # <CJK>
+0x90FB 0x7BAD # <CJK>
+0x90FC 0x7DDA # <CJK>
+0x9140 0x7E4A # <CJK>
+0x9141 0x7FA8 # <CJK>
+0x9142 0x817A # <CJK>
+0x9143 0x821B # <CJK>
+0x9144 0x8239 # <CJK>
+0x9145 0x85A6 # <CJK>
+0x9146 0x8A6E # <CJK>
+0x9147 0x8CCE # <CJK>
+0x9148 0x8DF5 # <CJK>
+0x9149 0x9078 # <CJK>
+0x914A 0x9077 # <CJK>
+0x914B 0x92AD # <CJK>
+0x914C 0x9291 # <CJK>
+0x914D 0x9583 # <CJK>
+0x914E 0x9BAE # <CJK>
+0x914F 0x524D # <CJK>
+0x9150 0x5584 # <CJK>
+0x9151 0x6F38 # <CJK>
+0x9152 0x7136 # <CJK>
+0x9153 0x5168 # <CJK>
+0x9154 0x7985 # <CJK>
+0x9155 0x7E55 # <CJK>
+0x9156 0x81B3 # <CJK>
+0x9157 0x7CCE # <CJK>
+0x9158 0x564C # <CJK>
+0x9159 0x5851 # <CJK>
+0x915A 0x5CA8 # <CJK>
+0x915B 0x63AA # <CJK>
+0x915C 0x66FE # <CJK>
+0x915D 0x66FD # <CJK>
+0x915E 0x695A # <CJK>
+0x915F 0x72D9 # <CJK>
+0x9160 0x758F # <CJK>
+0x9161 0x758E # <CJK>
+0x9162 0x790E # <CJK>
+0x9163 0x7956 # <CJK>
+0x9164 0x79DF # <CJK>
+0x9165 0x7C97 # <CJK>
+0x9166 0x7D20 # <CJK>
+0x9167 0x7D44 # <CJK>
+0x9168 0x8607 # <CJK>
+0x9169 0x8A34 # <CJK>
+0x916A 0x963B # <CJK>
+0x916B 0x9061 # <CJK>
+0x916C 0x9F20 # <CJK>
+0x916D 0x50E7 # <CJK>
+0x916E 0x5275 # <CJK>
+0x916F 0x53CC # <CJK>
+0x9170 0x53E2 # <CJK>
+0x9171 0x5009 # <CJK>
+0x9172 0x55AA # <CJK>
+0x9173 0x58EE # <CJK>
+0x9174 0x594F # <CJK>
+0x9175 0x723D # <CJK>
+0x9176 0x5B8B # <CJK>
+0x9177 0x5C64 # <CJK>
+0x9178 0x531D # <CJK>
+0x9179 0x60E3 # <CJK>
+0x917A 0x60F3 # <CJK>
+0x917B 0x635C # <CJK>
+0x917C 0x6383 # <CJK>
+0x917D 0x633F # <CJK>
+0x917E 0x63BB # <CJK>
+0x9180 0x64CD # <CJK>
+0x9181 0x65E9 # <CJK>
+0x9182 0x66F9 # <CJK>
+0x9183 0x5DE3 # <CJK>
+0x9184 0x69CD # <CJK>
+0x9185 0x69FD # <CJK>
+0x9186 0x6F15 # <CJK>
+0x9187 0x71E5 # <CJK>
+0x9188 0x4E89 # <CJK>
+0x9189 0x75E9 # <CJK>
+0x918A 0x76F8 # <CJK>
+0x918B 0x7A93 # <CJK>
+0x918C 0x7CDF # <CJK>
+0x918D 0x7DCF # <CJK>
+0x918E 0x7D9C # <CJK>
+0x918F 0x8061 # <CJK>
+0x9190 0x8349 # <CJK>
+0x9191 0x8358 # <CJK>
+0x9192 0x846C # <CJK>
+0x9193 0x84BC # <CJK>
+0x9194 0x85FB # <CJK>
+0x9195 0x88C5 # <CJK>
+0x9196 0x8D70 # <CJK>
+0x9197 0x9001 # <CJK>
+0x9198 0x906D # <CJK>
+0x9199 0x9397 # <CJK>
+0x919A 0x971C # <CJK>
+0x919B 0x9A12 # <CJK>
+0x919C 0x50CF # <CJK>
+0x919D 0x5897 # <CJK>
+0x919E 0x618E # <CJK>
+0x919F 0x81D3 # <CJK>
+0x91A0 0x8535 # <CJK>
+0x91A1 0x8D08 # <CJK>
+0x91A2 0x9020 # <CJK>
+0x91A3 0x4FC3 # <CJK>
+0x91A4 0x5074 # <CJK>
+0x91A5 0x5247 # <CJK>
+0x91A6 0x5373 # <CJK>
+0x91A7 0x606F # <CJK>
+0x91A8 0x6349 # <CJK>
+0x91A9 0x675F # <CJK>
+0x91AA 0x6E2C # <CJK>
+0x91AB 0x8DB3 # <CJK>
+0x91AC 0x901F # <CJK>
+0x91AD 0x4FD7 # <CJK>
+0x91AE 0x5C5E # <CJK>
+0x91AF 0x8CCA # <CJK>
+0x91B0 0x65CF # <CJK>
+0x91B1 0x7D9A # <CJK>
+0x91B2 0x5352 # <CJK>
+0x91B3 0x8896 # <CJK>
+0x91B4 0x5176 # <CJK>
+0x91B5 0x63C3 # <CJK>
+0x91B6 0x5B58 # <CJK>
+0x91B7 0x5B6B # <CJK>
+0x91B8 0x5C0A # <CJK>
+0x91B9 0x640D # <CJK>
+0x91BA 0x6751 # <CJK>
+0x91BB 0x905C # <CJK>
+0x91BC 0x4ED6 # <CJK>
+0x91BD 0x591A # <CJK>
+0x91BE 0x592A # <CJK>
+0x91BF 0x6C70 # <CJK>
+0x91C0 0x8A51 # <CJK>
+0x91C1 0x553E # <CJK>
+0x91C2 0x5815 # <CJK>
+0x91C3 0x59A5 # <CJK>
+0x91C4 0x60F0 # <CJK>
+0x91C5 0x6253 # <CJK>
+0x91C6 0x67C1 # <CJK>
+0x91C7 0x8235 # <CJK>
+0x91C8 0x6955 # <CJK>
+0x91C9 0x9640 # <CJK>
+0x91CA 0x99C4 # <CJK>
+0x91CB 0x9A28 # <CJK>
+0x91CC 0x4F53 # <CJK>
+0x91CD 0x5806 # <CJK>
+0x91CE 0x5BFE # <CJK>
+0x91CF 0x8010 # <CJK>
+0x91D0 0x5CB1 # <CJK>
+0x91D1 0x5E2F # <CJK>
+0x91D2 0x5F85 # <CJK>
+0x91D3 0x6020 # <CJK>
+0x91D4 0x614B # <CJK>
+0x91D5 0x6234 # <CJK>
+0x91D6 0x66FF # <CJK>
+0x91D7 0x6CF0 # <CJK>
+0x91D8 0x6EDE # <CJK>
+0x91D9 0x80CE # <CJK>
+0x91DA 0x817F # <CJK>
+0x91DB 0x82D4 # <CJK>
+0x91DC 0x888B # <CJK>
+0x91DD 0x8CB8 # <CJK>
+0x91DE 0x9000 # <CJK>
+0x91DF 0x902E # <CJK>
+0x91E0 0x968A # <CJK>
+0x91E1 0x9EDB # <CJK>
+0x91E2 0x9BDB # <CJK>
+0x91E3 0x4EE3 # <CJK>
+0x91E4 0x53F0 # <CJK>
+0x91E5 0x5927 # <CJK>
+0x91E6 0x7B2C # <CJK>
+0x91E7 0x918D # <CJK>
+0x91E8 0x984C # <CJK>
+0x91E9 0x9DF9 # <CJK>
+0x91EA 0x6EDD # <CJK>
+0x91EB 0x7027 # <CJK>
+0x91EC 0x5353 # <CJK>
+0x91ED 0x5544 # <CJK>
+0x91EE 0x5B85 # <CJK>
+0x91EF 0x6258 # <CJK>
+0x91F0 0x629E # <CJK>
+0x91F1 0x62D3 # <CJK>
+0x91F2 0x6CA2 # <CJK>
+0x91F3 0x6FEF # <CJK>
+0x91F4 0x7422 # <CJK>
+0x91F5 0x8A17 # <CJK>
+0x91F6 0x9438 # <CJK>
+0x91F7 0x6FC1 # <CJK>
+0x91F8 0x8AFE # <CJK>
+0x91F9 0x8338 # <CJK>
+0x91FA 0x51E7 # <CJK>
+0x91FB 0x86F8 # <CJK>
+0x91FC 0x53EA # <CJK>
+0x9240 0x53E9 # <CJK>
+0x9241 0x4F46 # <CJK>
+0x9242 0x9054 # <CJK>
+0x9243 0x8FB0 # <CJK>
+0x9244 0x596A # <CJK>
+0x9245 0x8131 # <CJK>
+0x9246 0x5DFD # <CJK>
+0x9247 0x7AEA # <CJK>
+0x9248 0x8FBF # <CJK>
+0x9249 0x68DA # <CJK>
+0x924A 0x8C37 # <CJK>
+0x924B 0x72F8 # <CJK>
+0x924C 0x9C48 # <CJK>
+0x924D 0x6A3D # <CJK>
+0x924E 0x8AB0 # <CJK>
+0x924F 0x4E39 # <CJK>
+0x9250 0x5358 # <CJK>
+0x9251 0x5606 # <CJK>
+0x9252 0x5766 # <CJK>
+0x9253 0x62C5 # <CJK>
+0x9254 0x63A2 # <CJK>
+0x9255 0x65E6 # <CJK>
+0x9256 0x6B4E # <CJK>
+0x9257 0x6DE1 # <CJK>
+0x9258 0x6E5B # <CJK>
+0x9259 0x70AD # <CJK>
+0x925A 0x77ED # <CJK>
+0x925B 0x7AEF # <CJK>
+0x925C 0x7BAA # <CJK>
+0x925D 0x7DBB # <CJK>
+0x925E 0x803D # <CJK>
+0x925F 0x80C6 # <CJK>
+0x9260 0x86CB # <CJK>
+0x9261 0x8A95 # <CJK>
+0x9262 0x935B # <CJK>
+0x9263 0x56E3 # <CJK>
+0x9264 0x58C7 # <CJK>
+0x9265 0x5F3E # <CJK>
+0x9266 0x65AD # <CJK>
+0x9267 0x6696 # <CJK>
+0x9268 0x6A80 # <CJK>
+0x9269 0x6BB5 # <CJK>
+0x926A 0x7537 # <CJK>
+0x926B 0x8AC7 # <CJK>
+0x926C 0x5024 # <CJK>
+0x926D 0x77E5 # <CJK>
+0x926E 0x5730 # <CJK>
+0x926F 0x5F1B # <CJK>
+0x9270 0x6065 # <CJK>
+0x9271 0x667A # <CJK>
+0x9272 0x6C60 # <CJK>
+0x9273 0x75F4 # <CJK>
+0x9274 0x7A1A # <CJK>
+0x9275 0x7F6E # <CJK>
+0x9276 0x81F4 # <CJK>
+0x9277 0x8718 # <CJK>
+0x9278 0x9045 # <CJK>
+0x9279 0x99B3 # <CJK>
+0x927A 0x7BC9 # <CJK>
+0x927B 0x755C # <CJK>
+0x927C 0x7AF9 # <CJK>
+0x927D 0x7B51 # <CJK>
+0x927E 0x84C4 # <CJK>
+0x9280 0x9010 # <CJK>
+0x9281 0x79E9 # <CJK>
+0x9282 0x7A92 # <CJK>
+0x9283 0x8336 # <CJK>
+0x9284 0x5AE1 # <CJK>
+0x9285 0x7740 # <CJK>
+0x9286 0x4E2D # <CJK>
+0x9287 0x4EF2 # <CJK>
+0x9288 0x5B99 # <CJK>
+0x9289 0x5FE0 # <CJK>
+0x928A 0x62BD # <CJK>
+0x928B 0x663C # <CJK>
+0x928C 0x67F1 # <CJK>
+0x928D 0x6CE8 # <CJK>
+0x928E 0x866B # <CJK>
+0x928F 0x8877 # <CJK>
+0x9290 0x8A3B # <CJK>
+0x9291 0x914E # <CJK>
+0x9292 0x92F3 # <CJK>
+0x9293 0x99D0 # <CJK>
+0x9294 0x6A17 # <CJK>
+0x9295 0x7026 # <CJK>
+0x9296 0x732A # <CJK>
+0x9297 0x82E7 # <CJK>
+0x9298 0x8457 # <CJK>
+0x9299 0x8CAF # <CJK>
+0x929A 0x4E01 # <CJK>
+0x929B 0x5146 # <CJK>
+0x929C 0x51CB # <CJK>
+0x929D 0x558B # <CJK>
+0x929E 0x5BF5 # <CJK>
+0x929F 0x5E16 # <CJK>
+0x92A0 0x5E33 # <CJK>
+0x92A1 0x5E81 # <CJK>
+0x92A2 0x5F14 # <CJK>
+0x92A3 0x5F35 # <CJK>
+0x92A4 0x5F6B # <CJK>
+0x92A5 0x5FB4 # <CJK>
+0x92A6 0x61F2 # <CJK>
+0x92A7 0x6311 # <CJK>
+0x92A8 0x66A2 # <CJK>
+0x92A9 0x671D # <CJK>
+0x92AA 0x6F6E # <CJK>
+0x92AB 0x7252 # <CJK>
+0x92AC 0x753A # <CJK>
+0x92AD 0x773A # <CJK>
+0x92AE 0x8074 # <CJK>
+0x92AF 0x8139 # <CJK>
+0x92B0 0x8178 # <CJK>
+0x92B1 0x8776 # <CJK>
+0x92B2 0x8ABF # <CJK>
+0x92B3 0x8ADC # <CJK>
+0x92B4 0x8D85 # <CJK>
+0x92B5 0x8DF3 # <CJK>
+0x92B6 0x929A # <CJK>
+0x92B7 0x9577 # <CJK>
+0x92B8 0x9802 # <CJK>
+0x92B9 0x9CE5 # <CJK>
+0x92BA 0x52C5 # <CJK>
+0x92BB 0x6357 # <CJK>
+0x92BC 0x76F4 # <CJK>
+0x92BD 0x6715 # <CJK>
+0x92BE 0x6C88 # <CJK>
+0x92BF 0x73CD # <CJK>
+0x92C0 0x8CC3 # <CJK>
+0x92C1 0x93AE # <CJK>
+0x92C2 0x9673 # <CJK>
+0x92C3 0x6D25 # <CJK>
+0x92C4 0x589C # <CJK>
+0x92C5 0x690E # <CJK>
+0x92C6 0x69CC # <CJK>
+0x92C7 0x8FFD # <CJK>
+0x92C8 0x939A # <CJK>
+0x92C9 0x75DB # <CJK>
+0x92CA 0x901A # <CJK>
+0x92CB 0x585A # <CJK>
+0x92CC 0x6802 # <CJK>
+0x92CD 0x63B4 # <CJK>
+0x92CE 0x69FB # <CJK>
+0x92CF 0x4F43 # <CJK>
+0x92D0 0x6F2C # <CJK>
+0x92D1 0x67D8 # <CJK>
+0x92D2 0x8FBB # <CJK>
+0x92D3 0x8526 # <CJK>
+0x92D4 0x7DB4 # <CJK>
+0x92D5 0x9354 # <CJK>
+0x92D6 0x693F # <CJK>
+0x92D7 0x6F70 # <CJK>
+0x92D8 0x576A # <CJK>
+0x92D9 0x58F7 # <CJK>
+0x92DA 0x5B2C # <CJK>
+0x92DB 0x7D2C # <CJK>
+0x92DC 0x722A # <CJK>
+0x92DD 0x540A # <CJK>
+0x92DE 0x91E3 # <CJK>
+0x92DF 0x9DB4 # <CJK>
+0x92E0 0x4EAD # <CJK>
+0x92E1 0x4F4E # <CJK>
+0x92E2 0x505C # <CJK>
+0x92E3 0x5075 # <CJK>
+0x92E4 0x5243 # <CJK>
+0x92E5 0x8C9E # <CJK>
+0x92E6 0x5448 # <CJK>
+0x92E7 0x5824 # <CJK>
+0x92E8 0x5B9A # <CJK>
+0x92E9 0x5E1D # <CJK>
+0x92EA 0x5E95 # <CJK>
+0x92EB 0x5EAD # <CJK>
+0x92EC 0x5EF7 # <CJK>
+0x92ED 0x5F1F # <CJK>
+0x92EE 0x608C # <CJK>
+0x92EF 0x62B5 # <CJK>
+0x92F0 0x633A # <CJK>
+0x92F1 0x63D0 # <CJK>
+0x92F2 0x68AF # <CJK>
+0x92F3 0x6C40 # <CJK>
+0x92F4 0x7887 # <CJK>
+0x92F5 0x798E # <CJK>
+0x92F6 0x7A0B # <CJK>
+0x92F7 0x7DE0 # <CJK>
+0x92F8 0x8247 # <CJK>
+0x92F9 0x8A02 # <CJK>
+0x92FA 0x8AE6 # <CJK>
+0x92FB 0x8E44 # <CJK>
+0x92FC 0x9013 # <CJK>
+0x9340 0x90B8 # <CJK>
+0x9341 0x912D # <CJK>
+0x9342 0x91D8 # <CJK>
+0x9343 0x9F0E # <CJK>
+0x9344 0x6CE5 # <CJK>
+0x9345 0x6458 # <CJK>
+0x9346 0x64E2 # <CJK>
+0x9347 0x6575 # <CJK>
+0x9348 0x6EF4 # <CJK>
+0x9349 0x7684 # <CJK>
+0x934A 0x7B1B # <CJK>
+0x934B 0x9069 # <CJK>
+0x934C 0x93D1 # <CJK>
+0x934D 0x6EBA # <CJK>
+0x934E 0x54F2 # <CJK>
+0x934F 0x5FB9 # <CJK>
+0x9350 0x64A4 # <CJK>
+0x9351 0x8F4D # <CJK>
+0x9352 0x8FED # <CJK>
+0x9353 0x9244 # <CJK>
+0x9354 0x5178 # <CJK>
+0x9355 0x586B # <CJK>
+0x9356 0x5929 # <CJK>
+0x9357 0x5C55 # <CJK>
+0x9358 0x5E97 # <CJK>
+0x9359 0x6DFB # <CJK>
+0x935A 0x7E8F # <CJK>
+0x935B 0x751C # <CJK>
+0x935C 0x8CBC # <CJK>
+0x935D 0x8EE2 # <CJK>
+0x935E 0x985B # <CJK>
+0x935F 0x70B9 # <CJK>
+0x9360 0x4F1D # <CJK>
+0x9361 0x6BBF # <CJK>
+0x9362 0x6FB1 # <CJK>
+0x9363 0x7530 # <CJK>
+0x9364 0x96FB # <CJK>
+0x9365 0x514E # <CJK>
+0x9366 0x5410 # <CJK>
+0x9367 0x5835 # <CJK>
+0x9368 0x5857 # <CJK>
+0x9369 0x59AC # <CJK>
+0x936A 0x5C60 # <CJK>
+0x936B 0x5F92 # <CJK>
+0x936C 0x6597 # <CJK>
+0x936D 0x675C # <CJK>
+0x936E 0x6E21 # <CJK>
+0x936F 0x767B # <CJK>
+0x9370 0x83DF # <CJK>
+0x9371 0x8CED # <CJK>
+0x9372 0x9014 # <CJK>
+0x9373 0x90FD # <CJK>
+0x9374 0x934D # <CJK>
+0x9375 0x7825 # <CJK>
+0x9376 0x783A # <CJK>
+0x9377 0x52AA # <CJK>
+0x9378 0x5EA6 # <CJK>
+0x9379 0x571F # <CJK>
+0x937A 0x5974 # <CJK>
+0x937B 0x6012 # <CJK>
+0x937C 0x5012 # <CJK>
+0x937D 0x515A # <CJK>
+0x937E 0x51AC # <CJK>
+0x9380 0x51CD # <CJK>
+0x9381 0x5200 # <CJK>
+0x9382 0x5510 # <CJK>
+0x9383 0x5854 # <CJK>
+0x9384 0x5858 # <CJK>
+0x9385 0x5957 # <CJK>
+0x9386 0x5B95 # <CJK>
+0x9387 0x5CF6 # <CJK>
+0x9388 0x5D8B # <CJK>
+0x9389 0x60BC # <CJK>
+0x938A 0x6295 # <CJK>
+0x938B 0x642D # <CJK>
+0x938C 0x6771 # <CJK>
+0x938D 0x6843 # <CJK>
+0x938E 0x68BC # <CJK>
+0x938F 0x68DF # <CJK>
+0x9390 0x76D7 # <CJK>
+0x9391 0x6DD8 # <CJK>
+0x9392 0x6E6F # <CJK>
+0x9393 0x6D9B # <CJK>
+0x9394 0x706F # <CJK>
+0x9395 0x71C8 # <CJK>
+0x9396 0x5F53 # <CJK>
+0x9397 0x75D8 # <CJK>
+0x9398 0x7977 # <CJK>
+0x9399 0x7B49 # <CJK>
+0x939A 0x7B54 # <CJK>
+0x939B 0x7B52 # <CJK>
+0x939C 0x7CD6 # <CJK>
+0x939D 0x7D71 # <CJK>
+0x939E 0x5230 # <CJK>
+0x939F 0x8463 # <CJK>
+0x93A0 0x8569 # <CJK>
+0x93A1 0x85E4 # <CJK>
+0x93A2 0x8A0E # <CJK>
+0x93A3 0x8B04 # <CJK>
+0x93A4 0x8C46 # <CJK>
+0x93A5 0x8E0F # <CJK>
+0x93A6 0x9003 # <CJK>
+0x93A7 0x900F # <CJK>
+0x93A8 0x9419 # <CJK>
+0x93A9 0x9676 # <CJK>
+0x93AA 0x982D # <CJK>
+0x93AB 0x9A30 # <CJK>
+0x93AC 0x95D8 # <CJK>
+0x93AD 0x50CD # <CJK>
+0x93AE 0x52D5 # <CJK>
+0x93AF 0x540C # <CJK>
+0x93B0 0x5802 # <CJK>
+0x93B1 0x5C0E # <CJK>
+0x93B2 0x61A7 # <CJK>
+0x93B3 0x649E # <CJK>
+0x93B4 0x6D1E # <CJK>
+0x93B5 0x77B3 # <CJK>
+0x93B6 0x7AE5 # <CJK>
+0x93B7 0x80F4 # <CJK>
+0x93B8 0x8404 # <CJK>
+0x93B9 0x9053 # <CJK>
+0x93BA 0x9285 # <CJK>
+0x93BB 0x5CE0 # <CJK>
+0x93BC 0x9D07 # <CJK>
+0x93BD 0x533F # <CJK>
+0x93BE 0x5F97 # <CJK>
+0x93BF 0x5FB3 # <CJK>
+0x93C0 0x6D9C # <CJK>
+0x93C1 0x7279 # <CJK>
+0x93C2 0x7763 # <CJK>
+0x93C3 0x79BF # <CJK>
+0x93C4 0x7BE4 # <CJK>
+0x93C5 0x6BD2 # <CJK>
+0x93C6 0x72EC # <CJK>
+0x93C7 0x8AAD # <CJK>
+0x93C8 0x6803 # <CJK>
+0x93C9 0x6A61 # <CJK>
+0x93CA 0x51F8 # <CJK>
+0x93CB 0x7A81 # <CJK>
+0x93CC 0x6934 # <CJK>
+0x93CD 0x5C4A # <CJK>
+0x93CE 0x9CF6 # <CJK>
+0x93CF 0x82EB # <CJK>
+0x93D0 0x5BC5 # <CJK>
+0x93D1 0x9149 # <CJK>
+0x93D2 0x701E # <CJK>
+0x93D3 0x5678 # <CJK>
+0x93D4 0x5C6F # <CJK>
+0x93D5 0x60C7 # <CJK>
+0x93D6 0x6566 # <CJK>
+0x93D7 0x6C8C # <CJK>
+0x93D8 0x8C5A # <CJK>
+0x93D9 0x9041 # <CJK>
+0x93DA 0x9813 # <CJK>
+0x93DB 0x5451 # <CJK>
+0x93DC 0x66C7 # <CJK>
+0x93DD 0x920D # <CJK>
+0x93DE 0x5948 # <CJK>
+0x93DF 0x90A3 # <CJK>
+0x93E0 0x5185 # <CJK>
+0x93E1 0x4E4D # <CJK>
+0x93E2 0x51EA # <CJK>
+0x93E3 0x8599 # <CJK>
+0x93E4 0x8B0E # <CJK>
+0x93E5 0x7058 # <CJK>
+0x93E6 0x637A # <CJK>
+0x93E7 0x934B # <CJK>
+0x93E8 0x6962 # <CJK>
+0x93E9 0x99B4 # <CJK>
+0x93EA 0x7E04 # <CJK>
+0x93EB 0x7577 # <CJK>
+0x93EC 0x5357 # <CJK>
+0x93ED 0x6960 # <CJK>
+0x93EE 0x8EDF # <CJK>
+0x93EF 0x96E3 # <CJK>
+0x93F0 0x6C5D # <CJK>
+0x93F1 0x4E8C # <CJK>
+0x93F2 0x5C3C # <CJK>
+0x93F3 0x5F10 # <CJK>
+0x93F4 0x8FE9 # <CJK>
+0x93F5 0x5302 # <CJK>
+0x93F6 0x8CD1 # <CJK>
+0x93F7 0x8089 # <CJK>
+0x93F8 0x8679 # <CJK>
+0x93F9 0x5EFF # <CJK>
+0x93FA 0x65E5 # <CJK>
+0x93FB 0x4E73 # <CJK>
+0x93FC 0x5165 # <CJK>
+0x9440 0x5982 # <CJK>
+0x9441 0x5C3F # <CJK>
+0x9442 0x97EE # <CJK>
+0x9443 0x4EFB # <CJK>
+0x9444 0x598A # <CJK>
+0x9445 0x5FCD # <CJK>
+0x9446 0x8A8D # <CJK>
+0x9447 0x6FE1 # <CJK>
+0x9448 0x79B0 # <CJK>
+0x9449 0x7962 # <CJK>
+0x944A 0x5BE7 # <CJK>
+0x944B 0x8471 # <CJK>
+0x944C 0x732B # <CJK>
+0x944D 0x71B1 # <CJK>
+0x944E 0x5E74 # <CJK>
+0x944F 0x5FF5 # <CJK>
+0x9450 0x637B # <CJK>
+0x9451 0x649A # <CJK>
+0x9452 0x71C3 # <CJK>
+0x9453 0x7C98 # <CJK>
+0x9454 0x4E43 # <CJK>
+0x9455 0x5EFC # <CJK>
+0x9456 0x4E4B # <CJK>
+0x9457 0x57DC # <CJK>
+0x9458 0x56A2 # <CJK>
+0x9459 0x60A9 # <CJK>
+0x945A 0x6FC3 # <CJK>
+0x945B 0x7D0D # <CJK>
+0x945C 0x80FD # <CJK>
+0x945D 0x8133 # <CJK>
+0x945E 0x81BF # <CJK>
+0x945F 0x8FB2 # <CJK>
+0x9460 0x8997 # <CJK>
+0x9461 0x86A4 # <CJK>
+0x9462 0x5DF4 # <CJK>
+0x9463 0x628A # <CJK>
+0x9464 0x64AD # <CJK>
+0x9465 0x8987 # <CJK>
+0x9466 0x6777 # <CJK>
+0x9467 0x6CE2 # <CJK>
+0x9468 0x6D3E # <CJK>
+0x9469 0x7436 # <CJK>
+0x946A 0x7834 # <CJK>
+0x946B 0x5A46 # <CJK>
+0x946C 0x7F75 # <CJK>
+0x946D 0x82AD # <CJK>
+0x946E 0x99AC # <CJK>
+0x946F 0x4FF3 # <CJK>
+0x9470 0x5EC3 # <CJK>
+0x9471 0x62DD # <CJK>
+0x9472 0x6392 # <CJK>
+0x9473 0x6557 # <CJK>
+0x9474 0x676F # <CJK>
+0x9475 0x76C3 # <CJK>
+0x9476 0x724C # <CJK>
+0x9477 0x80CC # <CJK>
+0x9478 0x80BA # <CJK>
+0x9479 0x8F29 # <CJK>
+0x947A 0x914D # <CJK>
+0x947B 0x500D # <CJK>
+0x947C 0x57F9 # <CJK>
+0x947D 0x5A92 # <CJK>
+0x947E 0x6885 # <CJK>
+0x9480 0x6973 # <CJK>
+0x9481 0x7164 # <CJK>
+0x9482 0x72FD # <CJK>
+0x9483 0x8CB7 # <CJK>
+0x9484 0x58F2 # <CJK>
+0x9485 0x8CE0 # <CJK>
+0x9486 0x966A # <CJK>
+0x9487 0x9019 # <CJK>
+0x9488 0x877F # <CJK>
+0x9489 0x79E4 # <CJK>
+0x948A 0x77E7 # <CJK>
+0x948B 0x8429 # <CJK>
+0x948C 0x4F2F # <CJK>
+0x948D 0x5265 # <CJK>
+0x948E 0x535A # <CJK>
+0x948F 0x62CD # <CJK>
+0x9490 0x67CF # <CJK>
+0x9491 0x6CCA # <CJK>
+0x9492 0x767D # <CJK>
+0x9493 0x7B94 # <CJK>
+0x9494 0x7C95 # <CJK>
+0x9495 0x8236 # <CJK>
+0x9496 0x8584 # <CJK>
+0x9497 0x8FEB # <CJK>
+0x9498 0x66DD # <CJK>
+0x9499 0x6F20 # <CJK>
+0x949A 0x7206 # <CJK>
+0x949B 0x7E1B # <CJK>
+0x949C 0x83AB # <CJK>
+0x949D 0x99C1 # <CJK>
+0x949E 0x9EA6 # <CJK>
+0x949F 0x51FD # <CJK>
+0x94A0 0x7BB1 # <CJK>
+0x94A1 0x7872 # <CJK>
+0x94A2 0x7BB8 # <CJK>
+0x94A3 0x8087 # <CJK>
+0x94A4 0x7B48 # <CJK>
+0x94A5 0x6AE8 # <CJK>
+0x94A6 0x5E61 # <CJK>
+0x94A7 0x808C # <CJK>
+0x94A8 0x7551 # <CJK>
+0x94A9 0x7560 # <CJK>
+0x94AA 0x516B # <CJK>
+0x94AB 0x9262 # <CJK>
+0x94AC 0x6E8C # <CJK>
+0x94AD 0x767A # <CJK>
+0x94AE 0x9197 # <CJK>
+0x94AF 0x9AEA # <CJK>
+0x94B0 0x4F10 # <CJK>
+0x94B1 0x7F70 # <CJK>
+0x94B2 0x629C # <CJK>
+0x94B3 0x7B4F # <CJK>
+0x94B4 0x95A5 # <CJK>
+0x94B5 0x9CE9 # <CJK>
+0x94B6 0x567A # <CJK>
+0x94B7 0x5859 # <CJK>
+0x94B8 0x86E4 # <CJK>
+0x94B9 0x96BC # <CJK>
+0x94BA 0x4F34 # <CJK>
+0x94BB 0x5224 # <CJK>
+0x94BC 0x534A # <CJK>
+0x94BD 0x53CD # <CJK>
+0x94BE 0x53DB # <CJK>
+0x94BF 0x5E06 # <CJK>
+0x94C0 0x642C # <CJK>
+0x94C1 0x6591 # <CJK>
+0x94C2 0x677F # <CJK>
+0x94C3 0x6C3E # <CJK>
+0x94C4 0x6C4E # <CJK>
+0x94C5 0x7248 # <CJK>
+0x94C6 0x72AF # <CJK>
+0x94C7 0x73ED # <CJK>
+0x94C8 0x7554 # <CJK>
+0x94C9 0x7E41 # <CJK>
+0x94CA 0x822C # <CJK>
+0x94CB 0x85E9 # <CJK>
+0x94CC 0x8CA9 # <CJK>
+0x94CD 0x7BC4 # <CJK>
+0x94CE 0x91C6 # <CJK>
+0x94CF 0x7169 # <CJK>
+0x94D0 0x9812 # <CJK>
+0x94D1 0x98EF # <CJK>
+0x94D2 0x633D # <CJK>
+0x94D3 0x6669 # <CJK>
+0x94D4 0x756A # <CJK>
+0x94D5 0x76E4 # <CJK>
+0x94D6 0x78D0 # <CJK>
+0x94D7 0x8543 # <CJK>
+0x94D8 0x86EE # <CJK>
+0x94D9 0x532A # <CJK>
+0x94DA 0x5351 # <CJK>
+0x94DB 0x5426 # <CJK>
+0x94DC 0x5983 # <CJK>
+0x94DD 0x5E87 # <CJK>
+0x94DE 0x5F7C # <CJK>
+0x94DF 0x60B2 # <CJK>
+0x94E0 0x6249 # <CJK>
+0x94E1 0x6279 # <CJK>
+0x94E2 0x62AB # <CJK>
+0x94E3 0x6590 # <CJK>
+0x94E4 0x6BD4 # <CJK>
+0x94E5 0x6CCC # <CJK>
+0x94E6 0x75B2 # <CJK>
+0x94E7 0x76AE # <CJK>
+0x94E8 0x7891 # <CJK>
+0x94E9 0x79D8 # <CJK>
+0x94EA 0x7DCB # <CJK>
+0x94EB 0x7F77 # <CJK>
+0x94EC 0x80A5 # <CJK>
+0x94ED 0x88AB # <CJK>
+0x94EE 0x8AB9 # <CJK>
+0x94EF 0x8CBB # <CJK>
+0x94F0 0x907F # <CJK>
+0x94F1 0x975E # <CJK>
+0x94F2 0x98DB # <CJK>
+0x94F3 0x6A0B # <CJK>
+0x94F4 0x7C38 # <CJK>
+0x94F5 0x5099 # <CJK>
+0x94F6 0x5C3E # <CJK>
+0x94F7 0x5FAE # <CJK>
+0x94F8 0x6787 # <CJK>
+0x94F9 0x6BD8 # <CJK>
+0x94FA 0x7435 # <CJK>
+0x94FB 0x7709 # <CJK>
+0x94FC 0x7F8E # <CJK>
+0x9540 0x9F3B # <CJK>
+0x9541 0x67CA # <CJK>
+0x9542 0x7A17 # <CJK>
+0x9543 0x5339 # <CJK>
+0x9544 0x758B # <CJK>
+0x9545 0x9AED # <CJK>
+0x9546 0x5F66 # <CJK>
+0x9547 0x819D # <CJK>
+0x9548 0x83F1 # <CJK>
+0x9549 0x8098 # <CJK>
+0x954A 0x5F3C # <CJK>
+0x954B 0x5FC5 # <CJK>
+0x954C 0x7562 # <CJK>
+0x954D 0x7B46 # <CJK>
+0x954E 0x903C # <CJK>
+0x954F 0x6867 # <CJK>
+0x9550 0x59EB # <CJK>
+0x9551 0x5A9B # <CJK>
+0x9552 0x7D10 # <CJK>
+0x9553 0x767E # <CJK>
+0x9554 0x8B2C # <CJK>
+0x9555 0x4FF5 # <CJK>
+0x9556 0x5F6A # <CJK>
+0x9557 0x6A19 # <CJK>
+0x9558 0x6C37 # <CJK>
+0x9559 0x6F02 # <CJK>
+0x955A 0x74E2 # <CJK>
+0x955B 0x7968 # <CJK>
+0x955C 0x8868 # <CJK>
+0x955D 0x8A55 # <CJK>
+0x955E 0x8C79 # <CJK>
+0x955F 0x5EDF # <CJK>
+0x9560 0x63CF # <CJK>
+0x9561 0x75C5 # <CJK>
+0x9562 0x79D2 # <CJK>
+0x9563 0x82D7 # <CJK>
+0x9564 0x9328 # <CJK>
+0x9565 0x92F2 # <CJK>
+0x9566 0x849C # <CJK>
+0x9567 0x86ED # <CJK>
+0x9568 0x9C2D # <CJK>
+0x9569 0x54C1 # <CJK>
+0x956A 0x5F6C # <CJK>
+0x956B 0x658C # <CJK>
+0x956C 0x6D5C # <CJK>
+0x956D 0x7015 # <CJK>
+0x956E 0x8CA7 # <CJK>
+0x956F 0x8CD3 # <CJK>
+0x9570 0x983B # <CJK>
+0x9571 0x654F # <CJK>
+0x9572 0x74F6 # <CJK>
+0x9573 0x4E0D # <CJK>
+0x9574 0x4ED8 # <CJK>
+0x9575 0x57E0 # <CJK>
+0x9576 0x592B # <CJK>
+0x9577 0x5A66 # <CJK>
+0x9578 0x5BCC # <CJK>
+0x9579 0x51A8 # <CJK>
+0x957A 0x5E03 # <CJK>
+0x957B 0x5E9C # <CJK>
+0x957C 0x6016 # <CJK>
+0x957D 0x6276 # <CJK>
+0x957E 0x6577 # <CJK>
+0x9580 0x65A7 # <CJK>
+0x9581 0x666E # <CJK>
+0x9582 0x6D6E # <CJK>
+0x9583 0x7236 # <CJK>
+0x9584 0x7B26 # <CJK>
+0x9585 0x8150 # <CJK>
+0x9586 0x819A # <CJK>
+0x9587 0x8299 # <CJK>
+0x9588 0x8B5C # <CJK>
+0x9589 0x8CA0 # <CJK>
+0x958A 0x8CE6 # <CJK>
+0x958B 0x8D74 # <CJK>
+0x958C 0x961C # <CJK>
+0x958D 0x9644 # <CJK>
+0x958E 0x4FAE # <CJK>
+0x958F 0x64AB # <CJK>
+0x9590 0x6B66 # <CJK>
+0x9591 0x821E # <CJK>
+0x9592 0x8461 # <CJK>
+0x9593 0x856A # <CJK>
+0x9594 0x90E8 # <CJK>
+0x9595 0x5C01 # <CJK>
+0x9596 0x6953 # <CJK>
+0x9597 0x98A8 # <CJK>
+0x9598 0x847A # <CJK>
+0x9599 0x8557 # <CJK>
+0x959A 0x4F0F # <CJK>
+0x959B 0x526F # <CJK>
+0x959C 0x5FA9 # <CJK>
+0x959D 0x5E45 # <CJK>
+0x959E 0x670D # <CJK>
+0x959F 0x798F # <CJK>
+0x95A0 0x8179 # <CJK>
+0x95A1 0x8907 # <CJK>
+0x95A2 0x8986 # <CJK>
+0x95A3 0x6DF5 # <CJK>
+0x95A4 0x5F17 # <CJK>
+0x95A5 0x6255 # <CJK>
+0x95A6 0x6CB8 # <CJK>
+0x95A7 0x4ECF # <CJK>
+0x95A8 0x7269 # <CJK>
+0x95A9 0x9B92 # <CJK>
+0x95AA 0x5206 # <CJK>
+0x95AB 0x543B # <CJK>
+0x95AC 0x5674 # <CJK>
+0x95AD 0x58B3 # <CJK>
+0x95AE 0x61A4 # <CJK>
+0x95AF 0x626E # <CJK>
+0x95B0 0x711A # <CJK>
+0x95B1 0x596E # <CJK>
+0x95B2 0x7C89 # <CJK>
+0x95B3 0x7CDE # <CJK>
+0x95B4 0x7D1B # <CJK>
+0x95B5 0x96F0 # <CJK>
+0x95B6 0x6587 # <CJK>
+0x95B7 0x805E # <CJK>
+0x95B8 0x4E19 # <CJK>
+0x95B9 0x4F75 # <CJK>
+0x95BA 0x5175 # <CJK>
+0x95BB 0x5840 # <CJK>
+0x95BC 0x5E63 # <CJK>
+0x95BD 0x5E73 # <CJK>
+0x95BE 0x5F0A # <CJK>
+0x95BF 0x67C4 # <CJK>
+0x95C0 0x4E26 # <CJK>
+0x95C1 0x853D # <CJK>
+0x95C2 0x9589 # <CJK>
+0x95C3 0x965B # <CJK>
+0x95C4 0x7C73 # <CJK>
+0x95C5 0x9801 # <CJK>
+0x95C6 0x50FB # <CJK>
+0x95C7 0x58C1 # <CJK>
+0x95C8 0x7656 # <CJK>
+0x95C9 0x78A7 # <CJK>
+0x95CA 0x5225 # <CJK>
+0x95CB 0x77A5 # <CJK>
+0x95CC 0x8511 # <CJK>
+0x95CD 0x7B86 # <CJK>
+0x95CE 0x504F # <CJK>
+0x95CF 0x5909 # <CJK>
+0x95D0 0x7247 # <CJK>
+0x95D1 0x7BC7 # <CJK>
+0x95D2 0x7DE8 # <CJK>
+0x95D3 0x8FBA # <CJK>
+0x95D4 0x8FD4 # <CJK>
+0x95D5 0x904D # <CJK>
+0x95D6 0x4FBF # <CJK>
+0x95D7 0x52C9 # <CJK>
+0x95D8 0x5A29 # <CJK>
+0x95D9 0x5F01 # <CJK>
+0x95DA 0x97AD # <CJK>
+0x95DB 0x4FDD # <CJK>
+0x95DC 0x8217 # <CJK>
+0x95DD 0x92EA # <CJK>
+0x95DE 0x5703 # <CJK>
+0x95DF 0x6355 # <CJK>
+0x95E0 0x6B69 # <CJK>
+0x95E1 0x752B # <CJK>
+0x95E2 0x88DC # <CJK>
+0x95E3 0x8F14 # <CJK>
+0x95E4 0x7A42 # <CJK>
+0x95E5 0x52DF # <CJK>
+0x95E6 0x5893 # <CJK>
+0x95E7 0x6155 # <CJK>
+0x95E8 0x620A # <CJK>
+0x95E9 0x66AE # <CJK>
+0x95EA 0x6BCD # <CJK>
+0x95EB 0x7C3F # <CJK>
+0x95EC 0x83E9 # <CJK>
+0x95ED 0x5023 # <CJK>
+0x95EE 0x4FF8 # <CJK>
+0x95EF 0x5305 # <CJK>
+0x95F0 0x5446 # <CJK>
+0x95F1 0x5831 # <CJK>
+0x95F2 0x5949 # <CJK>
+0x95F3 0x5B9D # <CJK>
+0x95F4 0x5CF0 # <CJK>
+0x95F5 0x5CEF # <CJK>
+0x95F6 0x5D29 # <CJK>
+0x95F7 0x5E96 # <CJK>
+0x95F8 0x62B1 # <CJK>
+0x95F9 0x6367 # <CJK>
+0x95FA 0x653E # <CJK>
+0x95FB 0x65B9 # <CJK>
+0x95FC 0x670B # <CJK>
+0x9640 0x6CD5 # <CJK>
+0x9641 0x6CE1 # <CJK>
+0x9642 0x70F9 # <CJK>
+0x9643 0x7832 # <CJK>
+0x9644 0x7E2B # <CJK>
+0x9645 0x80DE # <CJK>
+0x9646 0x82B3 # <CJK>
+0x9647 0x840C # <CJK>
+0x9648 0x84EC # <CJK>
+0x9649 0x8702 # <CJK>
+0x964A 0x8912 # <CJK>
+0x964B 0x8A2A # <CJK>
+0x964C 0x8C4A # <CJK>
+0x964D 0x90A6 # <CJK>
+0x964E 0x92D2 # <CJK>
+0x964F 0x98FD # <CJK>
+0x9650 0x9CF3 # <CJK>
+0x9651 0x9D6C # <CJK>
+0x9652 0x4E4F # <CJK>
+0x9653 0x4EA1 # <CJK>
+0x9654 0x508D # <CJK>
+0x9655 0x5256 # <CJK>
+0x9656 0x574A # <CJK>
+0x9657 0x59A8 # <CJK>
+0x9658 0x5E3D # <CJK>
+0x9659 0x5FD8 # <CJK>
+0x965A 0x5FD9 # <CJK>
+0x965B 0x623F # <CJK>
+0x965C 0x66B4 # <CJK>
+0x965D 0x671B # <CJK>
+0x965E 0x67D0 # <CJK>
+0x965F 0x68D2 # <CJK>
+0x9660 0x5192 # <CJK>
+0x9661 0x7D21 # <CJK>
+0x9662 0x80AA # <CJK>
+0x9663 0x81A8 # <CJK>
+0x9664 0x8B00 # <CJK>
+0x9665 0x8C8C # <CJK>
+0x9666 0x8CBF # <CJK>
+0x9667 0x927E # <CJK>
+0x9668 0x9632 # <CJK>
+0x9669 0x5420 # <CJK>
+0x966A 0x982C # <CJK>
+0x966B 0x5317 # <CJK>
+0x966C 0x50D5 # <CJK>
+0x966D 0x535C # <CJK>
+0x966E 0x58A8 # <CJK>
+0x966F 0x64B2 # <CJK>
+0x9670 0x6734 # <CJK>
+0x9671 0x7267 # <CJK>
+0x9672 0x7766 # <CJK>
+0x9673 0x7A46 # <CJK>
+0x9674 0x91E6 # <CJK>
+0x9675 0x52C3 # <CJK>
+0x9676 0x6CA1 # <CJK>
+0x9677 0x6B86 # <CJK>
+0x9678 0x5800 # <CJK>
+0x9679 0x5E4C # <CJK>
+0x967A 0x5954 # <CJK>
+0x967B 0x672C # <CJK>
+0x967C 0x7FFB # <CJK>
+0x967D 0x51E1 # <CJK>
+0x967E 0x76C6 # <CJK>
+0x9680 0x6469 # <CJK>
+0x9681 0x78E8 # <CJK>
+0x9682 0x9B54 # <CJK>
+0x9683 0x9EBB # <CJK>
+0x9684 0x57CB # <CJK>
+0x9685 0x59B9 # <CJK>
+0x9686 0x6627 # <CJK>
+0x9687 0x679A # <CJK>
+0x9688 0x6BCE # <CJK>
+0x9689 0x54E9 # <CJK>
+0x968A 0x69D9 # <CJK>
+0x968B 0x5E55 # <CJK>
+0x968C 0x819C # <CJK>
+0x968D 0x6795 # <CJK>
+0x968E 0x9BAA # <CJK>
+0x968F 0x67FE # <CJK>
+0x9690 0x9C52 # <CJK>
+0x9691 0x685D # <CJK>
+0x9692 0x4EA6 # <CJK>
+0x9693 0x4FE3 # <CJK>
+0x9694 0x53C8 # <CJK>
+0x9695 0x62B9 # <CJK>
+0x9696 0x672B # <CJK>
+0x9697 0x6CAB # <CJK>
+0x9698 0x8FC4 # <CJK>
+0x9699 0x4FAD # <CJK>
+0x969A 0x7E6D # <CJK>
+0x969B 0x9EBF # <CJK>
+0x969C 0x4E07 # <CJK>
+0x969D 0x6162 # <CJK>
+0x969E 0x6E80 # <CJK>
+0x969F 0x6F2B # <CJK>
+0x96A0 0x8513 # <CJK>
+0x96A1 0x5473 # <CJK>
+0x96A2 0x672A # <CJK>
+0x96A3 0x9B45 # <CJK>
+0x96A4 0x5DF3 # <CJK>
+0x96A5 0x7B95 # <CJK>
+0x96A6 0x5CAC # <CJK>
+0x96A7 0x5BC6 # <CJK>
+0x96A8 0x871C # <CJK>
+0x96A9 0x6E4A # <CJK>
+0x96AA 0x84D1 # <CJK>
+0x96AB 0x7A14 # <CJK>
+0x96AC 0x8108 # <CJK>
+0x96AD 0x5999 # <CJK>
+0x96AE 0x7C8D # <CJK>
+0x96AF 0x6C11 # <CJK>
+0x96B0 0x7720 # <CJK>
+0x96B1 0x52D9 # <CJK>
+0x96B2 0x5922 # <CJK>
+0x96B3 0x7121 # <CJK>
+0x96B4 0x725F # <CJK>
+0x96B5 0x77DB # <CJK>
+0x96B6 0x9727 # <CJK>
+0x96B7 0x9D61 # <CJK>
+0x96B8 0x690B # <CJK>
+0x96B9 0x5A7F # <CJK>
+0x96BA 0x5A18 # <CJK>
+0x96BB 0x51A5 # <CJK>
+0x96BC 0x540D # <CJK>
+0x96BD 0x547D # <CJK>
+0x96BE 0x660E # <CJK>
+0x96BF 0x76DF # <CJK>
+0x96C0 0x8FF7 # <CJK>
+0x96C1 0x9298 # <CJK>
+0x96C2 0x9CF4 # <CJK>
+0x96C3 0x59EA # <CJK>
+0x96C4 0x725D # <CJK>
+0x96C5 0x6EC5 # <CJK>
+0x96C6 0x514D # <CJK>
+0x96C7 0x68C9 # <CJK>
+0x96C8 0x7DBF # <CJK>
+0x96C9 0x7DEC # <CJK>
+0x96CA 0x9762 # <CJK>
+0x96CB 0x9EBA # <CJK>
+0x96CC 0x6478 # <CJK>
+0x96CD 0x6A21 # <CJK>
+0x96CE 0x8302 # <CJK>
+0x96CF 0x5984 # <CJK>
+0x96D0 0x5B5F # <CJK>
+0x96D1 0x6BDB # <CJK>
+0x96D2 0x731B # <CJK>
+0x96D3 0x76F2 # <CJK>
+0x96D4 0x7DB2 # <CJK>
+0x96D5 0x8017 # <CJK>
+0x96D6 0x8499 # <CJK>
+0x96D7 0x5132 # <CJK>
+0x96D8 0x6728 # <CJK>
+0x96D9 0x9ED9 # <CJK>
+0x96DA 0x76EE # <CJK>
+0x96DB 0x6762 # <CJK>
+0x96DC 0x52FF # <CJK>
+0x96DD 0x9905 # <CJK>
+0x96DE 0x5C24 # <CJK>
+0x96DF 0x623B # <CJK>
+0x96E0 0x7C7E # <CJK>
+0x96E1 0x8CB0 # <CJK>
+0x96E2 0x554F # <CJK>
+0x96E3 0x60B6 # <CJK>
+0x96E4 0x7D0B # <CJK>
+0x96E5 0x9580 # <CJK>
+0x96E6 0x5301 # <CJK>
+0x96E7 0x4E5F # <CJK>
+0x96E8 0x51B6 # <CJK>
+0x96E9 0x591C # <CJK>
+0x96EA 0x723A # <CJK>
+0x96EB 0x8036 # <CJK>
+0x96EC 0x91CE # <CJK>
+0x96ED 0x5F25 # <CJK>
+0x96EE 0x77E2 # <CJK>
+0x96EF 0x5384 # <CJK>
+0x96F0 0x5F79 # <CJK>
+0x96F1 0x7D04 # <CJK>
+0x96F2 0x85AC # <CJK>
+0x96F3 0x8A33 # <CJK>
+0x96F4 0x8E8D # <CJK>
+0x96F5 0x9756 # <CJK>
+0x96F6 0x67F3 # <CJK>
+0x96F7 0x85AE # <CJK>
+0x96F8 0x9453 # <CJK>
+0x96F9 0x6109 # <CJK>
+0x96FA 0x6108 # <CJK>
+0x96FB 0x6CB9 # <CJK>
+0x96FC 0x7652 # <CJK>
+0x9740 0x8AED # <CJK>
+0x9741 0x8F38 # <CJK>
+0x9742 0x552F # <CJK>
+0x9743 0x4F51 # <CJK>
+0x9744 0x512A # <CJK>
+0x9745 0x52C7 # <CJK>
+0x9746 0x53CB # <CJK>
+0x9747 0x5BA5 # <CJK>
+0x9748 0x5E7D # <CJK>
+0x9749 0x60A0 # <CJK>
+0x974A 0x6182 # <CJK>
+0x974B 0x63D6 # <CJK>
+0x974C 0x6709 # <CJK>
+0x974D 0x67DA # <CJK>
+0x974E 0x6E67 # <CJK>
+0x974F 0x6D8C # <CJK>
+0x9750 0x7336 # <CJK>
+0x9751 0x7337 # <CJK>
+0x9752 0x7531 # <CJK>
+0x9753 0x7950 # <CJK>
+0x9754 0x88D5 # <CJK>
+0x9755 0x8A98 # <CJK>
+0x9756 0x904A # <CJK>
+0x9757 0x9091 # <CJK>
+0x9758 0x90F5 # <CJK>
+0x9759 0x96C4 # <CJK>
+0x975A 0x878D # <CJK>
+0x975B 0x5915 # <CJK>
+0x975C 0x4E88 # <CJK>
+0x975D 0x4F59 # <CJK>
+0x975E 0x4E0E # <CJK>
+0x975F 0x8A89 # <CJK>
+0x9760 0x8F3F # <CJK>
+0x9761 0x9810 # <CJK>
+0x9762 0x50AD # <CJK>
+0x9763 0x5E7C # <CJK>
+0x9764 0x5996 # <CJK>
+0x9765 0x5BB9 # <CJK>
+0x9766 0x5EB8 # <CJK>
+0x9767 0x63DA # <CJK>
+0x9768 0x63FA # <CJK>
+0x9769 0x64C1 # <CJK>
+0x976A 0x66DC # <CJK>
+0x976B 0x694A # <CJK>
+0x976C 0x69D8 # <CJK>
+0x976D 0x6D0B # <CJK>
+0x976E 0x6EB6 # <CJK>
+0x976F 0x7194 # <CJK>
+0x9770 0x7528 # <CJK>
+0x9771 0x7AAF # <CJK>
+0x9772 0x7F8A # <CJK>
+0x9773 0x8000 # <CJK>
+0x9774 0x8449 # <CJK>
+0x9775 0x84C9 # <CJK>
+0x9776 0x8981 # <CJK>
+0x9777 0x8B21 # <CJK>
+0x9778 0x8E0A # <CJK>
+0x9779 0x9065 # <CJK>
+0x977A 0x967D # <CJK>
+0x977B 0x990A # <CJK>
+0x977C 0x617E # <CJK>
+0x977D 0x6291 # <CJK>
+0x977E 0x6B32 # <CJK>
+0x9780 0x6C83 # <CJK>
+0x9781 0x6D74 # <CJK>
+0x9782 0x7FCC # <CJK>
+0x9783 0x7FFC # <CJK>
+0x9784 0x6DC0 # <CJK>
+0x9785 0x7F85 # <CJK>
+0x9786 0x87BA # <CJK>
+0x9787 0x88F8 # <CJK>
+0x9788 0x6765 # <CJK>
+0x9789 0x83B1 # <CJK>
+0x978A 0x983C # <CJK>
+0x978B 0x96F7 # <CJK>
+0x978C 0x6D1B # <CJK>
+0x978D 0x7D61 # <CJK>
+0x978E 0x843D # <CJK>
+0x978F 0x916A # <CJK>
+0x9790 0x4E71 # <CJK>
+0x9791 0x5375 # <CJK>
+0x9792 0x5D50 # <CJK>
+0x9793 0x6B04 # <CJK>
+0x9794 0x6FEB # <CJK>
+0x9795 0x85CD # <CJK>
+0x9796 0x862D # <CJK>
+0x9797 0x89A7 # <CJK>
+0x9798 0x5229 # <CJK>
+0x9799 0x540F # <CJK>
+0x979A 0x5C65 # <CJK>
+0x979B 0x674E # <CJK>
+0x979C 0x68A8 # <CJK>
+0x979D 0x7406 # <CJK>
+0x979E 0x7483 # <CJK>
+0x979F 0x75E2 # <CJK>
+0x97A0 0x88CF # <CJK>
+0x97A1 0x88E1 # <CJK>
+0x97A2 0x91CC # <CJK>
+0x97A3 0x96E2 # <CJK>
+0x97A4 0x9678 # <CJK>
+0x97A5 0x5F8B # <CJK>
+0x97A6 0x7387 # <CJK>
+0x97A7 0x7ACB # <CJK>
+0x97A8 0x844E # <CJK>
+0x97A9 0x63A0 # <CJK>
+0x97AA 0x7565 # <CJK>
+0x97AB 0x5289 # <CJK>
+0x97AC 0x6D41 # <CJK>
+0x97AD 0x6E9C # <CJK>
+0x97AE 0x7409 # <CJK>
+0x97AF 0x7559 # <CJK>
+0x97B0 0x786B # <CJK>
+0x97B1 0x7C92 # <CJK>
+0x97B2 0x9686 # <CJK>
+0x97B3 0x7ADC # <CJK>
+0x97B4 0x9F8D # <CJK>
+0x97B5 0x4FB6 # <CJK>
+0x97B6 0x616E # <CJK>
+0x97B7 0x65C5 # <CJK>
+0x97B8 0x865C # <CJK>
+0x97B9 0x4E86 # <CJK>
+0x97BA 0x4EAE # <CJK>
+0x97BB 0x50DA # <CJK>
+0x97BC 0x4E21 # <CJK>
+0x97BD 0x51CC # <CJK>
+0x97BE 0x5BEE # <CJK>
+0x97BF 0x6599 # <CJK>
+0x97C0 0x6881 # <CJK>
+0x97C1 0x6DBC # <CJK>
+0x97C2 0x731F # <CJK>
+0x97C3 0x7642 # <CJK>
+0x97C4 0x77AD # <CJK>
+0x97C5 0x7A1C # <CJK>
+0x97C6 0x7CE7 # <CJK>
+0x97C7 0x826F # <CJK>
+0x97C8 0x8AD2 # <CJK>
+0x97C9 0x907C # <CJK>
+0x97CA 0x91CF # <CJK>
+0x97CB 0x9675 # <CJK>
+0x97CC 0x9818 # <CJK>
+0x97CD 0x529B # <CJK>
+0x97CE 0x7DD1 # <CJK>
+0x97CF 0x502B # <CJK>
+0x97D0 0x5398 # <CJK>
+0x97D1 0x6797 # <CJK>
+0x97D2 0x6DCB # <CJK>
+0x97D3 0x71D0 # <CJK>
+0x97D4 0x7433 # <CJK>
+0x97D5 0x81E8 # <CJK>
+0x97D6 0x8F2A # <CJK>
+0x97D7 0x96A3 # <CJK>
+0x97D8 0x9C57 # <CJK>
+0x97D9 0x9E9F # <CJK>
+0x97DA 0x7460 # <CJK>
+0x97DB 0x5841 # <CJK>
+0x97DC 0x6D99 # <CJK>
+0x97DD 0x7D2F # <CJK>
+0x97DE 0x985E # <CJK>
+0x97DF 0x4EE4 # <CJK>
+0x97E0 0x4F36 # <CJK>
+0x97E1 0x4F8B # <CJK>
+0x97E2 0x51B7 # <CJK>
+0x97E3 0x52B1 # <CJK>
+0x97E4 0x5DBA # <CJK>
+0x97E5 0x601C # <CJK>
+0x97E6 0x73B2 # <CJK>
+0x97E7 0x793C # <CJK>
+0x97E8 0x82D3 # <CJK>
+0x97E9 0x9234 # <CJK>
+0x97EA 0x96B7 # <CJK>
+0x97EB 0x96F6 # <CJK>
+0x97EC 0x970A # <CJK>
+0x97ED 0x9E97 # <CJK>
+0x97EE 0x9F62 # <CJK>
+0x97EF 0x66A6 # <CJK>
+0x97F0 0x6B74 # <CJK>
+0x97F1 0x5217 # <CJK>
+0x97F2 0x52A3 # <CJK>
+0x97F3 0x70C8 # <CJK>
+0x97F4 0x88C2 # <CJK>
+0x97F5 0x5EC9 # <CJK>
+0x97F6 0x604B # <CJK>
+0x97F7 0x6190 # <CJK>
+0x97F8 0x6F23 # <CJK>
+0x97F9 0x7149 # <CJK>
+0x97FA 0x7C3E # <CJK>
+0x97FB 0x7DF4 # <CJK>
+0x97FC 0x806F # <CJK>
+0x9840 0x84EE # <CJK>
+0x9841 0x9023 # <CJK>
+0x9842 0x932C # <CJK>
+0x9843 0x5442 # <CJK>
+0x9844 0x9B6F # <CJK>
+0x9845 0x6AD3 # <CJK>
+0x9846 0x7089 # <CJK>
+0x9847 0x8CC2 # <CJK>
+0x9848 0x8DEF # <CJK>
+0x9849 0x9732 # <CJK>
+0x984A 0x52B4 # <CJK>
+0x984B 0x5A41 # <CJK>
+0x984C 0x5ECA # <CJK>
+0x984D 0x5F04 # <CJK>
+0x984E 0x6717 # <CJK>
+0x984F 0x697C # <CJK>
+0x9850 0x6994 # <CJK>
+0x9851 0x6D6A # <CJK>
+0x9852 0x6F0F # <CJK>
+0x9853 0x7262 # <CJK>
+0x9854 0x72FC # <CJK>
+0x9855 0x7BED # <CJK>
+0x9856 0x8001 # <CJK>
+0x9857 0x807E # <CJK>
+0x9858 0x874B # <CJK>
+0x9859 0x90CE # <CJK>
+0x985A 0x516D # <CJK>
+0x985B 0x9E93 # <CJK>
+0x985C 0x7984 # <CJK>
+0x985D 0x808B # <CJK>
+0x985E 0x9332 # <CJK>
+0x985F 0x8AD6 # <CJK>
+0x9860 0x502D # <CJK>
+0x9861 0x548C # <CJK>
+0x9862 0x8A71 # <CJK>
+0x9863 0x6B6A # <CJK>
+0x9864 0x8CC4 # <CJK>
+0x9865 0x8107 # <CJK>
+0x9866 0x60D1 # <CJK>
+0x9867 0x67A0 # <CJK>
+0x9868 0x9DF2 # <CJK>
+0x9869 0x4E99 # <CJK>
+0x986A 0x4E98 # <CJK>
+0x986B 0x9C10 # <CJK>
+0x986C 0x8A6B # <CJK>
+0x986D 0x85C1 # <CJK>
+0x986E 0x8568 # <CJK>
+0x986F 0x6900 # <CJK>
+0x9870 0x6E7E # <CJK>
+0x9871 0x7897 # <CJK>
+0x9872 0x8155 # <CJK>
+0x989F 0x5F0C # <CJK>
+0x98A0 0x4E10 # <CJK>
+0x98A1 0x4E15 # <CJK>
+0x98A2 0x4E2A # <CJK>
+0x98A3 0x4E31 # <CJK>
+0x98A4 0x4E36 # <CJK>
+0x98A5 0x4E3C # <CJK>
+0x98A6 0x4E3F # <CJK>
+0x98A7 0x4E42 # <CJK>
+0x98A8 0x4E56 # <CJK>
+0x98A9 0x4E58 # <CJK>
+0x98AA 0x4E82 # <CJK>
+0x98AB 0x4E85 # <CJK>
+0x98AC 0x8C6B # <CJK>
+0x98AD 0x4E8A # <CJK>
+0x98AE 0x8212 # <CJK>
+0x98AF 0x5F0D # <CJK>
+0x98B0 0x4E8E # <CJK>
+0x98B1 0x4E9E # <CJK>
+0x98B2 0x4E9F # <CJK>
+0x98B3 0x4EA0 # <CJK>
+0x98B4 0x4EA2 # <CJK>
+0x98B5 0x4EB0 # <CJK>
+0x98B6 0x4EB3 # <CJK>
+0x98B7 0x4EB6 # <CJK>
+0x98B8 0x4ECE # <CJK>
+0x98B9 0x4ECD # <CJK>
+0x98BA 0x4EC4 # <CJK>
+0x98BB 0x4EC6 # <CJK>
+0x98BC 0x4EC2 # <CJK>
+0x98BD 0x4ED7 # <CJK>
+0x98BE 0x4EDE # <CJK>
+0x98BF 0x4EED # <CJK>
+0x98C0 0x4EDF # <CJK>
+0x98C1 0x4EF7 # <CJK>
+0x98C2 0x4F09 # <CJK>
+0x98C3 0x4F5A # <CJK>
+0x98C4 0x4F30 # <CJK>
+0x98C5 0x4F5B # <CJK>
+0x98C6 0x4F5D # <CJK>
+0x98C7 0x4F57 # <CJK>
+0x98C8 0x4F47 # <CJK>
+0x98C9 0x4F76 # <CJK>
+0x98CA 0x4F88 # <CJK>
+0x98CB 0x4F8F # <CJK>
+0x98CC 0x4F98 # <CJK>
+0x98CD 0x4F7B # <CJK>
+0x98CE 0x4F69 # <CJK>
+0x98CF 0x4F70 # <CJK>
+0x98D0 0x4F91 # <CJK>
+0x98D1 0x4F6F # <CJK>
+0x98D2 0x4F86 # <CJK>
+0x98D3 0x4F96 # <CJK>
+0x98D4 0x5118 # <CJK>
+0x98D5 0x4FD4 # <CJK>
+0x98D6 0x4FDF # <CJK>
+0x98D7 0x4FCE # <CJK>
+0x98D8 0x4FD8 # <CJK>
+0x98D9 0x4FDB # <CJK>
+0x98DA 0x4FD1 # <CJK>
+0x98DB 0x4FDA # <CJK>
+0x98DC 0x4FD0 # <CJK>
+0x98DD 0x4FE4 # <CJK>
+0x98DE 0x4FE5 # <CJK>
+0x98DF 0x501A # <CJK>
+0x98E0 0x5028 # <CJK>
+0x98E1 0x5014 # <CJK>
+0x98E2 0x502A # <CJK>
+0x98E3 0x5025 # <CJK>
+0x98E4 0x5005 # <CJK>
+0x98E5 0x4F1C # <CJK>
+0x98E6 0x4FF6 # <CJK>
+0x98E7 0x5021 # <CJK>
+0x98E8 0x5029 # <CJK>
+0x98E9 0x502C # <CJK>
+0x98EA 0x4FFE # <CJK>
+0x98EB 0x4FEF # <CJK>
+0x98EC 0x5011 # <CJK>
+0x98ED 0x5006 # <CJK>
+0x98EE 0x5043 # <CJK>
+0x98EF 0x5047 # <CJK>
+0x98F0 0x6703 # <CJK>
+0x98F1 0x5055 # <CJK>
+0x98F2 0x5050 # <CJK>
+0x98F3 0x5048 # <CJK>
+0x98F4 0x505A # <CJK>
+0x98F5 0x5056 # <CJK>
+0x98F6 0x506C # <CJK>
+0x98F7 0x5078 # <CJK>
+0x98F8 0x5080 # <CJK>
+0x98F9 0x509A # <CJK>
+0x98FA 0x5085 # <CJK>
+0x98FB 0x50B4 # <CJK>
+0x98FC 0x50B2 # <CJK>
+0x9940 0x50C9 # <CJK>
+0x9941 0x50CA # <CJK>
+0x9942 0x50B3 # <CJK>
+0x9943 0x50C2 # <CJK>
+0x9944 0x50D6 # <CJK>
+0x9945 0x50DE # <CJK>
+0x9946 0x50E5 # <CJK>
+0x9947 0x50ED # <CJK>
+0x9948 0x50E3 # <CJK>
+0x9949 0x50EE # <CJK>
+0x994A 0x50F9 # <CJK>
+0x994B 0x50F5 # <CJK>
+0x994C 0x5109 # <CJK>
+0x994D 0x5101 # <CJK>
+0x994E 0x5102 # <CJK>
+0x994F 0x5116 # <CJK>
+0x9950 0x5115 # <CJK>
+0x9951 0x5114 # <CJK>
+0x9952 0x511A # <CJK>
+0x9953 0x5121 # <CJK>
+0x9954 0x513A # <CJK>
+0x9955 0x5137 # <CJK>
+0x9956 0x513C # <CJK>
+0x9957 0x513B # <CJK>
+0x9958 0x513F # <CJK>
+0x9959 0x5140 # <CJK>
+0x995A 0x5152 # <CJK>
+0x995B 0x514C # <CJK>
+0x995C 0x5154 # <CJK>
+0x995D 0x5162 # <CJK>
+0x995E 0x7AF8 # <CJK>
+0x995F 0x5169 # <CJK>
+0x9960 0x516A # <CJK>
+0x9961 0x516E # <CJK>
+0x9962 0x5180 # <CJK>
+0x9963 0x5182 # <CJK>
+0x9964 0x56D8 # <CJK>
+0x9965 0x518C # <CJK>
+0x9966 0x5189 # <CJK>
+0x9967 0x518F # <CJK>
+0x9968 0x5191 # <CJK>
+0x9969 0x5193 # <CJK>
+0x996A 0x5195 # <CJK>
+0x996B 0x5196 # <CJK>
+0x996C 0x51A4 # <CJK>
+0x996D 0x51A6 # <CJK>
+0x996E 0x51A2 # <CJK>
+0x996F 0x51A9 # <CJK>
+0x9970 0x51AA # <CJK>
+0x9971 0x51AB # <CJK>
+0x9972 0x51B3 # <CJK>
+0x9973 0x51B1 # <CJK>
+0x9974 0x51B2 # <CJK>
+0x9975 0x51B0 # <CJK>
+0x9976 0x51B5 # <CJK>
+0x9977 0x51BD # <CJK>
+0x9978 0x51C5 # <CJK>
+0x9979 0x51C9 # <CJK>
+0x997A 0x51DB # <CJK>
+0x997B 0x51E0 # <CJK>
+0x997C 0x8655 # <CJK>
+0x997D 0x51E9 # <CJK>
+0x997E 0x51ED # <CJK>
+0x9980 0x51F0 # <CJK>
+0x9981 0x51F5 # <CJK>
+0x9982 0x51FE # <CJK>
+0x9983 0x5204 # <CJK>
+0x9984 0x520B # <CJK>
+0x9985 0x5214 # <CJK>
+0x9986 0x520E # <CJK>
+0x9987 0x5227 # <CJK>
+0x9988 0x522A # <CJK>
+0x9989 0x522E # <CJK>
+0x998A 0x5233 # <CJK>
+0x998B 0x5239 # <CJK>
+0x998C 0x524F # <CJK>
+0x998D 0x5244 # <CJK>
+0x998E 0x524B # <CJK>
+0x998F 0x524C # <CJK>
+0x9990 0x525E # <CJK>
+0x9991 0x5254 # <CJK>
+0x9992 0x526A # <CJK>
+0x9993 0x5274 # <CJK>
+0x9994 0x5269 # <CJK>
+0x9995 0x5273 # <CJK>
+0x9996 0x527F # <CJK>
+0x9997 0x527D # <CJK>
+0x9998 0x528D # <CJK>
+0x9999 0x5294 # <CJK>
+0x999A 0x5292 # <CJK>
+0x999B 0x5271 # <CJK>
+0x999C 0x5288 # <CJK>
+0x999D 0x5291 # <CJK>
+0x999E 0x8FA8 # <CJK>
+0x999F 0x8FA7 # <CJK>
+0x99A0 0x52AC # <CJK>
+0x99A1 0x52AD # <CJK>
+0x99A2 0x52BC # <CJK>
+0x99A3 0x52B5 # <CJK>
+0x99A4 0x52C1 # <CJK>
+0x99A5 0x52CD # <CJK>
+0x99A6 0x52D7 # <CJK>
+0x99A7 0x52DE # <CJK>
+0x99A8 0x52E3 # <CJK>
+0x99A9 0x52E6 # <CJK>
+0x99AA 0x98ED # <CJK>
+0x99AB 0x52E0 # <CJK>
+0x99AC 0x52F3 # <CJK>
+0x99AD 0x52F5 # <CJK>
+0x99AE 0x52F8 # <CJK>
+0x99AF 0x52F9 # <CJK>
+0x99B0 0x5306 # <CJK>
+0x99B1 0x5308 # <CJK>
+0x99B2 0x7538 # <CJK>
+0x99B3 0x530D # <CJK>
+0x99B4 0x5310 # <CJK>
+0x99B5 0x530F # <CJK>
+0x99B6 0x5315 # <CJK>
+0x99B7 0x531A # <CJK>
+0x99B8 0x5323 # <CJK>
+0x99B9 0x532F # <CJK>
+0x99BA 0x5331 # <CJK>
+0x99BB 0x5333 # <CJK>
+0x99BC 0x5338 # <CJK>
+0x99BD 0x5340 # <CJK>
+0x99BE 0x5346 # <CJK>
+0x99BF 0x5345 # <CJK>
+0x99C0 0x4E17 # <CJK>
+0x99C1 0x5349 # <CJK>
+0x99C2 0x534D # <CJK>
+0x99C3 0x51D6 # <CJK>
+0x99C4 0x535E # <CJK>
+0x99C5 0x5369 # <CJK>
+0x99C6 0x536E # <CJK>
+0x99C7 0x5918 # <CJK>
+0x99C8 0x537B # <CJK>
+0x99C9 0x5377 # <CJK>
+0x99CA 0x5382 # <CJK>
+0x99CB 0x5396 # <CJK>
+0x99CC 0x53A0 # <CJK>
+0x99CD 0x53A6 # <CJK>
+0x99CE 0x53A5 # <CJK>
+0x99CF 0x53AE # <CJK>
+0x99D0 0x53B0 # <CJK>
+0x99D1 0x53B6 # <CJK>
+0x99D2 0x53C3 # <CJK>
+0x99D3 0x7C12 # <CJK>
+0x99D4 0x96D9 # <CJK>
+0x99D5 0x53DF # <CJK>
+0x99D6 0x66FC # <CJK>
+0x99D7 0x71EE # <CJK>
+0x99D8 0x53EE # <CJK>
+0x99D9 0x53E8 # <CJK>
+0x99DA 0x53ED # <CJK>
+0x99DB 0x53FA # <CJK>
+0x99DC 0x5401 # <CJK>
+0x99DD 0x543D # <CJK>
+0x99DE 0x5440 # <CJK>
+0x99DF 0x542C # <CJK>
+0x99E0 0x542D # <CJK>
+0x99E1 0x543C # <CJK>
+0x99E2 0x542E # <CJK>
+0x99E3 0x5436 # <CJK>
+0x99E4 0x5429 # <CJK>
+0x99E5 0x541D # <CJK>
+0x99E6 0x544E # <CJK>
+0x99E7 0x548F # <CJK>
+0x99E8 0x5475 # <CJK>
+0x99E9 0x548E # <CJK>
+0x99EA 0x545F # <CJK>
+0x99EB 0x5471 # <CJK>
+0x99EC 0x5477 # <CJK>
+0x99ED 0x5470 # <CJK>
+0x99EE 0x5492 # <CJK>
+0x99EF 0x547B # <CJK>
+0x99F0 0x5480 # <CJK>
+0x99F1 0x5476 # <CJK>
+0x99F2 0x5484 # <CJK>
+0x99F3 0x5490 # <CJK>
+0x99F4 0x5486 # <CJK>
+0x99F5 0x54C7 # <CJK>
+0x99F6 0x54A2 # <CJK>
+0x99F7 0x54B8 # <CJK>
+0x99F8 0x54A5 # <CJK>
+0x99F9 0x54AC # <CJK>
+0x99FA 0x54C4 # <CJK>
+0x99FB 0x54C8 # <CJK>
+0x99FC 0x54A8 # <CJK>
+0x9A40 0x54AB # <CJK>
+0x9A41 0x54C2 # <CJK>
+0x9A42 0x54A4 # <CJK>
+0x9A43 0x54BE # <CJK>
+0x9A44 0x54BC # <CJK>
+0x9A45 0x54D8 # <CJK>
+0x9A46 0x54E5 # <CJK>
+0x9A47 0x54E6 # <CJK>
+0x9A48 0x550F # <CJK>
+0x9A49 0x5514 # <CJK>
+0x9A4A 0x54FD # <CJK>
+0x9A4B 0x54EE # <CJK>
+0x9A4C 0x54ED # <CJK>
+0x9A4D 0x54FA # <CJK>
+0x9A4E 0x54E2 # <CJK>
+0x9A4F 0x5539 # <CJK>
+0x9A50 0x5540 # <CJK>
+0x9A51 0x5563 # <CJK>
+0x9A52 0x554C # <CJK>
+0x9A53 0x552E # <CJK>
+0x9A54 0x555C # <CJK>
+0x9A55 0x5545 # <CJK>
+0x9A56 0x5556 # <CJK>
+0x9A57 0x5557 # <CJK>
+0x9A58 0x5538 # <CJK>
+0x9A59 0x5533 # <CJK>
+0x9A5A 0x555D # <CJK>
+0x9A5B 0x5599 # <CJK>
+0x9A5C 0x5580 # <CJK>
+0x9A5D 0x54AF # <CJK>
+0x9A5E 0x558A # <CJK>
+0x9A5F 0x559F # <CJK>
+0x9A60 0x557B # <CJK>
+0x9A61 0x557E # <CJK>
+0x9A62 0x5598 # <CJK>
+0x9A63 0x559E # <CJK>
+0x9A64 0x55AE # <CJK>
+0x9A65 0x557C # <CJK>
+0x9A66 0x5583 # <CJK>
+0x9A67 0x55A9 # <CJK>
+0x9A68 0x5587 # <CJK>
+0x9A69 0x55A8 # <CJK>
+0x9A6A 0x55DA # <CJK>
+0x9A6B 0x55C5 # <CJK>
+0x9A6C 0x55DF # <CJK>
+0x9A6D 0x55C4 # <CJK>
+0x9A6E 0x55DC # <CJK>
+0x9A6F 0x55E4 # <CJK>
+0x9A70 0x55D4 # <CJK>
+0x9A71 0x5614 # <CJK>
+0x9A72 0x55F7 # <CJK>
+0x9A73 0x5616 # <CJK>
+0x9A74 0x55FE # <CJK>
+0x9A75 0x55FD # <CJK>
+0x9A76 0x561B # <CJK>
+0x9A77 0x55F9 # <CJK>
+0x9A78 0x564E # <CJK>
+0x9A79 0x5650 # <CJK>
+0x9A7A 0x71DF # <CJK>
+0x9A7B 0x5634 # <CJK>
+0x9A7C 0x5636 # <CJK>
+0x9A7D 0x5632 # <CJK>
+0x9A7E 0x5638 # <CJK>
+0x9A80 0x566B # <CJK>
+0x9A81 0x5664 # <CJK>
+0x9A82 0x562F # <CJK>
+0x9A83 0x566C # <CJK>
+0x9A84 0x566A # <CJK>
+0x9A85 0x5686 # <CJK>
+0x9A86 0x5680 # <CJK>
+0x9A87 0x568A # <CJK>
+0x9A88 0x56A0 # <CJK>
+0x9A89 0x5694 # <CJK>
+0x9A8A 0x568F # <CJK>
+0x9A8B 0x56A5 # <CJK>
+0x9A8C 0x56AE # <CJK>
+0x9A8D 0x56B6 # <CJK>
+0x9A8E 0x56B4 # <CJK>
+0x9A8F 0x56C2 # <CJK>
+0x9A90 0x56BC # <CJK>
+0x9A91 0x56C1 # <CJK>
+0x9A92 0x56C3 # <CJK>
+0x9A93 0x56C0 # <CJK>
+0x9A94 0x56C8 # <CJK>
+0x9A95 0x56CE # <CJK>
+0x9A96 0x56D1 # <CJK>
+0x9A97 0x56D3 # <CJK>
+0x9A98 0x56D7 # <CJK>
+0x9A99 0x56EE # <CJK>
+0x9A9A 0x56F9 # <CJK>
+0x9A9B 0x5700 # <CJK>
+0x9A9C 0x56FF # <CJK>
+0x9A9D 0x5704 # <CJK>
+0x9A9E 0x5709 # <CJK>
+0x9A9F 0x5708 # <CJK>
+0x9AA0 0x570B # <CJK>
+0x9AA1 0x570D # <CJK>
+0x9AA2 0x5713 # <CJK>
+0x9AA3 0x5718 # <CJK>
+0x9AA4 0x5716 # <CJK>
+0x9AA5 0x55C7 # <CJK>
+0x9AA6 0x571C # <CJK>
+0x9AA7 0x5726 # <CJK>
+0x9AA8 0x5737 # <CJK>
+0x9AA9 0x5738 # <CJK>
+0x9AAA 0x574E # <CJK>
+0x9AAB 0x573B # <CJK>
+0x9AAC 0x5740 # <CJK>
+0x9AAD 0x574F # <CJK>
+0x9AAE 0x5769 # <CJK>
+0x9AAF 0x57C0 # <CJK>
+0x9AB0 0x5788 # <CJK>
+0x9AB1 0x5761 # <CJK>
+0x9AB2 0x577F # <CJK>
+0x9AB3 0x5789 # <CJK>
+0x9AB4 0x5793 # <CJK>
+0x9AB5 0x57A0 # <CJK>
+0x9AB6 0x57B3 # <CJK>
+0x9AB7 0x57A4 # <CJK>
+0x9AB8 0x57AA # <CJK>
+0x9AB9 0x57B0 # <CJK>
+0x9ABA 0x57C3 # <CJK>
+0x9ABB 0x57C6 # <CJK>
+0x9ABC 0x57D4 # <CJK>
+0x9ABD 0x57D2 # <CJK>
+0x9ABE 0x57D3 # <CJK>
+0x9ABF 0x580A # <CJK>
+0x9AC0 0x57D6 # <CJK>
+0x9AC1 0x57E3 # <CJK>
+0x9AC2 0x580B # <CJK>
+0x9AC3 0x5819 # <CJK>
+0x9AC4 0x581D # <CJK>
+0x9AC5 0x5872 # <CJK>
+0x9AC6 0x5821 # <CJK>
+0x9AC7 0x5862 # <CJK>
+0x9AC8 0x584B # <CJK>
+0x9AC9 0x5870 # <CJK>
+0x9ACA 0x6BC0 # <CJK>
+0x9ACB 0x5852 # <CJK>
+0x9ACC 0x583D # <CJK>
+0x9ACD 0x5879 # <CJK>
+0x9ACE 0x5885 # <CJK>
+0x9ACF 0x58B9 # <CJK>
+0x9AD0 0x589F # <CJK>
+0x9AD1 0x58AB # <CJK>
+0x9AD2 0x58BA # <CJK>
+0x9AD3 0x58DE # <CJK>
+0x9AD4 0x58BB # <CJK>
+0x9AD5 0x58B8 # <CJK>
+0x9AD6 0x58AE # <CJK>
+0x9AD7 0x58C5 # <CJK>
+0x9AD8 0x58D3 # <CJK>
+0x9AD9 0x58D1 # <CJK>
+0x9ADA 0x58D7 # <CJK>
+0x9ADB 0x58D9 # <CJK>
+0x9ADC 0x58D8 # <CJK>
+0x9ADD 0x58E5 # <CJK>
+0x9ADE 0x58DC # <CJK>
+0x9ADF 0x58E4 # <CJK>
+0x9AE0 0x58DF # <CJK>
+0x9AE1 0x58EF # <CJK>
+0x9AE2 0x58FA # <CJK>
+0x9AE3 0x58F9 # <CJK>
+0x9AE4 0x58FB # <CJK>
+0x9AE5 0x58FC # <CJK>
+0x9AE6 0x58FD # <CJK>
+0x9AE7 0x5902 # <CJK>
+0x9AE8 0x590A # <CJK>
+0x9AE9 0x5910 # <CJK>
+0x9AEA 0x591B # <CJK>
+0x9AEB 0x68A6 # <CJK>
+0x9AEC 0x5925 # <CJK>
+0x9AED 0x592C # <CJK>
+0x9AEE 0x592D # <CJK>
+0x9AEF 0x5932 # <CJK>
+0x9AF0 0x5938 # <CJK>
+0x9AF1 0x593E # <CJK>
+0x9AF2 0x7AD2 # <CJK>
+0x9AF3 0x5955 # <CJK>
+0x9AF4 0x5950 # <CJK>
+0x9AF5 0x594E # <CJK>
+0x9AF6 0x595A # <CJK>
+0x9AF7 0x5958 # <CJK>
+0x9AF8 0x5962 # <CJK>
+0x9AF9 0x5960 # <CJK>
+0x9AFA 0x5967 # <CJK>
+0x9AFB 0x596C # <CJK>
+0x9AFC 0x5969 # <CJK>
+0x9B40 0x5978 # <CJK>
+0x9B41 0x5981 # <CJK>
+0x9B42 0x599D # <CJK>
+0x9B43 0x4F5E # <CJK>
+0x9B44 0x4FAB # <CJK>
+0x9B45 0x59A3 # <CJK>
+0x9B46 0x59B2 # <CJK>
+0x9B47 0x59C6 # <CJK>
+0x9B48 0x59E8 # <CJK>
+0x9B49 0x59DC # <CJK>
+0x9B4A 0x598D # <CJK>
+0x9B4B 0x59D9 # <CJK>
+0x9B4C 0x59DA # <CJK>
+0x9B4D 0x5A25 # <CJK>
+0x9B4E 0x5A1F # <CJK>
+0x9B4F 0x5A11 # <CJK>
+0x9B50 0x5A1C # <CJK>
+0x9B51 0x5A09 # <CJK>
+0x9B52 0x5A1A # <CJK>
+0x9B53 0x5A40 # <CJK>
+0x9B54 0x5A6C # <CJK>
+0x9B55 0x5A49 # <CJK>
+0x9B56 0x5A35 # <CJK>
+0x9B57 0x5A36 # <CJK>
+0x9B58 0x5A62 # <CJK>
+0x9B59 0x5A6A # <CJK>
+0x9B5A 0x5A9A # <CJK>
+0x9B5B 0x5ABC # <CJK>
+0x9B5C 0x5ABE # <CJK>
+0x9B5D 0x5ACB # <CJK>
+0x9B5E 0x5AC2 # <CJK>
+0x9B5F 0x5ABD # <CJK>
+0x9B60 0x5AE3 # <CJK>
+0x9B61 0x5AD7 # <CJK>
+0x9B62 0x5AE6 # <CJK>
+0x9B63 0x5AE9 # <CJK>
+0x9B64 0x5AD6 # <CJK>
+0x9B65 0x5AFA # <CJK>
+0x9B66 0x5AFB # <CJK>
+0x9B67 0x5B0C # <CJK>
+0x9B68 0x5B0B # <CJK>
+0x9B69 0x5B16 # <CJK>
+0x9B6A 0x5B32 # <CJK>
+0x9B6B 0x5AD0 # <CJK>
+0x9B6C 0x5B2A # <CJK>
+0x9B6D 0x5B36 # <CJK>
+0x9B6E 0x5B3E # <CJK>
+0x9B6F 0x5B43 # <CJK>
+0x9B70 0x5B45 # <CJK>
+0x9B71 0x5B40 # <CJK>
+0x9B72 0x5B51 # <CJK>
+0x9B73 0x5B55 # <CJK>
+0x9B74 0x5B5A # <CJK>
+0x9B75 0x5B5B # <CJK>
+0x9B76 0x5B65 # <CJK>
+0x9B77 0x5B69 # <CJK>
+0x9B78 0x5B70 # <CJK>
+0x9B79 0x5B73 # <CJK>
+0x9B7A 0x5B75 # <CJK>
+0x9B7B 0x5B78 # <CJK>
+0x9B7C 0x6588 # <CJK>
+0x9B7D 0x5B7A # <CJK>
+0x9B7E 0x5B80 # <CJK>
+0x9B80 0x5B83 # <CJK>
+0x9B81 0x5BA6 # <CJK>
+0x9B82 0x5BB8 # <CJK>
+0x9B83 0x5BC3 # <CJK>
+0x9B84 0x5BC7 # <CJK>
+0x9B85 0x5BC9 # <CJK>
+0x9B86 0x5BD4 # <CJK>
+0x9B87 0x5BD0 # <CJK>
+0x9B88 0x5BE4 # <CJK>
+0x9B89 0x5BE6 # <CJK>
+0x9B8A 0x5BE2 # <CJK>
+0x9B8B 0x5BDE # <CJK>
+0x9B8C 0x5BE5 # <CJK>
+0x9B8D 0x5BEB # <CJK>
+0x9B8E 0x5BF0 # <CJK>
+0x9B8F 0x5BF6 # <CJK>
+0x9B90 0x5BF3 # <CJK>
+0x9B91 0x5C05 # <CJK>
+0x9B92 0x5C07 # <CJK>
+0x9B93 0x5C08 # <CJK>
+0x9B94 0x5C0D # <CJK>
+0x9B95 0x5C13 # <CJK>
+0x9B96 0x5C20 # <CJK>
+0x9B97 0x5C22 # <CJK>
+0x9B98 0x5C28 # <CJK>
+0x9B99 0x5C38 # <CJK>
+0x9B9A 0x5C39 # <CJK>
+0x9B9B 0x5C41 # <CJK>
+0x9B9C 0x5C46 # <CJK>
+0x9B9D 0x5C4E # <CJK>
+0x9B9E 0x5C53 # <CJK>
+0x9B9F 0x5C50 # <CJK>
+0x9BA0 0x5C4F # <CJK>
+0x9BA1 0x5B71 # <CJK>
+0x9BA2 0x5C6C # <CJK>
+0x9BA3 0x5C6E # <CJK>
+0x9BA4 0x4E62 # <CJK>
+0x9BA5 0x5C76 # <CJK>
+0x9BA6 0x5C79 # <CJK>
+0x9BA7 0x5C8C # <CJK>
+0x9BA8 0x5C91 # <CJK>
+0x9BA9 0x5C94 # <CJK>
+0x9BAA 0x599B # <CJK>
+0x9BAB 0x5CAB # <CJK>
+0x9BAC 0x5CBB # <CJK>
+0x9BAD 0x5CB6 # <CJK>
+0x9BAE 0x5CBC # <CJK>
+0x9BAF 0x5CB7 # <CJK>
+0x9BB0 0x5CC5 # <CJK>
+0x9BB1 0x5CBE # <CJK>
+0x9BB2 0x5CC7 # <CJK>
+0x9BB3 0x5CD9 # <CJK>
+0x9BB4 0x5CE9 # <CJK>
+0x9BB5 0x5CFD # <CJK>
+0x9BB6 0x5CFA # <CJK>
+0x9BB7 0x5CED # <CJK>
+0x9BB8 0x5D8C # <CJK>
+0x9BB9 0x5CEA # <CJK>
+0x9BBA 0x5D0B # <CJK>
+0x9BBB 0x5D15 # <CJK>
+0x9BBC 0x5D17 # <CJK>
+0x9BBD 0x5D5C # <CJK>
+0x9BBE 0x5D1F # <CJK>
+0x9BBF 0x5D1B # <CJK>
+0x9BC0 0x5D11 # <CJK>
+0x9BC1 0x5D14 # <CJK>
+0x9BC2 0x5D22 # <CJK>
+0x9BC3 0x5D1A # <CJK>
+0x9BC4 0x5D19 # <CJK>
+0x9BC5 0x5D18 # <CJK>
+0x9BC6 0x5D4C # <CJK>
+0x9BC7 0x5D52 # <CJK>
+0x9BC8 0x5D4E # <CJK>
+0x9BC9 0x5D4B # <CJK>
+0x9BCA 0x5D6C # <CJK>
+0x9BCB 0x5D73 # <CJK>
+0x9BCC 0x5D76 # <CJK>
+0x9BCD 0x5D87 # <CJK>
+0x9BCE 0x5D84 # <CJK>
+0x9BCF 0x5D82 # <CJK>
+0x9BD0 0x5DA2 # <CJK>
+0x9BD1 0x5D9D # <CJK>
+0x9BD2 0x5DAC # <CJK>
+0x9BD3 0x5DAE # <CJK>
+0x9BD4 0x5DBD # <CJK>
+0x9BD5 0x5D90 # <CJK>
+0x9BD6 0x5DB7 # <CJK>
+0x9BD7 0x5DBC # <CJK>
+0x9BD8 0x5DC9 # <CJK>
+0x9BD9 0x5DCD # <CJK>
+0x9BDA 0x5DD3 # <CJK>
+0x9BDB 0x5DD2 # <CJK>
+0x9BDC 0x5DD6 # <CJK>
+0x9BDD 0x5DDB # <CJK>
+0x9BDE 0x5DEB # <CJK>
+0x9BDF 0x5DF2 # <CJK>
+0x9BE0 0x5DF5 # <CJK>
+0x9BE1 0x5E0B # <CJK>
+0x9BE2 0x5E1A # <CJK>
+0x9BE3 0x5E19 # <CJK>
+0x9BE4 0x5E11 # <CJK>
+0x9BE5 0x5E1B # <CJK>
+0x9BE6 0x5E36 # <CJK>
+0x9BE7 0x5E37 # <CJK>
+0x9BE8 0x5E44 # <CJK>
+0x9BE9 0x5E43 # <CJK>
+0x9BEA 0x5E40 # <CJK>
+0x9BEB 0x5E4E # <CJK>
+0x9BEC 0x5E57 # <CJK>
+0x9BED 0x5E54 # <CJK>
+0x9BEE 0x5E5F # <CJK>
+0x9BEF 0x5E62 # <CJK>
+0x9BF0 0x5E64 # <CJK>
+0x9BF1 0x5E47 # <CJK>
+0x9BF2 0x5E75 # <CJK>
+0x9BF3 0x5E76 # <CJK>
+0x9BF4 0x5E7A # <CJK>
+0x9BF5 0x9EBC # <CJK>
+0x9BF6 0x5E7F # <CJK>
+0x9BF7 0x5EA0 # <CJK>
+0x9BF8 0x5EC1 # <CJK>
+0x9BF9 0x5EC2 # <CJK>
+0x9BFA 0x5EC8 # <CJK>
+0x9BFB 0x5ED0 # <CJK>
+0x9BFC 0x5ECF # <CJK>
+0x9C40 0x5ED6 # <CJK>
+0x9C41 0x5EE3 # <CJK>
+0x9C42 0x5EDD # <CJK>
+0x9C43 0x5EDA # <CJK>
+0x9C44 0x5EDB # <CJK>
+0x9C45 0x5EE2 # <CJK>
+0x9C46 0x5EE1 # <CJK>
+0x9C47 0x5EE8 # <CJK>
+0x9C48 0x5EE9 # <CJK>
+0x9C49 0x5EEC # <CJK>
+0x9C4A 0x5EF1 # <CJK>
+0x9C4B 0x5EF3 # <CJK>
+0x9C4C 0x5EF0 # <CJK>
+0x9C4D 0x5EF4 # <CJK>
+0x9C4E 0x5EF8 # <CJK>
+0x9C4F 0x5EFE # <CJK>
+0x9C50 0x5F03 # <CJK>
+0x9C51 0x5F09 # <CJK>
+0x9C52 0x5F5D # <CJK>
+0x9C53 0x5F5C # <CJK>
+0x9C54 0x5F0B # <CJK>
+0x9C55 0x5F11 # <CJK>
+0x9C56 0x5F16 # <CJK>
+0x9C57 0x5F29 # <CJK>
+0x9C58 0x5F2D # <CJK>
+0x9C59 0x5F38 # <CJK>
+0x9C5A 0x5F41 # <CJK>
+0x9C5B 0x5F48 # <CJK>
+0x9C5C 0x5F4C # <CJK>
+0x9C5D 0x5F4E # <CJK>
+0x9C5E 0x5F2F # <CJK>
+0x9C5F 0x5F51 # <CJK>
+0x9C60 0x5F56 # <CJK>
+0x9C61 0x5F57 # <CJK>
+0x9C62 0x5F59 # <CJK>
+0x9C63 0x5F61 # <CJK>
+0x9C64 0x5F6D # <CJK>
+0x9C65 0x5F73 # <CJK>
+0x9C66 0x5F77 # <CJK>
+0x9C67 0x5F83 # <CJK>
+0x9C68 0x5F82 # <CJK>
+0x9C69 0x5F7F # <CJK>
+0x9C6A 0x5F8A # <CJK>
+0x9C6B 0x5F88 # <CJK>
+0x9C6C 0x5F91 # <CJK>
+0x9C6D 0x5F87 # <CJK>
+0x9C6E 0x5F9E # <CJK>
+0x9C6F 0x5F99 # <CJK>
+0x9C70 0x5F98 # <CJK>
+0x9C71 0x5FA0 # <CJK>
+0x9C72 0x5FA8 # <CJK>
+0x9C73 0x5FAD # <CJK>
+0x9C74 0x5FBC # <CJK>
+0x9C75 0x5FD6 # <CJK>
+0x9C76 0x5FFB # <CJK>
+0x9C77 0x5FE4 # <CJK>
+0x9C78 0x5FF8 # <CJK>
+0x9C79 0x5FF1 # <CJK>
+0x9C7A 0x5FDD # <CJK>
+0x9C7B 0x60B3 # <CJK>
+0x9C7C 0x5FFF # <CJK>
+0x9C7D 0x6021 # <CJK>
+0x9C7E 0x6060 # <CJK>
+0x9C80 0x6019 # <CJK>
+0x9C81 0x6010 # <CJK>
+0x9C82 0x6029 # <CJK>
+0x9C83 0x600E # <CJK>
+0x9C84 0x6031 # <CJK>
+0x9C85 0x601B # <CJK>
+0x9C86 0x6015 # <CJK>
+0x9C87 0x602B # <CJK>
+0x9C88 0x6026 # <CJK>
+0x9C89 0x600F # <CJK>
+0x9C8A 0x603A # <CJK>
+0x9C8B 0x605A # <CJK>
+0x9C8C 0x6041 # <CJK>
+0x9C8D 0x606A # <CJK>
+0x9C8E 0x6077 # <CJK>
+0x9C8F 0x605F # <CJK>
+0x9C90 0x604A # <CJK>
+0x9C91 0x6046 # <CJK>
+0x9C92 0x604D # <CJK>
+0x9C93 0x6063 # <CJK>
+0x9C94 0x6043 # <CJK>
+0x9C95 0x6064 # <CJK>
+0x9C96 0x6042 # <CJK>
+0x9C97 0x606C # <CJK>
+0x9C98 0x606B # <CJK>
+0x9C99 0x6059 # <CJK>
+0x9C9A 0x6081 # <CJK>
+0x9C9B 0x608D # <CJK>
+0x9C9C 0x60E7 # <CJK>
+0x9C9D 0x6083 # <CJK>
+0x9C9E 0x609A # <CJK>
+0x9C9F 0x6084 # <CJK>
+0x9CA0 0x609B # <CJK>
+0x9CA1 0x6096 # <CJK>
+0x9CA2 0x6097 # <CJK>
+0x9CA3 0x6092 # <CJK>
+0x9CA4 0x60A7 # <CJK>
+0x9CA5 0x608B # <CJK>
+0x9CA6 0x60E1 # <CJK>
+0x9CA7 0x60B8 # <CJK>
+0x9CA8 0x60E0 # <CJK>
+0x9CA9 0x60D3 # <CJK>
+0x9CAA 0x60B4 # <CJK>
+0x9CAB 0x5FF0 # <CJK>
+0x9CAC 0x60BD # <CJK>
+0x9CAD 0x60C6 # <CJK>
+0x9CAE 0x60B5 # <CJK>
+0x9CAF 0x60D8 # <CJK>
+0x9CB0 0x614D # <CJK>
+0x9CB1 0x6115 # <CJK>
+0x9CB2 0x6106 # <CJK>
+0x9CB3 0x60F6 # <CJK>
+0x9CB4 0x60F7 # <CJK>
+0x9CB5 0x6100 # <CJK>
+0x9CB6 0x60F4 # <CJK>
+0x9CB7 0x60FA # <CJK>
+0x9CB8 0x6103 # <CJK>
+0x9CB9 0x6121 # <CJK>
+0x9CBA 0x60FB # <CJK>
+0x9CBB 0x60F1 # <CJK>
+0x9CBC 0x610D # <CJK>
+0x9CBD 0x610E # <CJK>
+0x9CBE 0x6147 # <CJK>
+0x9CBF 0x613E # <CJK>
+0x9CC0 0x6128 # <CJK>
+0x9CC1 0x6127 # <CJK>
+0x9CC2 0x614A # <CJK>
+0x9CC3 0x613F # <CJK>
+0x9CC4 0x613C # <CJK>
+0x9CC5 0x612C # <CJK>
+0x9CC6 0x6134 # <CJK>
+0x9CC7 0x613D # <CJK>
+0x9CC8 0x6142 # <CJK>
+0x9CC9 0x6144 # <CJK>
+0x9CCA 0x6173 # <CJK>
+0x9CCB 0x6177 # <CJK>
+0x9CCC 0x6158 # <CJK>
+0x9CCD 0x6159 # <CJK>
+0x9CCE 0x615A # <CJK>
+0x9CCF 0x616B # <CJK>
+0x9CD0 0x6174 # <CJK>
+0x9CD1 0x616F # <CJK>
+0x9CD2 0x6165 # <CJK>
+0x9CD3 0x6171 # <CJK>
+0x9CD4 0x615F # <CJK>
+0x9CD5 0x615D # <CJK>
+0x9CD6 0x6153 # <CJK>
+0x9CD7 0x6175 # <CJK>
+0x9CD8 0x6199 # <CJK>
+0x9CD9 0x6196 # <CJK>
+0x9CDA 0x6187 # <CJK>
+0x9CDB 0x61AC # <CJK>
+0x9CDC 0x6194 # <CJK>
+0x9CDD 0x619A # <CJK>
+0x9CDE 0x618A # <CJK>
+0x9CDF 0x6191 # <CJK>
+0x9CE0 0x61AB # <CJK>
+0x9CE1 0x61AE # <CJK>
+0x9CE2 0x61CC # <CJK>
+0x9CE3 0x61CA # <CJK>
+0x9CE4 0x61C9 # <CJK>
+0x9CE5 0x61F7 # <CJK>
+0x9CE6 0x61C8 # <CJK>
+0x9CE7 0x61C3 # <CJK>
+0x9CE8 0x61C6 # <CJK>
+0x9CE9 0x61BA # <CJK>
+0x9CEA 0x61CB # <CJK>
+0x9CEB 0x7F79 # <CJK>
+0x9CEC 0x61CD # <CJK>
+0x9CED 0x61E6 # <CJK>
+0x9CEE 0x61E3 # <CJK>
+0x9CEF 0x61F6 # <CJK>
+0x9CF0 0x61FA # <CJK>
+0x9CF1 0x61F4 # <CJK>
+0x9CF2 0x61FF # <CJK>
+0x9CF3 0x61FD # <CJK>
+0x9CF4 0x61FC # <CJK>
+0x9CF5 0x61FE # <CJK>
+0x9CF6 0x6200 # <CJK>
+0x9CF7 0x6208 # <CJK>
+0x9CF8 0x6209 # <CJK>
+0x9CF9 0x620D # <CJK>
+0x9CFA 0x620C # <CJK>
+0x9CFB 0x6214 # <CJK>
+0x9CFC 0x621B # <CJK>
+0x9D40 0x621E # <CJK>
+0x9D41 0x6221 # <CJK>
+0x9D42 0x622A # <CJK>
+0x9D43 0x622E # <CJK>
+0x9D44 0x6230 # <CJK>
+0x9D45 0x6232 # <CJK>
+0x9D46 0x6233 # <CJK>
+0x9D47 0x6241 # <CJK>
+0x9D48 0x624E # <CJK>
+0x9D49 0x625E # <CJK>
+0x9D4A 0x6263 # <CJK>
+0x9D4B 0x625B # <CJK>
+0x9D4C 0x6260 # <CJK>
+0x9D4D 0x6268 # <CJK>
+0x9D4E 0x627C # <CJK>
+0x9D4F 0x6282 # <CJK>
+0x9D50 0x6289 # <CJK>
+0x9D51 0x627E # <CJK>
+0x9D52 0x6292 # <CJK>
+0x9D53 0x6293 # <CJK>
+0x9D54 0x6296 # <CJK>
+0x9D55 0x62D4 # <CJK>
+0x9D56 0x6283 # <CJK>
+0x9D57 0x6294 # <CJK>
+0x9D58 0x62D7 # <CJK>
+0x9D59 0x62D1 # <CJK>
+0x9D5A 0x62BB # <CJK>
+0x9D5B 0x62CF # <CJK>
+0x9D5C 0x62FF # <CJK>
+0x9D5D 0x62C6 # <CJK>
+0x9D5E 0x64D4 # <CJK>
+0x9D5F 0x62C8 # <CJK>
+0x9D60 0x62DC # <CJK>
+0x9D61 0x62CC # <CJK>
+0x9D62 0x62CA # <CJK>
+0x9D63 0x62C2 # <CJK>
+0x9D64 0x62C7 # <CJK>
+0x9D65 0x629B # <CJK>
+0x9D66 0x62C9 # <CJK>
+0x9D67 0x630C # <CJK>
+0x9D68 0x62EE # <CJK>
+0x9D69 0x62F1 # <CJK>
+0x9D6A 0x6327 # <CJK>
+0x9D6B 0x6302 # <CJK>
+0x9D6C 0x6308 # <CJK>
+0x9D6D 0x62EF # <CJK>
+0x9D6E 0x62F5 # <CJK>
+0x9D6F 0x6350 # <CJK>
+0x9D70 0x633E # <CJK>
+0x9D71 0x634D # <CJK>
+0x9D72 0x641C # <CJK>
+0x9D73 0x634F # <CJK>
+0x9D74 0x6396 # <CJK>
+0x9D75 0x638E # <CJK>
+0x9D76 0x6380 # <CJK>
+0x9D77 0x63AB # <CJK>
+0x9D78 0x6376 # <CJK>
+0x9D79 0x63A3 # <CJK>
+0x9D7A 0x638F # <CJK>
+0x9D7B 0x6389 # <CJK>
+0x9D7C 0x639F # <CJK>
+0x9D7D 0x63B5 # <CJK>
+0x9D7E 0x636B # <CJK>
+0x9D80 0x6369 # <CJK>
+0x9D81 0x63BE # <CJK>
+0x9D82 0x63E9 # <CJK>
+0x9D83 0x63C0 # <CJK>
+0x9D84 0x63C6 # <CJK>
+0x9D85 0x63E3 # <CJK>
+0x9D86 0x63C9 # <CJK>
+0x9D87 0x63D2 # <CJK>
+0x9D88 0x63F6 # <CJK>
+0x9D89 0x63C4 # <CJK>
+0x9D8A 0x6416 # <CJK>
+0x9D8B 0x6434 # <CJK>
+0x9D8C 0x6406 # <CJK>
+0x9D8D 0x6413 # <CJK>
+0x9D8E 0x6426 # <CJK>
+0x9D8F 0x6436 # <CJK>
+0x9D90 0x651D # <CJK>
+0x9D91 0x6417 # <CJK>
+0x9D92 0x6428 # <CJK>
+0x9D93 0x640F # <CJK>
+0x9D94 0x6467 # <CJK>
+0x9D95 0x646F # <CJK>
+0x9D96 0x6476 # <CJK>
+0x9D97 0x644E # <CJK>
+0x9D98 0x652A # <CJK>
+0x9D99 0x6495 # <CJK>
+0x9D9A 0x6493 # <CJK>
+0x9D9B 0x64A5 # <CJK>
+0x9D9C 0x64A9 # <CJK>
+0x9D9D 0x6488 # <CJK>
+0x9D9E 0x64BC # <CJK>
+0x9D9F 0x64DA # <CJK>
+0x9DA0 0x64D2 # <CJK>
+0x9DA1 0x64C5 # <CJK>
+0x9DA2 0x64C7 # <CJK>
+0x9DA3 0x64BB # <CJK>
+0x9DA4 0x64D8 # <CJK>
+0x9DA5 0x64C2 # <CJK>
+0x9DA6 0x64F1 # <CJK>
+0x9DA7 0x64E7 # <CJK>
+0x9DA8 0x8209 # <CJK>
+0x9DA9 0x64E0 # <CJK>
+0x9DAA 0x64E1 # <CJK>
+0x9DAB 0x62AC # <CJK>
+0x9DAC 0x64E3 # <CJK>
+0x9DAD 0x64EF # <CJK>
+0x9DAE 0x652C # <CJK>
+0x9DAF 0x64F6 # <CJK>
+0x9DB0 0x64F4 # <CJK>
+0x9DB1 0x64F2 # <CJK>
+0x9DB2 0x64FA # <CJK>
+0x9DB3 0x6500 # <CJK>
+0x9DB4 0x64FD # <CJK>
+0x9DB5 0x6518 # <CJK>
+0x9DB6 0x651C # <CJK>
+0x9DB7 0x6505 # <CJK>
+0x9DB8 0x6524 # <CJK>
+0x9DB9 0x6523 # <CJK>
+0x9DBA 0x652B # <CJK>
+0x9DBB 0x6534 # <CJK>
+0x9DBC 0x6535 # <CJK>
+0x9DBD 0x6537 # <CJK>
+0x9DBE 0x6536 # <CJK>
+0x9DBF 0x6538 # <CJK>
+0x9DC0 0x754B # <CJK>
+0x9DC1 0x6548 # <CJK>
+0x9DC2 0x6556 # <CJK>
+0x9DC3 0x6555 # <CJK>
+0x9DC4 0x654D # <CJK>
+0x9DC5 0x6558 # <CJK>
+0x9DC6 0x655E # <CJK>
+0x9DC7 0x655D # <CJK>
+0x9DC8 0x6572 # <CJK>
+0x9DC9 0x6578 # <CJK>
+0x9DCA 0x6582 # <CJK>
+0x9DCB 0x6583 # <CJK>
+0x9DCC 0x8B8A # <CJK>
+0x9DCD 0x659B # <CJK>
+0x9DCE 0x659F # <CJK>
+0x9DCF 0x65AB # <CJK>
+0x9DD0 0x65B7 # <CJK>
+0x9DD1 0x65C3 # <CJK>
+0x9DD2 0x65C6 # <CJK>
+0x9DD3 0x65C1 # <CJK>
+0x9DD4 0x65C4 # <CJK>
+0x9DD5 0x65CC # <CJK>
+0x9DD6 0x65D2 # <CJK>
+0x9DD7 0x65DB # <CJK>
+0x9DD8 0x65D9 # <CJK>
+0x9DD9 0x65E0 # <CJK>
+0x9DDA 0x65E1 # <CJK>
+0x9DDB 0x65F1 # <CJK>
+0x9DDC 0x6772 # <CJK>
+0x9DDD 0x660A # <CJK>
+0x9DDE 0x6603 # <CJK>
+0x9DDF 0x65FB # <CJK>
+0x9DE0 0x6773 # <CJK>
+0x9DE1 0x6635 # <CJK>
+0x9DE2 0x6636 # <CJK>
+0x9DE3 0x6634 # <CJK>
+0x9DE4 0x661C # <CJK>
+0x9DE5 0x664F # <CJK>
+0x9DE6 0x6644 # <CJK>
+0x9DE7 0x6649 # <CJK>
+0x9DE8 0x6641 # <CJK>
+0x9DE9 0x665E # <CJK>
+0x9DEA 0x665D # <CJK>
+0x9DEB 0x6664 # <CJK>
+0x9DEC 0x6667 # <CJK>
+0x9DED 0x6668 # <CJK>
+0x9DEE 0x665F # <CJK>
+0x9DEF 0x6662 # <CJK>
+0x9DF0 0x6670 # <CJK>
+0x9DF1 0x6683 # <CJK>
+0x9DF2 0x6688 # <CJK>
+0x9DF3 0x668E # <CJK>
+0x9DF4 0x6689 # <CJK>
+0x9DF5 0x6684 # <CJK>
+0x9DF6 0x6698 # <CJK>
+0x9DF7 0x669D # <CJK>
+0x9DF8 0x66C1 # <CJK>
+0x9DF9 0x66B9 # <CJK>
+0x9DFA 0x66C9 # <CJK>
+0x9DFB 0x66BE # <CJK>
+0x9DFC 0x66BC # <CJK>
+0x9E40 0x66C4 # <CJK>
+0x9E41 0x66B8 # <CJK>
+0x9E42 0x66D6 # <CJK>
+0x9E43 0x66DA # <CJK>
+0x9E44 0x66E0 # <CJK>
+0x9E45 0x663F # <CJK>
+0x9E46 0x66E6 # <CJK>
+0x9E47 0x66E9 # <CJK>
+0x9E48 0x66F0 # <CJK>
+0x9E49 0x66F5 # <CJK>
+0x9E4A 0x66F7 # <CJK>
+0x9E4B 0x670F # <CJK>
+0x9E4C 0x6716 # <CJK>
+0x9E4D 0x671E # <CJK>
+0x9E4E 0x6726 # <CJK>
+0x9E4F 0x6727 # <CJK>
+0x9E50 0x9738 # <CJK>
+0x9E51 0x672E # <CJK>
+0x9E52 0x673F # <CJK>
+0x9E53 0x6736 # <CJK>
+0x9E54 0x6741 # <CJK>
+0x9E55 0x6738 # <CJK>
+0x9E56 0x6737 # <CJK>
+0x9E57 0x6746 # <CJK>
+0x9E58 0x675E # <CJK>
+0x9E59 0x6760 # <CJK>
+0x9E5A 0x6759 # <CJK>
+0x9E5B 0x6763 # <CJK>
+0x9E5C 0x6764 # <CJK>
+0x9E5D 0x6789 # <CJK>
+0x9E5E 0x6770 # <CJK>
+0x9E5F 0x67A9 # <CJK>
+0x9E60 0x677C # <CJK>
+0x9E61 0x676A # <CJK>
+0x9E62 0x678C # <CJK>
+0x9E63 0x678B # <CJK>
+0x9E64 0x67A6 # <CJK>
+0x9E65 0x67A1 # <CJK>
+0x9E66 0x6785 # <CJK>
+0x9E67 0x67B7 # <CJK>
+0x9E68 0x67EF # <CJK>
+0x9E69 0x67B4 # <CJK>
+0x9E6A 0x67EC # <CJK>
+0x9E6B 0x67B3 # <CJK>
+0x9E6C 0x67E9 # <CJK>
+0x9E6D 0x67B8 # <CJK>
+0x9E6E 0x67E4 # <CJK>
+0x9E6F 0x67DE # <CJK>
+0x9E70 0x67DD # <CJK>
+0x9E71 0x67E2 # <CJK>
+0x9E72 0x67EE # <CJK>
+0x9E73 0x67B9 # <CJK>
+0x9E74 0x67CE # <CJK>
+0x9E75 0x67C6 # <CJK>
+0x9E76 0x67E7 # <CJK>
+0x9E77 0x6A9C # <CJK>
+0x9E78 0x681E # <CJK>
+0x9E79 0x6846 # <CJK>
+0x9E7A 0x6829 # <CJK>
+0x9E7B 0x6840 # <CJK>
+0x9E7C 0x684D # <CJK>
+0x9E7D 0x6832 # <CJK>
+0x9E7E 0x684E # <CJK>
+0x9E80 0x68B3 # <CJK>
+0x9E81 0x682B # <CJK>
+0x9E82 0x6859 # <CJK>
+0x9E83 0x6863 # <CJK>
+0x9E84 0x6877 # <CJK>
+0x9E85 0x687F # <CJK>
+0x9E86 0x689F # <CJK>
+0x9E87 0x688F # <CJK>
+0x9E88 0x68AD # <CJK>
+0x9E89 0x6894 # <CJK>
+0x9E8A 0x689D # <CJK>
+0x9E8B 0x689B # <CJK>
+0x9E8C 0x6883 # <CJK>
+0x9E8D 0x6AAE # <CJK>
+0x9E8E 0x68B9 # <CJK>
+0x9E8F 0x6874 # <CJK>
+0x9E90 0x68B5 # <CJK>
+0x9E91 0x68A0 # <CJK>
+0x9E92 0x68BA # <CJK>
+0x9E93 0x690F # <CJK>
+0x9E94 0x688D # <CJK>
+0x9E95 0x687E # <CJK>
+0x9E96 0x6901 # <CJK>
+0x9E97 0x68CA # <CJK>
+0x9E98 0x6908 # <CJK>
+0x9E99 0x68D8 # <CJK>
+0x9E9A 0x6922 # <CJK>
+0x9E9B 0x6926 # <CJK>
+0x9E9C 0x68E1 # <CJK>
+0x9E9D 0x690C # <CJK>
+0x9E9E 0x68CD # <CJK>
+0x9E9F 0x68D4 # <CJK>
+0x9EA0 0x68E7 # <CJK>
+0x9EA1 0x68D5 # <CJK>
+0x9EA2 0x6936 # <CJK>
+0x9EA3 0x6912 # <CJK>
+0x9EA4 0x6904 # <CJK>
+0x9EA5 0x68D7 # <CJK>
+0x9EA6 0x68E3 # <CJK>
+0x9EA7 0x6925 # <CJK>
+0x9EA8 0x68F9 # <CJK>
+0x9EA9 0x68E0 # <CJK>
+0x9EAA 0x68EF # <CJK>
+0x9EAB 0x6928 # <CJK>
+0x9EAC 0x692A # <CJK>
+0x9EAD 0x691A # <CJK>
+0x9EAE 0x6923 # <CJK>
+0x9EAF 0x6921 # <CJK>
+0x9EB0 0x68C6 # <CJK>
+0x9EB1 0x6979 # <CJK>
+0x9EB2 0x6977 # <CJK>
+0x9EB3 0x695C # <CJK>
+0x9EB4 0x6978 # <CJK>
+0x9EB5 0x696B # <CJK>
+0x9EB6 0x6954 # <CJK>
+0x9EB7 0x697E # <CJK>
+0x9EB8 0x696E # <CJK>
+0x9EB9 0x6939 # <CJK>
+0x9EBA 0x6974 # <CJK>
+0x9EBB 0x693D # <CJK>
+0x9EBC 0x6959 # <CJK>
+0x9EBD 0x6930 # <CJK>
+0x9EBE 0x6961 # <CJK>
+0x9EBF 0x695E # <CJK>
+0x9EC0 0x695D # <CJK>
+0x9EC1 0x6981 # <CJK>
+0x9EC2 0x696A # <CJK>
+0x9EC3 0x69B2 # <CJK>
+0x9EC4 0x69AE # <CJK>
+0x9EC5 0x69D0 # <CJK>
+0x9EC6 0x69BF # <CJK>
+0x9EC7 0x69C1 # <CJK>
+0x9EC8 0x69D3 # <CJK>
+0x9EC9 0x69BE # <CJK>
+0x9ECA 0x69CE # <CJK>
+0x9ECB 0x5BE8 # <CJK>
+0x9ECC 0x69CA # <CJK>
+0x9ECD 0x69DD # <CJK>
+0x9ECE 0x69BB # <CJK>
+0x9ECF 0x69C3 # <CJK>
+0x9ED0 0x69A7 # <CJK>
+0x9ED1 0x6A2E # <CJK>
+0x9ED2 0x6991 # <CJK>
+0x9ED3 0x69A0 # <CJK>
+0x9ED4 0x699C # <CJK>
+0x9ED5 0x6995 # <CJK>
+0x9ED6 0x69B4 # <CJK>
+0x9ED7 0x69DE # <CJK>
+0x9ED8 0x69E8 # <CJK>
+0x9ED9 0x6A02 # <CJK>
+0x9EDA 0x6A1B # <CJK>
+0x9EDB 0x69FF # <CJK>
+0x9EDC 0x6B0A # <CJK>
+0x9EDD 0x69F9 # <CJK>
+0x9EDE 0x69F2 # <CJK>
+0x9EDF 0x69E7 # <CJK>
+0x9EE0 0x6A05 # <CJK>
+0x9EE1 0x69B1 # <CJK>
+0x9EE2 0x6A1E # <CJK>
+0x9EE3 0x69ED # <CJK>
+0x9EE4 0x6A14 # <CJK>
+0x9EE5 0x69EB # <CJK>
+0x9EE6 0x6A0A # <CJK>
+0x9EE7 0x6A12 # <CJK>
+0x9EE8 0x6AC1 # <CJK>
+0x9EE9 0x6A23 # <CJK>
+0x9EEA 0x6A13 # <CJK>
+0x9EEB 0x6A44 # <CJK>
+0x9EEC 0x6A0C # <CJK>
+0x9EED 0x6A72 # <CJK>
+0x9EEE 0x6A36 # <CJK>
+0x9EEF 0x6A78 # <CJK>
+0x9EF0 0x6A47 # <CJK>
+0x9EF1 0x6A62 # <CJK>
+0x9EF2 0x6A59 # <CJK>
+0x9EF3 0x6A66 # <CJK>
+0x9EF4 0x6A48 # <CJK>
+0x9EF5 0x6A38 # <CJK>
+0x9EF6 0x6A22 # <CJK>
+0x9EF7 0x6A90 # <CJK>
+0x9EF8 0x6A8D # <CJK>
+0x9EF9 0x6AA0 # <CJK>
+0x9EFA 0x6A84 # <CJK>
+0x9EFB 0x6AA2 # <CJK>
+0x9EFC 0x6AA3 # <CJK>
+0x9F40 0x6A97 # <CJK>
+0x9F41 0x8617 # <CJK>
+0x9F42 0x6ABB # <CJK>
+0x9F43 0x6AC3 # <CJK>
+0x9F44 0x6AC2 # <CJK>
+0x9F45 0x6AB8 # <CJK>
+0x9F46 0x6AB3 # <CJK>
+0x9F47 0x6AAC # <CJK>
+0x9F48 0x6ADE # <CJK>
+0x9F49 0x6AD1 # <CJK>
+0x9F4A 0x6ADF # <CJK>
+0x9F4B 0x6AAA # <CJK>
+0x9F4C 0x6ADA # <CJK>
+0x9F4D 0x6AEA # <CJK>
+0x9F4E 0x6AFB # <CJK>
+0x9F4F 0x6B05 # <CJK>
+0x9F50 0x8616 # <CJK>
+0x9F51 0x6AFA # <CJK>
+0x9F52 0x6B12 # <CJK>
+0x9F53 0x6B16 # <CJK>
+0x9F54 0x9B31 # <CJK>
+0x9F55 0x6B1F # <CJK>
+0x9F56 0x6B38 # <CJK>
+0x9F57 0x6B37 # <CJK>
+0x9F58 0x76DC # <CJK>
+0x9F59 0x6B39 # <CJK>
+0x9F5A 0x98EE # <CJK>
+0x9F5B 0x6B47 # <CJK>
+0x9F5C 0x6B43 # <CJK>
+0x9F5D 0x6B49 # <CJK>
+0x9F5E 0x6B50 # <CJK>
+0x9F5F 0x6B59 # <CJK>
+0x9F60 0x6B54 # <CJK>
+0x9F61 0x6B5B # <CJK>
+0x9F62 0x6B5F # <CJK>
+0x9F63 0x6B61 # <CJK>
+0x9F64 0x6B78 # <CJK>
+0x9F65 0x6B79 # <CJK>
+0x9F66 0x6B7F # <CJK>
+0x9F67 0x6B80 # <CJK>
+0x9F68 0x6B84 # <CJK>
+0x9F69 0x6B83 # <CJK>
+0x9F6A 0x6B8D # <CJK>
+0x9F6B 0x6B98 # <CJK>
+0x9F6C 0x6B95 # <CJK>
+0x9F6D 0x6B9E # <CJK>
+0x9F6E 0x6BA4 # <CJK>
+0x9F6F 0x6BAA # <CJK>
+0x9F70 0x6BAB # <CJK>
+0x9F71 0x6BAF # <CJK>
+0x9F72 0x6BB2 # <CJK>
+0x9F73 0x6BB1 # <CJK>
+0x9F74 0x6BB3 # <CJK>
+0x9F75 0x6BB7 # <CJK>
+0x9F76 0x6BBC # <CJK>
+0x9F77 0x6BC6 # <CJK>
+0x9F78 0x6BCB # <CJK>
+0x9F79 0x6BD3 # <CJK>
+0x9F7A 0x6BDF # <CJK>
+0x9F7B 0x6BEC # <CJK>
+0x9F7C 0x6BEB # <CJK>
+0x9F7D 0x6BF3 # <CJK>
+0x9F7E 0x6BEF # <CJK>
+0x9F80 0x9EBE # <CJK>
+0x9F81 0x6C08 # <CJK>
+0x9F82 0x6C13 # <CJK>
+0x9F83 0x6C14 # <CJK>
+0x9F84 0x6C1B # <CJK>
+0x9F85 0x6C24 # <CJK>
+0x9F86 0x6C23 # <CJK>
+0x9F87 0x6C5E # <CJK>
+0x9F88 0x6C55 # <CJK>
+0x9F89 0x6C62 # <CJK>
+0x9F8A 0x6C6A # <CJK>
+0x9F8B 0x6C82 # <CJK>
+0x9F8C 0x6C8D # <CJK>
+0x9F8D 0x6C9A # <CJK>
+0x9F8E 0x6C81 # <CJK>
+0x9F8F 0x6C9B # <CJK>
+0x9F90 0x6C7E # <CJK>
+0x9F91 0x6C68 # <CJK>
+0x9F92 0x6C73 # <CJK>
+0x9F93 0x6C92 # <CJK>
+0x9F94 0x6C90 # <CJK>
+0x9F95 0x6CC4 # <CJK>
+0x9F96 0x6CF1 # <CJK>
+0x9F97 0x6CD3 # <CJK>
+0x9F98 0x6CBD # <CJK>
+0x9F99 0x6CD7 # <CJK>
+0x9F9A 0x6CC5 # <CJK>
+0x9F9B 0x6CDD # <CJK>
+0x9F9C 0x6CAE # <CJK>
+0x9F9D 0x6CB1 # <CJK>
+0x9F9E 0x6CBE # <CJK>
+0x9F9F 0x6CBA # <CJK>
+0x9FA0 0x6CDB # <CJK>
+0x9FA1 0x6CEF # <CJK>
+0x9FA2 0x6CD9 # <CJK>
+0x9FA3 0x6CEA # <CJK>
+0x9FA4 0x6D1F # <CJK>
+0x9FA5 0x884D # <CJK>
+0x9FA6 0x6D36 # <CJK>
+0x9FA7 0x6D2B # <CJK>
+0x9FA8 0x6D3D # <CJK>
+0x9FA9 0x6D38 # <CJK>
+0x9FAA 0x6D19 # <CJK>
+0x9FAB 0x6D35 # <CJK>
+0x9FAC 0x6D33 # <CJK>
+0x9FAD 0x6D12 # <CJK>
+0x9FAE 0x6D0C # <CJK>
+0x9FAF 0x6D63 # <CJK>
+0x9FB0 0x6D93 # <CJK>
+0x9FB1 0x6D64 # <CJK>
+0x9FB2 0x6D5A # <CJK>
+0x9FB3 0x6D79 # <CJK>
+0x9FB4 0x6D59 # <CJK>
+0x9FB5 0x6D8E # <CJK>
+0x9FB6 0x6D95 # <CJK>
+0x9FB7 0x6FE4 # <CJK>
+0x9FB8 0x6D85 # <CJK>
+0x9FB9 0x6DF9 # <CJK>
+0x9FBA 0x6E15 # <CJK>
+0x9FBB 0x6E0A # <CJK>
+0x9FBC 0x6DB5 # <CJK>
+0x9FBD 0x6DC7 # <CJK>
+0x9FBE 0x6DE6 # <CJK>
+0x9FBF 0x6DB8 # <CJK>
+0x9FC0 0x6DC6 # <CJK>
+0x9FC1 0x6DEC # <CJK>
+0x9FC2 0x6DDE # <CJK>
+0x9FC3 0x6DCC # <CJK>
+0x9FC4 0x6DE8 # <CJK>
+0x9FC5 0x6DD2 # <CJK>
+0x9FC6 0x6DC5 # <CJK>
+0x9FC7 0x6DFA # <CJK>
+0x9FC8 0x6DD9 # <CJK>
+0x9FC9 0x6DE4 # <CJK>
+0x9FCA 0x6DD5 # <CJK>
+0x9FCB 0x6DEA # <CJK>
+0x9FCC 0x6DEE # <CJK>
+0x9FCD 0x6E2D # <CJK>
+0x9FCE 0x6E6E # <CJK>
+0x9FCF 0x6E2E # <CJK>
+0x9FD0 0x6E19 # <CJK>
+0x9FD1 0x6E72 # <CJK>
+0x9FD2 0x6E5F # <CJK>
+0x9FD3 0x6E3E # <CJK>
+0x9FD4 0x6E23 # <CJK>
+0x9FD5 0x6E6B # <CJK>
+0x9FD6 0x6E2B # <CJK>
+0x9FD7 0x6E76 # <CJK>
+0x9FD8 0x6E4D # <CJK>
+0x9FD9 0x6E1F # <CJK>
+0x9FDA 0x6E43 # <CJK>
+0x9FDB 0x6E3A # <CJK>
+0x9FDC 0x6E4E # <CJK>
+0x9FDD 0x6E24 # <CJK>
+0x9FDE 0x6EFF # <CJK>
+0x9FDF 0x6E1D # <CJK>
+0x9FE0 0x6E38 # <CJK>
+0x9FE1 0x6E82 # <CJK>
+0x9FE2 0x6EAA # <CJK>
+0x9FE3 0x6E98 # <CJK>
+0x9FE4 0x6EC9 # <CJK>
+0x9FE5 0x6EB7 # <CJK>
+0x9FE6 0x6ED3 # <CJK>
+0x9FE7 0x6EBD # <CJK>
+0x9FE8 0x6EAF # <CJK>
+0x9FE9 0x6EC4 # <CJK>
+0x9FEA 0x6EB2 # <CJK>
+0x9FEB 0x6ED4 # <CJK>
+0x9FEC 0x6ED5 # <CJK>
+0x9FED 0x6E8F # <CJK>
+0x9FEE 0x6EA5 # <CJK>
+0x9FEF 0x6EC2 # <CJK>
+0x9FF0 0x6E9F # <CJK>
+0x9FF1 0x6F41 # <CJK>
+0x9FF2 0x6F11 # <CJK>
+0x9FF3 0x704C # <CJK>
+0x9FF4 0x6EEC # <CJK>
+0x9FF5 0x6EF8 # <CJK>
+0x9FF6 0x6EFE # <CJK>
+0x9FF7 0x6F3F # <CJK>
+0x9FF8 0x6EF2 # <CJK>
+0x9FF9 0x6F31 # <CJK>
+0x9FFA 0x6EEF # <CJK>
+0x9FFB 0x6F32 # <CJK>
+0x9FFC 0x6ECC # <CJK>
+0xA1 0xFF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 0xFF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 0xFF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 0xFF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 0xFF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 0xFF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 0xFF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 0xFF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA 0xFF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB 0xFF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC 0xFF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD 0xFF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE 0xFF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF 0xFF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 0xFF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 0xFF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 0xFF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 0xFF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 0xFF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 0xFF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 0xFF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 0xFF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 0xFF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 0xFF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA 0xFF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB 0xFF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC 0xFF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD 0xFF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE 0xFF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF 0xFF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 0xFF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 0xFF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 0xFF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 0xFF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 0xFF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 0xFF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 0xFF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 0xFF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 0xFF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 0xFF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA 0xFF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB 0xFF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC 0xFF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD 0xFF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE 0xFF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF 0xFF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 0xFF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 0xFF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 0xFF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 0xFF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 0xFF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 0xFF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 0xFF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 0xFF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 0xFF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 0xFF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA 0xFF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB 0xFF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC 0xFF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD 0xFF9D # HALFWIDTH KATAKANA LETTER N
+0xDE 0xFF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF 0xFF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE040 0x6F3E # <CJK>
+0xE041 0x6F13 # <CJK>
+0xE042 0x6EF7 # <CJK>
+0xE043 0x6F86 # <CJK>
+0xE044 0x6F7A # <CJK>
+0xE045 0x6F78 # <CJK>
+0xE046 0x6F81 # <CJK>
+0xE047 0x6F80 # <CJK>
+0xE048 0x6F6F # <CJK>
+0xE049 0x6F5B # <CJK>
+0xE04A 0x6FF3 # <CJK>
+0xE04B 0x6F6D # <CJK>
+0xE04C 0x6F82 # <CJK>
+0xE04D 0x6F7C # <CJK>
+0xE04E 0x6F58 # <CJK>
+0xE04F 0x6F8E # <CJK>
+0xE050 0x6F91 # <CJK>
+0xE051 0x6FC2 # <CJK>
+0xE052 0x6F66 # <CJK>
+0xE053 0x6FB3 # <CJK>
+0xE054 0x6FA3 # <CJK>
+0xE055 0x6FA1 # <CJK>
+0xE056 0x6FA4 # <CJK>
+0xE057 0x6FB9 # <CJK>
+0xE058 0x6FC6 # <CJK>
+0xE059 0x6FAA # <CJK>
+0xE05A 0x6FDF # <CJK>
+0xE05B 0x6FD5 # <CJK>
+0xE05C 0x6FEC # <CJK>
+0xE05D 0x6FD4 # <CJK>
+0xE05E 0x6FD8 # <CJK>
+0xE05F 0x6FF1 # <CJK>
+0xE060 0x6FEE # <CJK>
+0xE061 0x6FDB # <CJK>
+0xE062 0x7009 # <CJK>
+0xE063 0x700B # <CJK>
+0xE064 0x6FFA # <CJK>
+0xE065 0x7011 # <CJK>
+0xE066 0x7001 # <CJK>
+0xE067 0x700F # <CJK>
+0xE068 0x6FFE # <CJK>
+0xE069 0x701B # <CJK>
+0xE06A 0x701A # <CJK>
+0xE06B 0x6F74 # <CJK>
+0xE06C 0x701D # <CJK>
+0xE06D 0x7018 # <CJK>
+0xE06E 0x701F # <CJK>
+0xE06F 0x7030 # <CJK>
+0xE070 0x703E # <CJK>
+0xE071 0x7032 # <CJK>
+0xE072 0x7051 # <CJK>
+0xE073 0x7063 # <CJK>
+0xE074 0x7099 # <CJK>
+0xE075 0x7092 # <CJK>
+0xE076 0x70AF # <CJK>
+0xE077 0x70F1 # <CJK>
+0xE078 0x70AC # <CJK>
+0xE079 0x70B8 # <CJK>
+0xE07A 0x70B3 # <CJK>
+0xE07B 0x70AE # <CJK>
+0xE07C 0x70DF # <CJK>
+0xE07D 0x70CB # <CJK>
+0xE07E 0x70DD # <CJK>
+0xE080 0x70D9 # <CJK>
+0xE081 0x7109 # <CJK>
+0xE082 0x70FD # <CJK>
+0xE083 0x711C # <CJK>
+0xE084 0x7119 # <CJK>
+0xE085 0x7165 # <CJK>
+0xE086 0x7155 # <CJK>
+0xE087 0x7188 # <CJK>
+0xE088 0x7166 # <CJK>
+0xE089 0x7162 # <CJK>
+0xE08A 0x714C # <CJK>
+0xE08B 0x7156 # <CJK>
+0xE08C 0x716C # <CJK>
+0xE08D 0x718F # <CJK>
+0xE08E 0x71FB # <CJK>
+0xE08F 0x7184 # <CJK>
+0xE090 0x7195 # <CJK>
+0xE091 0x71A8 # <CJK>
+0xE092 0x71AC # <CJK>
+0xE093 0x71D7 # <CJK>
+0xE094 0x71B9 # <CJK>
+0xE095 0x71BE # <CJK>
+0xE096 0x71D2 # <CJK>
+0xE097 0x71C9 # <CJK>
+0xE098 0x71D4 # <CJK>
+0xE099 0x71CE # <CJK>
+0xE09A 0x71E0 # <CJK>
+0xE09B 0x71EC # <CJK>
+0xE09C 0x71E7 # <CJK>
+0xE09D 0x71F5 # <CJK>
+0xE09E 0x71FC # <CJK>
+0xE09F 0x71F9 # <CJK>
+0xE0A0 0x71FF # <CJK>
+0xE0A1 0x720D # <CJK>
+0xE0A2 0x7210 # <CJK>
+0xE0A3 0x721B # <CJK>
+0xE0A4 0x7228 # <CJK>
+0xE0A5 0x722D # <CJK>
+0xE0A6 0x722C # <CJK>
+0xE0A7 0x7230 # <CJK>
+0xE0A8 0x7232 # <CJK>
+0xE0A9 0x723B # <CJK>
+0xE0AA 0x723C # <CJK>
+0xE0AB 0x723F # <CJK>
+0xE0AC 0x7240 # <CJK>
+0xE0AD 0x7246 # <CJK>
+0xE0AE 0x724B # <CJK>
+0xE0AF 0x7258 # <CJK>
+0xE0B0 0x7274 # <CJK>
+0xE0B1 0x727E # <CJK>
+0xE0B2 0x7282 # <CJK>
+0xE0B3 0x7281 # <CJK>
+0xE0B4 0x7287 # <CJK>
+0xE0B5 0x7292 # <CJK>
+0xE0B6 0x7296 # <CJK>
+0xE0B7 0x72A2 # <CJK>
+0xE0B8 0x72A7 # <CJK>
+0xE0B9 0x72B9 # <CJK>
+0xE0BA 0x72B2 # <CJK>
+0xE0BB 0x72C3 # <CJK>
+0xE0BC 0x72C6 # <CJK>
+0xE0BD 0x72C4 # <CJK>
+0xE0BE 0x72CE # <CJK>
+0xE0BF 0x72D2 # <CJK>
+0xE0C0 0x72E2 # <CJK>
+0xE0C1 0x72E0 # <CJK>
+0xE0C2 0x72E1 # <CJK>
+0xE0C3 0x72F9 # <CJK>
+0xE0C4 0x72F7 # <CJK>
+0xE0C5 0x500F # <CJK>
+0xE0C6 0x7317 # <CJK>
+0xE0C7 0x730A # <CJK>
+0xE0C8 0x731C # <CJK>
+0xE0C9 0x7316 # <CJK>
+0xE0CA 0x731D # <CJK>
+0xE0CB 0x7334 # <CJK>
+0xE0CC 0x732F # <CJK>
+0xE0CD 0x7329 # <CJK>
+0xE0CE 0x7325 # <CJK>
+0xE0CF 0x733E # <CJK>
+0xE0D0 0x734E # <CJK>
+0xE0D1 0x734F # <CJK>
+0xE0D2 0x9ED8 # <CJK>
+0xE0D3 0x7357 # <CJK>
+0xE0D4 0x736A # <CJK>
+0xE0D5 0x7368 # <CJK>
+0xE0D6 0x7370 # <CJK>
+0xE0D7 0x7378 # <CJK>
+0xE0D8 0x7375 # <CJK>
+0xE0D9 0x737B # <CJK>
+0xE0DA 0x737A # <CJK>
+0xE0DB 0x73C8 # <CJK>
+0xE0DC 0x73B3 # <CJK>
+0xE0DD 0x73CE # <CJK>
+0xE0DE 0x73BB # <CJK>
+0xE0DF 0x73C0 # <CJK>
+0xE0E0 0x73E5 # <CJK>
+0xE0E1 0x73EE # <CJK>
+0xE0E2 0x73DE # <CJK>
+0xE0E3 0x74A2 # <CJK>
+0xE0E4 0x7405 # <CJK>
+0xE0E5 0x746F # <CJK>
+0xE0E6 0x7425 # <CJK>
+0xE0E7 0x73F8 # <CJK>
+0xE0E8 0x7432 # <CJK>
+0xE0E9 0x743A # <CJK>
+0xE0EA 0x7455 # <CJK>
+0xE0EB 0x743F # <CJK>
+0xE0EC 0x745F # <CJK>
+0xE0ED 0x7459 # <CJK>
+0xE0EE 0x7441 # <CJK>
+0xE0EF 0x745C # <CJK>
+0xE0F0 0x7469 # <CJK>
+0xE0F1 0x7470 # <CJK>
+0xE0F2 0x7463 # <CJK>
+0xE0F3 0x746A # <CJK>
+0xE0F4 0x7476 # <CJK>
+0xE0F5 0x747E # <CJK>
+0xE0F6 0x748B # <CJK>
+0xE0F7 0x749E # <CJK>
+0xE0F8 0x74A7 # <CJK>
+0xE0F9 0x74CA # <CJK>
+0xE0FA 0x74CF # <CJK>
+0xE0FB 0x74D4 # <CJK>
+0xE0FC 0x73F1 # <CJK>
+0xE140 0x74E0 # <CJK>
+0xE141 0x74E3 # <CJK>
+0xE142 0x74E7 # <CJK>
+0xE143 0x74E9 # <CJK>
+0xE144 0x74EE # <CJK>
+0xE145 0x74F2 # <CJK>
+0xE146 0x74F0 # <CJK>
+0xE147 0x74F1 # <CJK>
+0xE148 0x74F8 # <CJK>
+0xE149 0x74F7 # <CJK>
+0xE14A 0x7504 # <CJK>
+0xE14B 0x7503 # <CJK>
+0xE14C 0x7505 # <CJK>
+0xE14D 0x750C # <CJK>
+0xE14E 0x750E # <CJK>
+0xE14F 0x750D # <CJK>
+0xE150 0x7515 # <CJK>
+0xE151 0x7513 # <CJK>
+0xE152 0x751E # <CJK>
+0xE153 0x7526 # <CJK>
+0xE154 0x752C # <CJK>
+0xE155 0x753C # <CJK>
+0xE156 0x7544 # <CJK>
+0xE157 0x754D # <CJK>
+0xE158 0x754A # <CJK>
+0xE159 0x7549 # <CJK>
+0xE15A 0x755B # <CJK>
+0xE15B 0x7546 # <CJK>
+0xE15C 0x755A # <CJK>
+0xE15D 0x7569 # <CJK>
+0xE15E 0x7564 # <CJK>
+0xE15F 0x7567 # <CJK>
+0xE160 0x756B # <CJK>
+0xE161 0x756D # <CJK>
+0xE162 0x7578 # <CJK>
+0xE163 0x7576 # <CJK>
+0xE164 0x7586 # <CJK>
+0xE165 0x7587 # <CJK>
+0xE166 0x7574 # <CJK>
+0xE167 0x758A # <CJK>
+0xE168 0x7589 # <CJK>
+0xE169 0x7582 # <CJK>
+0xE16A 0x7594 # <CJK>
+0xE16B 0x759A # <CJK>
+0xE16C 0x759D # <CJK>
+0xE16D 0x75A5 # <CJK>
+0xE16E 0x75A3 # <CJK>
+0xE16F 0x75C2 # <CJK>
+0xE170 0x75B3 # <CJK>
+0xE171 0x75C3 # <CJK>
+0xE172 0x75B5 # <CJK>
+0xE173 0x75BD # <CJK>
+0xE174 0x75B8 # <CJK>
+0xE175 0x75BC # <CJK>
+0xE176 0x75B1 # <CJK>
+0xE177 0x75CD # <CJK>
+0xE178 0x75CA # <CJK>
+0xE179 0x75D2 # <CJK>
+0xE17A 0x75D9 # <CJK>
+0xE17B 0x75E3 # <CJK>
+0xE17C 0x75DE # <CJK>
+0xE17D 0x75FE # <CJK>
+0xE17E 0x75FF # <CJK>
+0xE180 0x75FC # <CJK>
+0xE181 0x7601 # <CJK>
+0xE182 0x75F0 # <CJK>
+0xE183 0x75FA # <CJK>
+0xE184 0x75F2 # <CJK>
+0xE185 0x75F3 # <CJK>
+0xE186 0x760B # <CJK>
+0xE187 0x760D # <CJK>
+0xE188 0x7609 # <CJK>
+0xE189 0x761F # <CJK>
+0xE18A 0x7627 # <CJK>
+0xE18B 0x7620 # <CJK>
+0xE18C 0x7621 # <CJK>
+0xE18D 0x7622 # <CJK>
+0xE18E 0x7624 # <CJK>
+0xE18F 0x7634 # <CJK>
+0xE190 0x7630 # <CJK>
+0xE191 0x763B # <CJK>
+0xE192 0x7647 # <CJK>
+0xE193 0x7648 # <CJK>
+0xE194 0x7646 # <CJK>
+0xE195 0x765C # <CJK>
+0xE196 0x7658 # <CJK>
+0xE197 0x7661 # <CJK>
+0xE198 0x7662 # <CJK>
+0xE199 0x7668 # <CJK>
+0xE19A 0x7669 # <CJK>
+0xE19B 0x766A # <CJK>
+0xE19C 0x7667 # <CJK>
+0xE19D 0x766C # <CJK>
+0xE19E 0x7670 # <CJK>
+0xE19F 0x7672 # <CJK>
+0xE1A0 0x7676 # <CJK>
+0xE1A1 0x7678 # <CJK>
+0xE1A2 0x767C # <CJK>
+0xE1A3 0x7680 # <CJK>
+0xE1A4 0x7683 # <CJK>
+0xE1A5 0x7688 # <CJK>
+0xE1A6 0x768B # <CJK>
+0xE1A7 0x768E # <CJK>
+0xE1A8 0x7696 # <CJK>
+0xE1A9 0x7693 # <CJK>
+0xE1AA 0x7699 # <CJK>
+0xE1AB 0x769A # <CJK>
+0xE1AC 0x76B0 # <CJK>
+0xE1AD 0x76B4 # <CJK>
+0xE1AE 0x76B8 # <CJK>
+0xE1AF 0x76B9 # <CJK>
+0xE1B0 0x76BA # <CJK>
+0xE1B1 0x76C2 # <CJK>
+0xE1B2 0x76CD # <CJK>
+0xE1B3 0x76D6 # <CJK>
+0xE1B4 0x76D2 # <CJK>
+0xE1B5 0x76DE # <CJK>
+0xE1B6 0x76E1 # <CJK>
+0xE1B7 0x76E5 # <CJK>
+0xE1B8 0x76E7 # <CJK>
+0xE1B9 0x76EA # <CJK>
+0xE1BA 0x862F # <CJK>
+0xE1BB 0x76FB # <CJK>
+0xE1BC 0x7708 # <CJK>
+0xE1BD 0x7707 # <CJK>
+0xE1BE 0x7704 # <CJK>
+0xE1BF 0x7729 # <CJK>
+0xE1C0 0x7724 # <CJK>
+0xE1C1 0x771E # <CJK>
+0xE1C2 0x7725 # <CJK>
+0xE1C3 0x7726 # <CJK>
+0xE1C4 0x771B # <CJK>
+0xE1C5 0x7737 # <CJK>
+0xE1C6 0x7738 # <CJK>
+0xE1C7 0x7747 # <CJK>
+0xE1C8 0x775A # <CJK>
+0xE1C9 0x7768 # <CJK>
+0xE1CA 0x776B # <CJK>
+0xE1CB 0x775B # <CJK>
+0xE1CC 0x7765 # <CJK>
+0xE1CD 0x777F # <CJK>
+0xE1CE 0x777E # <CJK>
+0xE1CF 0x7779 # <CJK>
+0xE1D0 0x778E # <CJK>
+0xE1D1 0x778B # <CJK>
+0xE1D2 0x7791 # <CJK>
+0xE1D3 0x77A0 # <CJK>
+0xE1D4 0x779E # <CJK>
+0xE1D5 0x77B0 # <CJK>
+0xE1D6 0x77B6 # <CJK>
+0xE1D7 0x77B9 # <CJK>
+0xE1D8 0x77BF # <CJK>
+0xE1D9 0x77BC # <CJK>
+0xE1DA 0x77BD # <CJK>
+0xE1DB 0x77BB # <CJK>
+0xE1DC 0x77C7 # <CJK>
+0xE1DD 0x77CD # <CJK>
+0xE1DE 0x77D7 # <CJK>
+0xE1DF 0x77DA # <CJK>
+0xE1E0 0x77DC # <CJK>
+0xE1E1 0x77E3 # <CJK>
+0xE1E2 0x77EE # <CJK>
+0xE1E3 0x77FC # <CJK>
+0xE1E4 0x780C # <CJK>
+0xE1E5 0x7812 # <CJK>
+0xE1E6 0x7926 # <CJK>
+0xE1E7 0x7820 # <CJK>
+0xE1E8 0x792A # <CJK>
+0xE1E9 0x7845 # <CJK>
+0xE1EA 0x788E # <CJK>
+0xE1EB 0x7874 # <CJK>
+0xE1EC 0x7886 # <CJK>
+0xE1ED 0x787C # <CJK>
+0xE1EE 0x789A # <CJK>
+0xE1EF 0x788C # <CJK>
+0xE1F0 0x78A3 # <CJK>
+0xE1F1 0x78B5 # <CJK>
+0xE1F2 0x78AA # <CJK>
+0xE1F3 0x78AF # <CJK>
+0xE1F4 0x78D1 # <CJK>
+0xE1F5 0x78C6 # <CJK>
+0xE1F6 0x78CB # <CJK>
+0xE1F7 0x78D4 # <CJK>
+0xE1F8 0x78BE # <CJK>
+0xE1F9 0x78BC # <CJK>
+0xE1FA 0x78C5 # <CJK>
+0xE1FB 0x78CA # <CJK>
+0xE1FC 0x78EC # <CJK>
+0xE240 0x78E7 # <CJK>
+0xE241 0x78DA # <CJK>
+0xE242 0x78FD # <CJK>
+0xE243 0x78F4 # <CJK>
+0xE244 0x7907 # <CJK>
+0xE245 0x7912 # <CJK>
+0xE246 0x7911 # <CJK>
+0xE247 0x7919 # <CJK>
+0xE248 0x792C # <CJK>
+0xE249 0x792B # <CJK>
+0xE24A 0x7940 # <CJK>
+0xE24B 0x7960 # <CJK>
+0xE24C 0x7957 # <CJK>
+0xE24D 0x795F # <CJK>
+0xE24E 0x795A # <CJK>
+0xE24F 0x7955 # <CJK>
+0xE250 0x7953 # <CJK>
+0xE251 0x797A # <CJK>
+0xE252 0x797F # <CJK>
+0xE253 0x798A # <CJK>
+0xE254 0x799D # <CJK>
+0xE255 0x79A7 # <CJK>
+0xE256 0x9F4B # <CJK>
+0xE257 0x79AA # <CJK>
+0xE258 0x79AE # <CJK>
+0xE259 0x79B3 # <CJK>
+0xE25A 0x79B9 # <CJK>
+0xE25B 0x79BA # <CJK>
+0xE25C 0x79C9 # <CJK>
+0xE25D 0x79D5 # <CJK>
+0xE25E 0x79E7 # <CJK>
+0xE25F 0x79EC # <CJK>
+0xE260 0x79E1 # <CJK>
+0xE261 0x79E3 # <CJK>
+0xE262 0x7A08 # <CJK>
+0xE263 0x7A0D # <CJK>
+0xE264 0x7A18 # <CJK>
+0xE265 0x7A19 # <CJK>
+0xE266 0x7A20 # <CJK>
+0xE267 0x7A1F # <CJK>
+0xE268 0x7980 # <CJK>
+0xE269 0x7A31 # <CJK>
+0xE26A 0x7A3B # <CJK>
+0xE26B 0x7A3E # <CJK>
+0xE26C 0x7A37 # <CJK>
+0xE26D 0x7A43 # <CJK>
+0xE26E 0x7A57 # <CJK>
+0xE26F 0x7A49 # <CJK>
+0xE270 0x7A61 # <CJK>
+0xE271 0x7A62 # <CJK>
+0xE272 0x7A69 # <CJK>
+0xE273 0x9F9D # <CJK>
+0xE274 0x7A70 # <CJK>
+0xE275 0x7A79 # <CJK>
+0xE276 0x7A7D # <CJK>
+0xE277 0x7A88 # <CJK>
+0xE278 0x7A97 # <CJK>
+0xE279 0x7A95 # <CJK>
+0xE27A 0x7A98 # <CJK>
+0xE27B 0x7A96 # <CJK>
+0xE27C 0x7AA9 # <CJK>
+0xE27D 0x7AC8 # <CJK>
+0xE27E 0x7AB0 # <CJK>
+0xE280 0x7AB6 # <CJK>
+0xE281 0x7AC5 # <CJK>
+0xE282 0x7AC4 # <CJK>
+0xE283 0x7ABF # <CJK>
+0xE284 0x9083 # <CJK>
+0xE285 0x7AC7 # <CJK>
+0xE286 0x7ACA # <CJK>
+0xE287 0x7ACD # <CJK>
+0xE288 0x7ACF # <CJK>
+0xE289 0x7AD5 # <CJK>
+0xE28A 0x7AD3 # <CJK>
+0xE28B 0x7AD9 # <CJK>
+0xE28C 0x7ADA # <CJK>
+0xE28D 0x7ADD # <CJK>
+0xE28E 0x7AE1 # <CJK>
+0xE28F 0x7AE2 # <CJK>
+0xE290 0x7AE6 # <CJK>
+0xE291 0x7AED # <CJK>
+0xE292 0x7AF0 # <CJK>
+0xE293 0x7B02 # <CJK>
+0xE294 0x7B0F # <CJK>
+0xE295 0x7B0A # <CJK>
+0xE296 0x7B06 # <CJK>
+0xE297 0x7B33 # <CJK>
+0xE298 0x7B18 # <CJK>
+0xE299 0x7B19 # <CJK>
+0xE29A 0x7B1E # <CJK>
+0xE29B 0x7B35 # <CJK>
+0xE29C 0x7B28 # <CJK>
+0xE29D 0x7B36 # <CJK>
+0xE29E 0x7B50 # <CJK>
+0xE29F 0x7B7A # <CJK>
+0xE2A0 0x7B04 # <CJK>
+0xE2A1 0x7B4D # <CJK>
+0xE2A2 0x7B0B # <CJK>
+0xE2A3 0x7B4C # <CJK>
+0xE2A4 0x7B45 # <CJK>
+0xE2A5 0x7B75 # <CJK>
+0xE2A6 0x7B65 # <CJK>
+0xE2A7 0x7B74 # <CJK>
+0xE2A8 0x7B67 # <CJK>
+0xE2A9 0x7B70 # <CJK>
+0xE2AA 0x7B71 # <CJK>
+0xE2AB 0x7B6C # <CJK>
+0xE2AC 0x7B6E # <CJK>
+0xE2AD 0x7B9D # <CJK>
+0xE2AE 0x7B98 # <CJK>
+0xE2AF 0x7B9F # <CJK>
+0xE2B0 0x7B8D # <CJK>
+0xE2B1 0x7B9C # <CJK>
+0xE2B2 0x7B9A # <CJK>
+0xE2B3 0x7B8B # <CJK>
+0xE2B4 0x7B92 # <CJK>
+0xE2B5 0x7B8F # <CJK>
+0xE2B6 0x7B5D # <CJK>
+0xE2B7 0x7B99 # <CJK>
+0xE2B8 0x7BCB # <CJK>
+0xE2B9 0x7BC1 # <CJK>
+0xE2BA 0x7BCC # <CJK>
+0xE2BB 0x7BCF # <CJK>
+0xE2BC 0x7BB4 # <CJK>
+0xE2BD 0x7BC6 # <CJK>
+0xE2BE 0x7BDD # <CJK>
+0xE2BF 0x7BE9 # <CJK>
+0xE2C0 0x7C11 # <CJK>
+0xE2C1 0x7C14 # <CJK>
+0xE2C2 0x7BE6 # <CJK>
+0xE2C3 0x7BE5 # <CJK>
+0xE2C4 0x7C60 # <CJK>
+0xE2C5 0x7C00 # <CJK>
+0xE2C6 0x7C07 # <CJK>
+0xE2C7 0x7C13 # <CJK>
+0xE2C8 0x7BF3 # <CJK>
+0xE2C9 0x7BF7 # <CJK>
+0xE2CA 0x7C17 # <CJK>
+0xE2CB 0x7C0D # <CJK>
+0xE2CC 0x7BF6 # <CJK>
+0xE2CD 0x7C23 # <CJK>
+0xE2CE 0x7C27 # <CJK>
+0xE2CF 0x7C2A # <CJK>
+0xE2D0 0x7C1F # <CJK>
+0xE2D1 0x7C37 # <CJK>
+0xE2D2 0x7C2B # <CJK>
+0xE2D3 0x7C3D # <CJK>
+0xE2D4 0x7C4C # <CJK>
+0xE2D5 0x7C43 # <CJK>
+0xE2D6 0x7C54 # <CJK>
+0xE2D7 0x7C4F # <CJK>
+0xE2D8 0x7C40 # <CJK>
+0xE2D9 0x7C50 # <CJK>
+0xE2DA 0x7C58 # <CJK>
+0xE2DB 0x7C5F # <CJK>
+0xE2DC 0x7C64 # <CJK>
+0xE2DD 0x7C56 # <CJK>
+0xE2DE 0x7C65 # <CJK>
+0xE2DF 0x7C6C # <CJK>
+0xE2E0 0x7C75 # <CJK>
+0xE2E1 0x7C83 # <CJK>
+0xE2E2 0x7C90 # <CJK>
+0xE2E3 0x7CA4 # <CJK>
+0xE2E4 0x7CAD # <CJK>
+0xE2E5 0x7CA2 # <CJK>
+0xE2E6 0x7CAB # <CJK>
+0xE2E7 0x7CA1 # <CJK>
+0xE2E8 0x7CA8 # <CJK>
+0xE2E9 0x7CB3 # <CJK>
+0xE2EA 0x7CB2 # <CJK>
+0xE2EB 0x7CB1 # <CJK>
+0xE2EC 0x7CAE # <CJK>
+0xE2ED 0x7CB9 # <CJK>
+0xE2EE 0x7CBD # <CJK>
+0xE2EF 0x7CC0 # <CJK>
+0xE2F0 0x7CC5 # <CJK>
+0xE2F1 0x7CC2 # <CJK>
+0xE2F2 0x7CD8 # <CJK>
+0xE2F3 0x7CD2 # <CJK>
+0xE2F4 0x7CDC # <CJK>
+0xE2F5 0x7CE2 # <CJK>
+0xE2F6 0x9B3B # <CJK>
+0xE2F7 0x7CEF # <CJK>
+0xE2F8 0x7CF2 # <CJK>
+0xE2F9 0x7CF4 # <CJK>
+0xE2FA 0x7CF6 # <CJK>
+0xE2FB 0x7CFA # <CJK>
+0xE2FC 0x7D06 # <CJK>
+0xE340 0x7D02 # <CJK>
+0xE341 0x7D1C # <CJK>
+0xE342 0x7D15 # <CJK>
+0xE343 0x7D0A # <CJK>
+0xE344 0x7D45 # <CJK>
+0xE345 0x7D4B # <CJK>
+0xE346 0x7D2E # <CJK>
+0xE347 0x7D32 # <CJK>
+0xE348 0x7D3F # <CJK>
+0xE349 0x7D35 # <CJK>
+0xE34A 0x7D46 # <CJK>
+0xE34B 0x7D73 # <CJK>
+0xE34C 0x7D56 # <CJK>
+0xE34D 0x7D4E # <CJK>
+0xE34E 0x7D72 # <CJK>
+0xE34F 0x7D68 # <CJK>
+0xE350 0x7D6E # <CJK>
+0xE351 0x7D4F # <CJK>
+0xE352 0x7D63 # <CJK>
+0xE353 0x7D93 # <CJK>
+0xE354 0x7D89 # <CJK>
+0xE355 0x7D5B # <CJK>
+0xE356 0x7D8F # <CJK>
+0xE357 0x7D7D # <CJK>
+0xE358 0x7D9B # <CJK>
+0xE359 0x7DBA # <CJK>
+0xE35A 0x7DAE # <CJK>
+0xE35B 0x7DA3 # <CJK>
+0xE35C 0x7DB5 # <CJK>
+0xE35D 0x7DC7 # <CJK>
+0xE35E 0x7DBD # <CJK>
+0xE35F 0x7DAB # <CJK>
+0xE360 0x7E3D # <CJK>
+0xE361 0x7DA2 # <CJK>
+0xE362 0x7DAF # <CJK>
+0xE363 0x7DDC # <CJK>
+0xE364 0x7DB8 # <CJK>
+0xE365 0x7D9F # <CJK>
+0xE366 0x7DB0 # <CJK>
+0xE367 0x7DD8 # <CJK>
+0xE368 0x7DDD # <CJK>
+0xE369 0x7DE4 # <CJK>
+0xE36A 0x7DDE # <CJK>
+0xE36B 0x7DFB # <CJK>
+0xE36C 0x7DF2 # <CJK>
+0xE36D 0x7DE1 # <CJK>
+0xE36E 0x7E05 # <CJK>
+0xE36F 0x7E0A # <CJK>
+0xE370 0x7E23 # <CJK>
+0xE371 0x7E21 # <CJK>
+0xE372 0x7E12 # <CJK>
+0xE373 0x7E31 # <CJK>
+0xE374 0x7E1F # <CJK>
+0xE375 0x7E09 # <CJK>
+0xE376 0x7E0B # <CJK>
+0xE377 0x7E22 # <CJK>
+0xE378 0x7E46 # <CJK>
+0xE379 0x7E66 # <CJK>
+0xE37A 0x7E3B # <CJK>
+0xE37B 0x7E35 # <CJK>
+0xE37C 0x7E39 # <CJK>
+0xE37D 0x7E43 # <CJK>
+0xE37E 0x7E37 # <CJK>
+0xE380 0x7E32 # <CJK>
+0xE381 0x7E3A # <CJK>
+0xE382 0x7E67 # <CJK>
+0xE383 0x7E5D # <CJK>
+0xE384 0x7E56 # <CJK>
+0xE385 0x7E5E # <CJK>
+0xE386 0x7E59 # <CJK>
+0xE387 0x7E5A # <CJK>
+0xE388 0x7E79 # <CJK>
+0xE389 0x7E6A # <CJK>
+0xE38A 0x7E69 # <CJK>
+0xE38B 0x7E7C # <CJK>
+0xE38C 0x7E7B # <CJK>
+0xE38D 0x7E83 # <CJK>
+0xE38E 0x7DD5 # <CJK>
+0xE38F 0x7E7D # <CJK>
+0xE390 0x8FAE # <CJK>
+0xE391 0x7E7F # <CJK>
+0xE392 0x7E88 # <CJK>
+0xE393 0x7E89 # <CJK>
+0xE394 0x7E8C # <CJK>
+0xE395 0x7E92 # <CJK>
+0xE396 0x7E90 # <CJK>
+0xE397 0x7E93 # <CJK>
+0xE398 0x7E94 # <CJK>
+0xE399 0x7E96 # <CJK>
+0xE39A 0x7E8E # <CJK>
+0xE39B 0x7E9B # <CJK>
+0xE39C 0x7E9C # <CJK>
+0xE39D 0x7F38 # <CJK>
+0xE39E 0x7F3A # <CJK>
+0xE39F 0x7F45 # <CJK>
+0xE3A0 0x7F4C # <CJK>
+0xE3A1 0x7F4D # <CJK>
+0xE3A2 0x7F4E # <CJK>
+0xE3A3 0x7F50 # <CJK>
+0xE3A4 0x7F51 # <CJK>
+0xE3A5 0x7F55 # <CJK>
+0xE3A6 0x7F54 # <CJK>
+0xE3A7 0x7F58 # <CJK>
+0xE3A8 0x7F5F # <CJK>
+0xE3A9 0x7F60 # <CJK>
+0xE3AA 0x7F68 # <CJK>
+0xE3AB 0x7F69 # <CJK>
+0xE3AC 0x7F67 # <CJK>
+0xE3AD 0x7F78 # <CJK>
+0xE3AE 0x7F82 # <CJK>
+0xE3AF 0x7F86 # <CJK>
+0xE3B0 0x7F83 # <CJK>
+0xE3B1 0x7F88 # <CJK>
+0xE3B2 0x7F87 # <CJK>
+0xE3B3 0x7F8C # <CJK>
+0xE3B4 0x7F94 # <CJK>
+0xE3B5 0x7F9E # <CJK>
+0xE3B6 0x7F9D # <CJK>
+0xE3B7 0x7F9A # <CJK>
+0xE3B8 0x7FA3 # <CJK>
+0xE3B9 0x7FAF # <CJK>
+0xE3BA 0x7FB2 # <CJK>
+0xE3BB 0x7FB9 # <CJK>
+0xE3BC 0x7FAE # <CJK>
+0xE3BD 0x7FB6 # <CJK>
+0xE3BE 0x7FB8 # <CJK>
+0xE3BF 0x8B71 # <CJK>
+0xE3C0 0x7FC5 # <CJK>
+0xE3C1 0x7FC6 # <CJK>
+0xE3C2 0x7FCA # <CJK>
+0xE3C3 0x7FD5 # <CJK>
+0xE3C4 0x7FD4 # <CJK>
+0xE3C5 0x7FE1 # <CJK>
+0xE3C6 0x7FE6 # <CJK>
+0xE3C7 0x7FE9 # <CJK>
+0xE3C8 0x7FF3 # <CJK>
+0xE3C9 0x7FF9 # <CJK>
+0xE3CA 0x98DC # <CJK>
+0xE3CB 0x8006 # <CJK>
+0xE3CC 0x8004 # <CJK>
+0xE3CD 0x800B # <CJK>
+0xE3CE 0x8012 # <CJK>
+0xE3CF 0x8018 # <CJK>
+0xE3D0 0x8019 # <CJK>
+0xE3D1 0x801C # <CJK>
+0xE3D2 0x8021 # <CJK>
+0xE3D3 0x8028 # <CJK>
+0xE3D4 0x803F # <CJK>
+0xE3D5 0x803B # <CJK>
+0xE3D6 0x804A # <CJK>
+0xE3D7 0x8046 # <CJK>
+0xE3D8 0x8052 # <CJK>
+0xE3D9 0x8058 # <CJK>
+0xE3DA 0x805A # <CJK>
+0xE3DB 0x805F # <CJK>
+0xE3DC 0x8062 # <CJK>
+0xE3DD 0x8068 # <CJK>
+0xE3DE 0x8073 # <CJK>
+0xE3DF 0x8072 # <CJK>
+0xE3E0 0x8070 # <CJK>
+0xE3E1 0x8076 # <CJK>
+0xE3E2 0x8079 # <CJK>
+0xE3E3 0x807D # <CJK>
+0xE3E4 0x807F # <CJK>
+0xE3E5 0x8084 # <CJK>
+0xE3E6 0x8086 # <CJK>
+0xE3E7 0x8085 # <CJK>
+0xE3E8 0x809B # <CJK>
+0xE3E9 0x8093 # <CJK>
+0xE3EA 0x809A # <CJK>
+0xE3EB 0x80AD # <CJK>
+0xE3EC 0x5190 # <CJK>
+0xE3ED 0x80AC # <CJK>
+0xE3EE 0x80DB # <CJK>
+0xE3EF 0x80E5 # <CJK>
+0xE3F0 0x80D9 # <CJK>
+0xE3F1 0x80DD # <CJK>
+0xE3F2 0x80C4 # <CJK>
+0xE3F3 0x80DA # <CJK>
+0xE3F4 0x80D6 # <CJK>
+0xE3F5 0x8109 # <CJK>
+0xE3F6 0x80EF # <CJK>
+0xE3F7 0x80F1 # <CJK>
+0xE3F8 0x811B # <CJK>
+0xE3F9 0x8129 # <CJK>
+0xE3FA 0x8123 # <CJK>
+0xE3FB 0x812F # <CJK>
+0xE3FC 0x814B # <CJK>
+0xE440 0x968B # <CJK>
+0xE441 0x8146 # <CJK>
+0xE442 0x813E # <CJK>
+0xE443 0x8153 # <CJK>
+0xE444 0x8151 # <CJK>
+0xE445 0x80FC # <CJK>
+0xE446 0x8171 # <CJK>
+0xE447 0x816E # <CJK>
+0xE448 0x8165 # <CJK>
+0xE449 0x8166 # <CJK>
+0xE44A 0x8174 # <CJK>
+0xE44B 0x8183 # <CJK>
+0xE44C 0x8188 # <CJK>
+0xE44D 0x818A # <CJK>
+0xE44E 0x8180 # <CJK>
+0xE44F 0x8182 # <CJK>
+0xE450 0x81A0 # <CJK>
+0xE451 0x8195 # <CJK>
+0xE452 0x81A4 # <CJK>
+0xE453 0x81A3 # <CJK>
+0xE454 0x815F # <CJK>
+0xE455 0x8193 # <CJK>
+0xE456 0x81A9 # <CJK>
+0xE457 0x81B0 # <CJK>
+0xE458 0x81B5 # <CJK>
+0xE459 0x81BE # <CJK>
+0xE45A 0x81B8 # <CJK>
+0xE45B 0x81BD # <CJK>
+0xE45C 0x81C0 # <CJK>
+0xE45D 0x81C2 # <CJK>
+0xE45E 0x81BA # <CJK>
+0xE45F 0x81C9 # <CJK>
+0xE460 0x81CD # <CJK>
+0xE461 0x81D1 # <CJK>
+0xE462 0x81D9 # <CJK>
+0xE463 0x81D8 # <CJK>
+0xE464 0x81C8 # <CJK>
+0xE465 0x81DA # <CJK>
+0xE466 0x81DF # <CJK>
+0xE467 0x81E0 # <CJK>
+0xE468 0x81E7 # <CJK>
+0xE469 0x81FA # <CJK>
+0xE46A 0x81FB # <CJK>
+0xE46B 0x81FE # <CJK>
+0xE46C 0x8201 # <CJK>
+0xE46D 0x8202 # <CJK>
+0xE46E 0x8205 # <CJK>
+0xE46F 0x8207 # <CJK>
+0xE470 0x820A # <CJK>
+0xE471 0x820D # <CJK>
+0xE472 0x8210 # <CJK>
+0xE473 0x8216 # <CJK>
+0xE474 0x8229 # <CJK>
+0xE475 0x822B # <CJK>
+0xE476 0x8238 # <CJK>
+0xE477 0x8233 # <CJK>
+0xE478 0x8240 # <CJK>
+0xE479 0x8259 # <CJK>
+0xE47A 0x8258 # <CJK>
+0xE47B 0x825D # <CJK>
+0xE47C 0x825A # <CJK>
+0xE47D 0x825F # <CJK>
+0xE47E 0x8264 # <CJK>
+0xE480 0x8262 # <CJK>
+0xE481 0x8268 # <CJK>
+0xE482 0x826A # <CJK>
+0xE483 0x826B # <CJK>
+0xE484 0x822E # <CJK>
+0xE485 0x8271 # <CJK>
+0xE486 0x8277 # <CJK>
+0xE487 0x8278 # <CJK>
+0xE488 0x827E # <CJK>
+0xE489 0x828D # <CJK>
+0xE48A 0x8292 # <CJK>
+0xE48B 0x82AB # <CJK>
+0xE48C 0x829F # <CJK>
+0xE48D 0x82BB # <CJK>
+0xE48E 0x82AC # <CJK>
+0xE48F 0x82E1 # <CJK>
+0xE490 0x82E3 # <CJK>
+0xE491 0x82DF # <CJK>
+0xE492 0x82D2 # <CJK>
+0xE493 0x82F4 # <CJK>
+0xE494 0x82F3 # <CJK>
+0xE495 0x82FA # <CJK>
+0xE496 0x8393 # <CJK>
+0xE497 0x8303 # <CJK>
+0xE498 0x82FB # <CJK>
+0xE499 0x82F9 # <CJK>
+0xE49A 0x82DE # <CJK>
+0xE49B 0x8306 # <CJK>
+0xE49C 0x82DC # <CJK>
+0xE49D 0x8309 # <CJK>
+0xE49E 0x82D9 # <CJK>
+0xE49F 0x8335 # <CJK>
+0xE4A0 0x8334 # <CJK>
+0xE4A1 0x8316 # <CJK>
+0xE4A2 0x8332 # <CJK>
+0xE4A3 0x8331 # <CJK>
+0xE4A4 0x8340 # <CJK>
+0xE4A5 0x8339 # <CJK>
+0xE4A6 0x8350 # <CJK>
+0xE4A7 0x8345 # <CJK>
+0xE4A8 0x832F # <CJK>
+0xE4A9 0x832B # <CJK>
+0xE4AA 0x8317 # <CJK>
+0xE4AB 0x8318 # <CJK>
+0xE4AC 0x8385 # <CJK>
+0xE4AD 0x839A # <CJK>
+0xE4AE 0x83AA # <CJK>
+0xE4AF 0x839F # <CJK>
+0xE4B0 0x83A2 # <CJK>
+0xE4B1 0x8396 # <CJK>
+0xE4B2 0x8323 # <CJK>
+0xE4B3 0x838E # <CJK>
+0xE4B4 0x8387 # <CJK>
+0xE4B5 0x838A # <CJK>
+0xE4B6 0x837C # <CJK>
+0xE4B7 0x83B5 # <CJK>
+0xE4B8 0x8373 # <CJK>
+0xE4B9 0x8375 # <CJK>
+0xE4BA 0x83A0 # <CJK>
+0xE4BB 0x8389 # <CJK>
+0xE4BC 0x83A8 # <CJK>
+0xE4BD 0x83F4 # <CJK>
+0xE4BE 0x8413 # <CJK>
+0xE4BF 0x83EB # <CJK>
+0xE4C0 0x83CE # <CJK>
+0xE4C1 0x83FD # <CJK>
+0xE4C2 0x8403 # <CJK>
+0xE4C3 0x83D8 # <CJK>
+0xE4C4 0x840B # <CJK>
+0xE4C5 0x83C1 # <CJK>
+0xE4C6 0x83F7 # <CJK>
+0xE4C7 0x8407 # <CJK>
+0xE4C8 0x83E0 # <CJK>
+0xE4C9 0x83F2 # <CJK>
+0xE4CA 0x840D # <CJK>
+0xE4CB 0x8422 # <CJK>
+0xE4CC 0x8420 # <CJK>
+0xE4CD 0x83BD # <CJK>
+0xE4CE 0x8438 # <CJK>
+0xE4CF 0x8506 # <CJK>
+0xE4D0 0x83FB # <CJK>
+0xE4D1 0x846D # <CJK>
+0xE4D2 0x842A # <CJK>
+0xE4D3 0x843C # <CJK>
+0xE4D4 0x855A # <CJK>
+0xE4D5 0x8484 # <CJK>
+0xE4D6 0x8477 # <CJK>
+0xE4D7 0x846B # <CJK>
+0xE4D8 0x84AD # <CJK>
+0xE4D9 0x846E # <CJK>
+0xE4DA 0x8482 # <CJK>
+0xE4DB 0x8469 # <CJK>
+0xE4DC 0x8446 # <CJK>
+0xE4DD 0x842C # <CJK>
+0xE4DE 0x846F # <CJK>
+0xE4DF 0x8479 # <CJK>
+0xE4E0 0x8435 # <CJK>
+0xE4E1 0x84CA # <CJK>
+0xE4E2 0x8462 # <CJK>
+0xE4E3 0x84B9 # <CJK>
+0xE4E4 0x84BF # <CJK>
+0xE4E5 0x849F # <CJK>
+0xE4E6 0x84D9 # <CJK>
+0xE4E7 0x84CD # <CJK>
+0xE4E8 0x84BB # <CJK>
+0xE4E9 0x84DA # <CJK>
+0xE4EA 0x84D0 # <CJK>
+0xE4EB 0x84C1 # <CJK>
+0xE4EC 0x84C6 # <CJK>
+0xE4ED 0x84D6 # <CJK>
+0xE4EE 0x84A1 # <CJK>
+0xE4EF 0x8521 # <CJK>
+0xE4F0 0x84FF # <CJK>
+0xE4F1 0x84F4 # <CJK>
+0xE4F2 0x8517 # <CJK>
+0xE4F3 0x8518 # <CJK>
+0xE4F4 0x852C # <CJK>
+0xE4F5 0x851F # <CJK>
+0xE4F6 0x8515 # <CJK>
+0xE4F7 0x8514 # <CJK>
+0xE4F8 0x84FC # <CJK>
+0xE4F9 0x8540 # <CJK>
+0xE4FA 0x8563 # <CJK>
+0xE4FB 0x8558 # <CJK>
+0xE4FC 0x8548 # <CJK>
+0xE540 0x8541 # <CJK>
+0xE541 0x8602 # <CJK>
+0xE542 0x854B # <CJK>
+0xE543 0x8555 # <CJK>
+0xE544 0x8580 # <CJK>
+0xE545 0x85A4 # <CJK>
+0xE546 0x8588 # <CJK>
+0xE547 0x8591 # <CJK>
+0xE548 0x858A # <CJK>
+0xE549 0x85A8 # <CJK>
+0xE54A 0x856D # <CJK>
+0xE54B 0x8594 # <CJK>
+0xE54C 0x859B # <CJK>
+0xE54D 0x85EA # <CJK>
+0xE54E 0x8587 # <CJK>
+0xE54F 0x859C # <CJK>
+0xE550 0x8577 # <CJK>
+0xE551 0x857E # <CJK>
+0xE552 0x8590 # <CJK>
+0xE553 0x85C9 # <CJK>
+0xE554 0x85BA # <CJK>
+0xE555 0x85CF # <CJK>
+0xE556 0x85B9 # <CJK>
+0xE557 0x85D0 # <CJK>
+0xE558 0x85D5 # <CJK>
+0xE559 0x85DD # <CJK>
+0xE55A 0x85E5 # <CJK>
+0xE55B 0x85DC # <CJK>
+0xE55C 0x85F9 # <CJK>
+0xE55D 0x860A # <CJK>
+0xE55E 0x8613 # <CJK>
+0xE55F 0x860B # <CJK>
+0xE560 0x85FE # <CJK>
+0xE561 0x85FA # <CJK>
+0xE562 0x8606 # <CJK>
+0xE563 0x8622 # <CJK>
+0xE564 0x861A # <CJK>
+0xE565 0x8630 # <CJK>
+0xE566 0x863F # <CJK>
+0xE567 0x864D # <CJK>
+0xE568 0x4E55 # <CJK>
+0xE569 0x8654 # <CJK>
+0xE56A 0x865F # <CJK>
+0xE56B 0x8667 # <CJK>
+0xE56C 0x8671 # <CJK>
+0xE56D 0x8693 # <CJK>
+0xE56E 0x86A3 # <CJK>
+0xE56F 0x86A9 # <CJK>
+0xE570 0x86AA # <CJK>
+0xE571 0x868B # <CJK>
+0xE572 0x868C # <CJK>
+0xE573 0x86B6 # <CJK>
+0xE574 0x86AF # <CJK>
+0xE575 0x86C4 # <CJK>
+0xE576 0x86C6 # <CJK>
+0xE577 0x86B0 # <CJK>
+0xE578 0x86C9 # <CJK>
+0xE579 0x8823 # <CJK>
+0xE57A 0x86AB # <CJK>
+0xE57B 0x86D4 # <CJK>
+0xE57C 0x86DE # <CJK>
+0xE57D 0x86E9 # <CJK>
+0xE57E 0x86EC # <CJK>
+0xE580 0x86DF # <CJK>
+0xE581 0x86DB # <CJK>
+0xE582 0x86EF # <CJK>
+0xE583 0x8712 # <CJK>
+0xE584 0x8706 # <CJK>
+0xE585 0x8708 # <CJK>
+0xE586 0x8700 # <CJK>
+0xE587 0x8703 # <CJK>
+0xE588 0x86FB # <CJK>
+0xE589 0x8711 # <CJK>
+0xE58A 0x8709 # <CJK>
+0xE58B 0x870D # <CJK>
+0xE58C 0x86F9 # <CJK>
+0xE58D 0x870A # <CJK>
+0xE58E 0x8734 # <CJK>
+0xE58F 0x873F # <CJK>
+0xE590 0x8737 # <CJK>
+0xE591 0x873B # <CJK>
+0xE592 0x8725 # <CJK>
+0xE593 0x8729 # <CJK>
+0xE594 0x871A # <CJK>
+0xE595 0x8760 # <CJK>
+0xE596 0x875F # <CJK>
+0xE597 0x8778 # <CJK>
+0xE598 0x874C # <CJK>
+0xE599 0x874E # <CJK>
+0xE59A 0x8774 # <CJK>
+0xE59B 0x8757 # <CJK>
+0xE59C 0x8768 # <CJK>
+0xE59D 0x876E # <CJK>
+0xE59E 0x8759 # <CJK>
+0xE59F 0x8753 # <CJK>
+0xE5A0 0x8763 # <CJK>
+0xE5A1 0x876A # <CJK>
+0xE5A2 0x8805 # <CJK>
+0xE5A3 0x87A2 # <CJK>
+0xE5A4 0x879F # <CJK>
+0xE5A5 0x8782 # <CJK>
+0xE5A6 0x87AF # <CJK>
+0xE5A7 0x87CB # <CJK>
+0xE5A8 0x87BD # <CJK>
+0xE5A9 0x87C0 # <CJK>
+0xE5AA 0x87D0 # <CJK>
+0xE5AB 0x96D6 # <CJK>
+0xE5AC 0x87AB # <CJK>
+0xE5AD 0x87C4 # <CJK>
+0xE5AE 0x87B3 # <CJK>
+0xE5AF 0x87C7 # <CJK>
+0xE5B0 0x87C6 # <CJK>
+0xE5B1 0x87BB # <CJK>
+0xE5B2 0x87EF # <CJK>
+0xE5B3 0x87F2 # <CJK>
+0xE5B4 0x87E0 # <CJK>
+0xE5B5 0x880F # <CJK>
+0xE5B6 0x880D # <CJK>
+0xE5B7 0x87FE # <CJK>
+0xE5B8 0x87F6 # <CJK>
+0xE5B9 0x87F7 # <CJK>
+0xE5BA 0x880E # <CJK>
+0xE5BB 0x87D2 # <CJK>
+0xE5BC 0x8811 # <CJK>
+0xE5BD 0x8816 # <CJK>
+0xE5BE 0x8815 # <CJK>
+0xE5BF 0x8822 # <CJK>
+0xE5C0 0x8821 # <CJK>
+0xE5C1 0x8831 # <CJK>
+0xE5C2 0x8836 # <CJK>
+0xE5C3 0x8839 # <CJK>
+0xE5C4 0x8827 # <CJK>
+0xE5C5 0x883B # <CJK>
+0xE5C6 0x8844 # <CJK>
+0xE5C7 0x8842 # <CJK>
+0xE5C8 0x8852 # <CJK>
+0xE5C9 0x8859 # <CJK>
+0xE5CA 0x885E # <CJK>
+0xE5CB 0x8862 # <CJK>
+0xE5CC 0x886B # <CJK>
+0xE5CD 0x8881 # <CJK>
+0xE5CE 0x887E # <CJK>
+0xE5CF 0x889E # <CJK>
+0xE5D0 0x8875 # <CJK>
+0xE5D1 0x887D # <CJK>
+0xE5D2 0x88B5 # <CJK>
+0xE5D3 0x8872 # <CJK>
+0xE5D4 0x8882 # <CJK>
+0xE5D5 0x8897 # <CJK>
+0xE5D6 0x8892 # <CJK>
+0xE5D7 0x88AE # <CJK>
+0xE5D8 0x8899 # <CJK>
+0xE5D9 0x88A2 # <CJK>
+0xE5DA 0x888D # <CJK>
+0xE5DB 0x88A4 # <CJK>
+0xE5DC 0x88B0 # <CJK>
+0xE5DD 0x88BF # <CJK>
+0xE5DE 0x88B1 # <CJK>
+0xE5DF 0x88C3 # <CJK>
+0xE5E0 0x88C4 # <CJK>
+0xE5E1 0x88D4 # <CJK>
+0xE5E2 0x88D8 # <CJK>
+0xE5E3 0x88D9 # <CJK>
+0xE5E4 0x88DD # <CJK>
+0xE5E5 0x88F9 # <CJK>
+0xE5E6 0x8902 # <CJK>
+0xE5E7 0x88FC # <CJK>
+0xE5E8 0x88F4 # <CJK>
+0xE5E9 0x88E8 # <CJK>
+0xE5EA 0x88F2 # <CJK>
+0xE5EB 0x8904 # <CJK>
+0xE5EC 0x890C # <CJK>
+0xE5ED 0x890A # <CJK>
+0xE5EE 0x8913 # <CJK>
+0xE5EF 0x8943 # <CJK>
+0xE5F0 0x891E # <CJK>
+0xE5F1 0x8925 # <CJK>
+0xE5F2 0x892A # <CJK>
+0xE5F3 0x892B # <CJK>
+0xE5F4 0x8941 # <CJK>
+0xE5F5 0x8944 # <CJK>
+0xE5F6 0x893B # <CJK>
+0xE5F7 0x8936 # <CJK>
+0xE5F8 0x8938 # <CJK>
+0xE5F9 0x894C # <CJK>
+0xE5FA 0x891D # <CJK>
+0xE5FB 0x8960 # <CJK>
+0xE5FC 0x895E # <CJK>
+0xE640 0x8966 # <CJK>
+0xE641 0x8964 # <CJK>
+0xE642 0x896D # <CJK>
+0xE643 0x896A # <CJK>
+0xE644 0x896F # <CJK>
+0xE645 0x8974 # <CJK>
+0xE646 0x8977 # <CJK>
+0xE647 0x897E # <CJK>
+0xE648 0x8983 # <CJK>
+0xE649 0x8988 # <CJK>
+0xE64A 0x898A # <CJK>
+0xE64B 0x8993 # <CJK>
+0xE64C 0x8998 # <CJK>
+0xE64D 0x89A1 # <CJK>
+0xE64E 0x89A9 # <CJK>
+0xE64F 0x89A6 # <CJK>
+0xE650 0x89AC # <CJK>
+0xE651 0x89AF # <CJK>
+0xE652 0x89B2 # <CJK>
+0xE653 0x89BA # <CJK>
+0xE654 0x89BD # <CJK>
+0xE655 0x89BF # <CJK>
+0xE656 0x89C0 # <CJK>
+0xE657 0x89DA # <CJK>
+0xE658 0x89DC # <CJK>
+0xE659 0x89DD # <CJK>
+0xE65A 0x89E7 # <CJK>
+0xE65B 0x89F4 # <CJK>
+0xE65C 0x89F8 # <CJK>
+0xE65D 0x8A03 # <CJK>
+0xE65E 0x8A16 # <CJK>
+0xE65F 0x8A10 # <CJK>
+0xE660 0x8A0C # <CJK>
+0xE661 0x8A1B # <CJK>
+0xE662 0x8A1D # <CJK>
+0xE663 0x8A25 # <CJK>
+0xE664 0x8A36 # <CJK>
+0xE665 0x8A41 # <CJK>
+0xE666 0x8A5B # <CJK>
+0xE667 0x8A52 # <CJK>
+0xE668 0x8A46 # <CJK>
+0xE669 0x8A48 # <CJK>
+0xE66A 0x8A7C # <CJK>
+0xE66B 0x8A6D # <CJK>
+0xE66C 0x8A6C # <CJK>
+0xE66D 0x8A62 # <CJK>
+0xE66E 0x8A85 # <CJK>
+0xE66F 0x8A82 # <CJK>
+0xE670 0x8A84 # <CJK>
+0xE671 0x8AA8 # <CJK>
+0xE672 0x8AA1 # <CJK>
+0xE673 0x8A91 # <CJK>
+0xE674 0x8AA5 # <CJK>
+0xE675 0x8AA6 # <CJK>
+0xE676 0x8A9A # <CJK>
+0xE677 0x8AA3 # <CJK>
+0xE678 0x8AC4 # <CJK>
+0xE679 0x8ACD # <CJK>
+0xE67A 0x8AC2 # <CJK>
+0xE67B 0x8ADA # <CJK>
+0xE67C 0x8AEB # <CJK>
+0xE67D 0x8AF3 # <CJK>
+0xE67E 0x8AE7 # <CJK>
+0xE680 0x8AE4 # <CJK>
+0xE681 0x8AF1 # <CJK>
+0xE682 0x8B14 # <CJK>
+0xE683 0x8AE0 # <CJK>
+0xE684 0x8AE2 # <CJK>
+0xE685 0x8AF7 # <CJK>
+0xE686 0x8ADE # <CJK>
+0xE687 0x8ADB # <CJK>
+0xE688 0x8B0C # <CJK>
+0xE689 0x8B07 # <CJK>
+0xE68A 0x8B1A # <CJK>
+0xE68B 0x8AE1 # <CJK>
+0xE68C 0x8B16 # <CJK>
+0xE68D 0x8B10 # <CJK>
+0xE68E 0x8B17 # <CJK>
+0xE68F 0x8B20 # <CJK>
+0xE690 0x8B33 # <CJK>
+0xE691 0x97AB # <CJK>
+0xE692 0x8B26 # <CJK>
+0xE693 0x8B2B # <CJK>
+0xE694 0x8B3E # <CJK>
+0xE695 0x8B28 # <CJK>
+0xE696 0x8B41 # <CJK>
+0xE697 0x8B4C # <CJK>
+0xE698 0x8B4F # <CJK>
+0xE699 0x8B4E # <CJK>
+0xE69A 0x8B49 # <CJK>
+0xE69B 0x8B56 # <CJK>
+0xE69C 0x8B5B # <CJK>
+0xE69D 0x8B5A # <CJK>
+0xE69E 0x8B6B # <CJK>
+0xE69F 0x8B5F # <CJK>
+0xE6A0 0x8B6C # <CJK>
+0xE6A1 0x8B6F # <CJK>
+0xE6A2 0x8B74 # <CJK>
+0xE6A3 0x8B7D # <CJK>
+0xE6A4 0x8B80 # <CJK>
+0xE6A5 0x8B8C # <CJK>
+0xE6A6 0x8B8E # <CJK>
+0xE6A7 0x8B92 # <CJK>
+0xE6A8 0x8B93 # <CJK>
+0xE6A9 0x8B96 # <CJK>
+0xE6AA 0x8B99 # <CJK>
+0xE6AB 0x8B9A # <CJK>
+0xE6AC 0x8C3A # <CJK>
+0xE6AD 0x8C41 # <CJK>
+0xE6AE 0x8C3F # <CJK>
+0xE6AF 0x8C48 # <CJK>
+0xE6B0 0x8C4C # <CJK>
+0xE6B1 0x8C4E # <CJK>
+0xE6B2 0x8C50 # <CJK>
+0xE6B3 0x8C55 # <CJK>
+0xE6B4 0x8C62 # <CJK>
+0xE6B5 0x8C6C # <CJK>
+0xE6B6 0x8C78 # <CJK>
+0xE6B7 0x8C7A # <CJK>
+0xE6B8 0x8C82 # <CJK>
+0xE6B9 0x8C89 # <CJK>
+0xE6BA 0x8C85 # <CJK>
+0xE6BB 0x8C8A # <CJK>
+0xE6BC 0x8C8D # <CJK>
+0xE6BD 0x8C8E # <CJK>
+0xE6BE 0x8C94 # <CJK>
+0xE6BF 0x8C7C # <CJK>
+0xE6C0 0x8C98 # <CJK>
+0xE6C1 0x621D # <CJK>
+0xE6C2 0x8CAD # <CJK>
+0xE6C3 0x8CAA # <CJK>
+0xE6C4 0x8CBD # <CJK>
+0xE6C5 0x8CB2 # <CJK>
+0xE6C6 0x8CB3 # <CJK>
+0xE6C7 0x8CAE # <CJK>
+0xE6C8 0x8CB6 # <CJK>
+0xE6C9 0x8CC8 # <CJK>
+0xE6CA 0x8CC1 # <CJK>
+0xE6CB 0x8CE4 # <CJK>
+0xE6CC 0x8CE3 # <CJK>
+0xE6CD 0x8CDA # <CJK>
+0xE6CE 0x8CFD # <CJK>
+0xE6CF 0x8CFA # <CJK>
+0xE6D0 0x8CFB # <CJK>
+0xE6D1 0x8D04 # <CJK>
+0xE6D2 0x8D05 # <CJK>
+0xE6D3 0x8D0A # <CJK>
+0xE6D4 0x8D07 # <CJK>
+0xE6D5 0x8D0F # <CJK>
+0xE6D6 0x8D0D # <CJK>
+0xE6D7 0x8D10 # <CJK>
+0xE6D8 0x9F4E # <CJK>
+0xE6D9 0x8D13 # <CJK>
+0xE6DA 0x8CCD # <CJK>
+0xE6DB 0x8D14 # <CJK>
+0xE6DC 0x8D16 # <CJK>
+0xE6DD 0x8D67 # <CJK>
+0xE6DE 0x8D6D # <CJK>
+0xE6DF 0x8D71 # <CJK>
+0xE6E0 0x8D73 # <CJK>
+0xE6E1 0x8D81 # <CJK>
+0xE6E2 0x8D99 # <CJK>
+0xE6E3 0x8DC2 # <CJK>
+0xE6E4 0x8DBE # <CJK>
+0xE6E5 0x8DBA # <CJK>
+0xE6E6 0x8DCF # <CJK>
+0xE6E7 0x8DDA # <CJK>
+0xE6E8 0x8DD6 # <CJK>
+0xE6E9 0x8DCC # <CJK>
+0xE6EA 0x8DDB # <CJK>
+0xE6EB 0x8DCB # <CJK>
+0xE6EC 0x8DEA # <CJK>
+0xE6ED 0x8DEB # <CJK>
+0xE6EE 0x8DDF # <CJK>
+0xE6EF 0x8DE3 # <CJK>
+0xE6F0 0x8DFC # <CJK>
+0xE6F1 0x8E08 # <CJK>
+0xE6F2 0x8E09 # <CJK>
+0xE6F3 0x8DFF # <CJK>
+0xE6F4 0x8E1D # <CJK>
+0xE6F5 0x8E1E # <CJK>
+0xE6F6 0x8E10 # <CJK>
+0xE6F7 0x8E1F # <CJK>
+0xE6F8 0x8E42 # <CJK>
+0xE6F9 0x8E35 # <CJK>
+0xE6FA 0x8E30 # <CJK>
+0xE6FB 0x8E34 # <CJK>
+0xE6FC 0x8E4A # <CJK>
+0xE740 0x8E47 # <CJK>
+0xE741 0x8E49 # <CJK>
+0xE742 0x8E4C # <CJK>
+0xE743 0x8E50 # <CJK>
+0xE744 0x8E48 # <CJK>
+0xE745 0x8E59 # <CJK>
+0xE746 0x8E64 # <CJK>
+0xE747 0x8E60 # <CJK>
+0xE748 0x8E2A # <CJK>
+0xE749 0x8E63 # <CJK>
+0xE74A 0x8E55 # <CJK>
+0xE74B 0x8E76 # <CJK>
+0xE74C 0x8E72 # <CJK>
+0xE74D 0x8E7C # <CJK>
+0xE74E 0x8E81 # <CJK>
+0xE74F 0x8E87 # <CJK>
+0xE750 0x8E85 # <CJK>
+0xE751 0x8E84 # <CJK>
+0xE752 0x8E8B # <CJK>
+0xE753 0x8E8A # <CJK>
+0xE754 0x8E93 # <CJK>
+0xE755 0x8E91 # <CJK>
+0xE756 0x8E94 # <CJK>
+0xE757 0x8E99 # <CJK>
+0xE758 0x8EAA # <CJK>
+0xE759 0x8EA1 # <CJK>
+0xE75A 0x8EAC # <CJK>
+0xE75B 0x8EB0 # <CJK>
+0xE75C 0x8EC6 # <CJK>
+0xE75D 0x8EB1 # <CJK>
+0xE75E 0x8EBE # <CJK>
+0xE75F 0x8EC5 # <CJK>
+0xE760 0x8EC8 # <CJK>
+0xE761 0x8ECB # <CJK>
+0xE762 0x8EDB # <CJK>
+0xE763 0x8EE3 # <CJK>
+0xE764 0x8EFC # <CJK>
+0xE765 0x8EFB # <CJK>
+0xE766 0x8EEB # <CJK>
+0xE767 0x8EFE # <CJK>
+0xE768 0x8F0A # <CJK>
+0xE769 0x8F05 # <CJK>
+0xE76A 0x8F15 # <CJK>
+0xE76B 0x8F12 # <CJK>
+0xE76C 0x8F19 # <CJK>
+0xE76D 0x8F13 # <CJK>
+0xE76E 0x8F1C # <CJK>
+0xE76F 0x8F1F # <CJK>
+0xE770 0x8F1B # <CJK>
+0xE771 0x8F0C # <CJK>
+0xE772 0x8F26 # <CJK>
+0xE773 0x8F33 # <CJK>
+0xE774 0x8F3B # <CJK>
+0xE775 0x8F39 # <CJK>
+0xE776 0x8F45 # <CJK>
+0xE777 0x8F42 # <CJK>
+0xE778 0x8F3E # <CJK>
+0xE779 0x8F4C # <CJK>
+0xE77A 0x8F49 # <CJK>
+0xE77B 0x8F46 # <CJK>
+0xE77C 0x8F4E # <CJK>
+0xE77D 0x8F57 # <CJK>
+0xE77E 0x8F5C # <CJK>
+0xE780 0x8F62 # <CJK>
+0xE781 0x8F63 # <CJK>
+0xE782 0x8F64 # <CJK>
+0xE783 0x8F9C # <CJK>
+0xE784 0x8F9F # <CJK>
+0xE785 0x8FA3 # <CJK>
+0xE786 0x8FAD # <CJK>
+0xE787 0x8FAF # <CJK>
+0xE788 0x8FB7 # <CJK>
+0xE789 0x8FDA # <CJK>
+0xE78A 0x8FE5 # <CJK>
+0xE78B 0x8FE2 # <CJK>
+0xE78C 0x8FEA # <CJK>
+0xE78D 0x8FEF # <CJK>
+0xE78E 0x9087 # <CJK>
+0xE78F 0x8FF4 # <CJK>
+0xE790 0x9005 # <CJK>
+0xE791 0x8FF9 # <CJK>
+0xE792 0x8FFA # <CJK>
+0xE793 0x9011 # <CJK>
+0xE794 0x9015 # <CJK>
+0xE795 0x9021 # <CJK>
+0xE796 0x900D # <CJK>
+0xE797 0x901E # <CJK>
+0xE798 0x9016 # <CJK>
+0xE799 0x900B # <CJK>
+0xE79A 0x9027 # <CJK>
+0xE79B 0x9036 # <CJK>
+0xE79C 0x9035 # <CJK>
+0xE79D 0x9039 # <CJK>
+0xE79E 0x8FF8 # <CJK>
+0xE79F 0x904F # <CJK>
+0xE7A0 0x9050 # <CJK>
+0xE7A1 0x9051 # <CJK>
+0xE7A2 0x9052 # <CJK>
+0xE7A3 0x900E # <CJK>
+0xE7A4 0x9049 # <CJK>
+0xE7A5 0x903E # <CJK>
+0xE7A6 0x9056 # <CJK>
+0xE7A7 0x9058 # <CJK>
+0xE7A8 0x905E # <CJK>
+0xE7A9 0x9068 # <CJK>
+0xE7AA 0x906F # <CJK>
+0xE7AB 0x9076 # <CJK>
+0xE7AC 0x96A8 # <CJK>
+0xE7AD 0x9072 # <CJK>
+0xE7AE 0x9082 # <CJK>
+0xE7AF 0x907D # <CJK>
+0xE7B0 0x9081 # <CJK>
+0xE7B1 0x9080 # <CJK>
+0xE7B2 0x908A # <CJK>
+0xE7B3 0x9089 # <CJK>
+0xE7B4 0x908F # <CJK>
+0xE7B5 0x90A8 # <CJK>
+0xE7B6 0x90AF # <CJK>
+0xE7B7 0x90B1 # <CJK>
+0xE7B8 0x90B5 # <CJK>
+0xE7B9 0x90E2 # <CJK>
+0xE7BA 0x90E4 # <CJK>
+0xE7BB 0x6248 # <CJK>
+0xE7BC 0x90DB # <CJK>
+0xE7BD 0x9102 # <CJK>
+0xE7BE 0x9112 # <CJK>
+0xE7BF 0x9119 # <CJK>
+0xE7C0 0x9132 # <CJK>
+0xE7C1 0x9130 # <CJK>
+0xE7C2 0x914A # <CJK>
+0xE7C3 0x9156 # <CJK>
+0xE7C4 0x9158 # <CJK>
+0xE7C5 0x9163 # <CJK>
+0xE7C6 0x9165 # <CJK>
+0xE7C7 0x9169 # <CJK>
+0xE7C8 0x9173 # <CJK>
+0xE7C9 0x9172 # <CJK>
+0xE7CA 0x918B # <CJK>
+0xE7CB 0x9189 # <CJK>
+0xE7CC 0x9182 # <CJK>
+0xE7CD 0x91A2 # <CJK>
+0xE7CE 0x91AB # <CJK>
+0xE7CF 0x91AF # <CJK>
+0xE7D0 0x91AA # <CJK>
+0xE7D1 0x91B5 # <CJK>
+0xE7D2 0x91B4 # <CJK>
+0xE7D3 0x91BA # <CJK>
+0xE7D4 0x91C0 # <CJK>
+0xE7D5 0x91C1 # <CJK>
+0xE7D6 0x91C9 # <CJK>
+0xE7D7 0x91CB # <CJK>
+0xE7D8 0x91D0 # <CJK>
+0xE7D9 0x91D6 # <CJK>
+0xE7DA 0x91DF # <CJK>
+0xE7DB 0x91E1 # <CJK>
+0xE7DC 0x91DB # <CJK>
+0xE7DD 0x91FC # <CJK>
+0xE7DE 0x91F5 # <CJK>
+0xE7DF 0x91F6 # <CJK>
+0xE7E0 0x921E # <CJK>
+0xE7E1 0x91FF # <CJK>
+0xE7E2 0x9214 # <CJK>
+0xE7E3 0x922C # <CJK>
+0xE7E4 0x9215 # <CJK>
+0xE7E5 0x9211 # <CJK>
+0xE7E6 0x925E # <CJK>
+0xE7E7 0x9257 # <CJK>
+0xE7E8 0x9245 # <CJK>
+0xE7E9 0x9249 # <CJK>
+0xE7EA 0x9264 # <CJK>
+0xE7EB 0x9248 # <CJK>
+0xE7EC 0x9295 # <CJK>
+0xE7ED 0x923F # <CJK>
+0xE7EE 0x924B # <CJK>
+0xE7EF 0x9250 # <CJK>
+0xE7F0 0x929C # <CJK>
+0xE7F1 0x9296 # <CJK>
+0xE7F2 0x9293 # <CJK>
+0xE7F3 0x929B # <CJK>
+0xE7F4 0x925A # <CJK>
+0xE7F5 0x92CF # <CJK>
+0xE7F6 0x92B9 # <CJK>
+0xE7F7 0x92B7 # <CJK>
+0xE7F8 0x92E9 # <CJK>
+0xE7F9 0x930F # <CJK>
+0xE7FA 0x92FA # <CJK>
+0xE7FB 0x9344 # <CJK>
+0xE7FC 0x932E # <CJK>
+0xE840 0x9319 # <CJK>
+0xE841 0x9322 # <CJK>
+0xE842 0x931A # <CJK>
+0xE843 0x9323 # <CJK>
+0xE844 0x933A # <CJK>
+0xE845 0x9335 # <CJK>
+0xE846 0x933B # <CJK>
+0xE847 0x935C # <CJK>
+0xE848 0x9360 # <CJK>
+0xE849 0x937C # <CJK>
+0xE84A 0x936E # <CJK>
+0xE84B 0x9356 # <CJK>
+0xE84C 0x93B0 # <CJK>
+0xE84D 0x93AC # <CJK>
+0xE84E 0x93AD # <CJK>
+0xE84F 0x9394 # <CJK>
+0xE850 0x93B9 # <CJK>
+0xE851 0x93D6 # <CJK>
+0xE852 0x93D7 # <CJK>
+0xE853 0x93E8 # <CJK>
+0xE854 0x93E5 # <CJK>
+0xE855 0x93D8 # <CJK>
+0xE856 0x93C3 # <CJK>
+0xE857 0x93DD # <CJK>
+0xE858 0x93D0 # <CJK>
+0xE859 0x93C8 # <CJK>
+0xE85A 0x93E4 # <CJK>
+0xE85B 0x941A # <CJK>
+0xE85C 0x9414 # <CJK>
+0xE85D 0x9413 # <CJK>
+0xE85E 0x9403 # <CJK>
+0xE85F 0x9407 # <CJK>
+0xE860 0x9410 # <CJK>
+0xE861 0x9436 # <CJK>
+0xE862 0x942B # <CJK>
+0xE863 0x9435 # <CJK>
+0xE864 0x9421 # <CJK>
+0xE865 0x943A # <CJK>
+0xE866 0x9441 # <CJK>
+0xE867 0x9452 # <CJK>
+0xE868 0x9444 # <CJK>
+0xE869 0x945B # <CJK>
+0xE86A 0x9460 # <CJK>
+0xE86B 0x9462 # <CJK>
+0xE86C 0x945E # <CJK>
+0xE86D 0x946A # <CJK>
+0xE86E 0x9229 # <CJK>
+0xE86F 0x9470 # <CJK>
+0xE870 0x9475 # <CJK>
+0xE871 0x9477 # <CJK>
+0xE872 0x947D # <CJK>
+0xE873 0x945A # <CJK>
+0xE874 0x947C # <CJK>
+0xE875 0x947E # <CJK>
+0xE876 0x9481 # <CJK>
+0xE877 0x947F # <CJK>
+0xE878 0x9582 # <CJK>
+0xE879 0x9587 # <CJK>
+0xE87A 0x958A # <CJK>
+0xE87B 0x9594 # <CJK>
+0xE87C 0x9596 # <CJK>
+0xE87D 0x9598 # <CJK>
+0xE87E 0x9599 # <CJK>
+0xE880 0x95A0 # <CJK>
+0xE881 0x95A8 # <CJK>
+0xE882 0x95A7 # <CJK>
+0xE883 0x95AD # <CJK>
+0xE884 0x95BC # <CJK>
+0xE885 0x95BB # <CJK>
+0xE886 0x95B9 # <CJK>
+0xE887 0x95BE # <CJK>
+0xE888 0x95CA # <CJK>
+0xE889 0x6FF6 # <CJK>
+0xE88A 0x95C3 # <CJK>
+0xE88B 0x95CD # <CJK>
+0xE88C 0x95CC # <CJK>
+0xE88D 0x95D5 # <CJK>
+0xE88E 0x95D4 # <CJK>
+0xE88F 0x95D6 # <CJK>
+0xE890 0x95DC # <CJK>
+0xE891 0x95E1 # <CJK>
+0xE892 0x95E5 # <CJK>
+0xE893 0x95E2 # <CJK>
+0xE894 0x9621 # <CJK>
+0xE895 0x9628 # <CJK>
+0xE896 0x962E # <CJK>
+0xE897 0x962F # <CJK>
+0xE898 0x9642 # <CJK>
+0xE899 0x964C # <CJK>
+0xE89A 0x964F # <CJK>
+0xE89B 0x964B # <CJK>
+0xE89C 0x9677 # <CJK>
+0xE89D 0x965C # <CJK>
+0xE89E 0x965E # <CJK>
+0xE89F 0x965D # <CJK>
+0xE8A0 0x965F # <CJK>
+0xE8A1 0x9666 # <CJK>
+0xE8A2 0x9672 # <CJK>
+0xE8A3 0x966C # <CJK>
+0xE8A4 0x968D # <CJK>
+0xE8A5 0x9698 # <CJK>
+0xE8A6 0x9695 # <CJK>
+0xE8A7 0x9697 # <CJK>
+0xE8A8 0x96AA # <CJK>
+0xE8A9 0x96A7 # <CJK>
+0xE8AA 0x96B1 # <CJK>
+0xE8AB 0x96B2 # <CJK>
+0xE8AC 0x96B0 # <CJK>
+0xE8AD 0x96B4 # <CJK>
+0xE8AE 0x96B6 # <CJK>
+0xE8AF 0x96B8 # <CJK>
+0xE8B0 0x96B9 # <CJK>
+0xE8B1 0x96CE # <CJK>
+0xE8B2 0x96CB # <CJK>
+0xE8B3 0x96C9 # <CJK>
+0xE8B4 0x96CD # <CJK>
+0xE8B5 0x894D # <CJK>
+0xE8B6 0x96DC # <CJK>
+0xE8B7 0x970D # <CJK>
+0xE8B8 0x96D5 # <CJK>
+0xE8B9 0x96F9 # <CJK>
+0xE8BA 0x9704 # <CJK>
+0xE8BB 0x9706 # <CJK>
+0xE8BC 0x9708 # <CJK>
+0xE8BD 0x9713 # <CJK>
+0xE8BE 0x970E # <CJK>
+0xE8BF 0x9711 # <CJK>
+0xE8C0 0x970F # <CJK>
+0xE8C1 0x9716 # <CJK>
+0xE8C2 0x9719 # <CJK>
+0xE8C3 0x9724 # <CJK>
+0xE8C4 0x972A # <CJK>
+0xE8C5 0x9730 # <CJK>
+0xE8C6 0x9739 # <CJK>
+0xE8C7 0x973D # <CJK>
+0xE8C8 0x973E # <CJK>
+0xE8C9 0x9744 # <CJK>
+0xE8CA 0x9746 # <CJK>
+0xE8CB 0x9748 # <CJK>
+0xE8CC 0x9742 # <CJK>
+0xE8CD 0x9749 # <CJK>
+0xE8CE 0x975C # <CJK>
+0xE8CF 0x9760 # <CJK>
+0xE8D0 0x9764 # <CJK>
+0xE8D1 0x9766 # <CJK>
+0xE8D2 0x9768 # <CJK>
+0xE8D3 0x52D2 # <CJK>
+0xE8D4 0x976B # <CJK>
+0xE8D5 0x9771 # <CJK>
+0xE8D6 0x9779 # <CJK>
+0xE8D7 0x9785 # <CJK>
+0xE8D8 0x977C # <CJK>
+0xE8D9 0x9781 # <CJK>
+0xE8DA 0x977A # <CJK>
+0xE8DB 0x9786 # <CJK>
+0xE8DC 0x978B # <CJK>
+0xE8DD 0x978F # <CJK>
+0xE8DE 0x9790 # <CJK>
+0xE8DF 0x979C # <CJK>
+0xE8E0 0x97A8 # <CJK>
+0xE8E1 0x97A6 # <CJK>
+0xE8E2 0x97A3 # <CJK>
+0xE8E3 0x97B3 # <CJK>
+0xE8E4 0x97B4 # <CJK>
+0xE8E5 0x97C3 # <CJK>
+0xE8E6 0x97C6 # <CJK>
+0xE8E7 0x97C8 # <CJK>
+0xE8E8 0x97CB # <CJK>
+0xE8E9 0x97DC # <CJK>
+0xE8EA 0x97ED # <CJK>
+0xE8EB 0x9F4F # <CJK>
+0xE8EC 0x97F2 # <CJK>
+0xE8ED 0x7ADF # <CJK>
+0xE8EE 0x97F6 # <CJK>
+0xE8EF 0x97F5 # <CJK>
+0xE8F0 0x980F # <CJK>
+0xE8F1 0x980C # <CJK>
+0xE8F2 0x9838 # <CJK>
+0xE8F3 0x9824 # <CJK>
+0xE8F4 0x9821 # <CJK>
+0xE8F5 0x9837 # <CJK>
+0xE8F6 0x983D # <CJK>
+0xE8F7 0x9846 # <CJK>
+0xE8F8 0x984F # <CJK>
+0xE8F9 0x984B # <CJK>
+0xE8FA 0x986B # <CJK>
+0xE8FB 0x986F # <CJK>
+0xE8FC 0x9870 # <CJK>
+0xE940 0x9871 # <CJK>
+0xE941 0x9874 # <CJK>
+0xE942 0x9873 # <CJK>
+0xE943 0x98AA # <CJK>
+0xE944 0x98AF # <CJK>
+0xE945 0x98B1 # <CJK>
+0xE946 0x98B6 # <CJK>
+0xE947 0x98C4 # <CJK>
+0xE948 0x98C3 # <CJK>
+0xE949 0x98C6 # <CJK>
+0xE94A 0x98E9 # <CJK>
+0xE94B 0x98EB # <CJK>
+0xE94C 0x9903 # <CJK>
+0xE94D 0x9909 # <CJK>
+0xE94E 0x9912 # <CJK>
+0xE94F 0x9914 # <CJK>
+0xE950 0x9918 # <CJK>
+0xE951 0x9921 # <CJK>
+0xE952 0x991D # <CJK>
+0xE953 0x991E # <CJK>
+0xE954 0x9924 # <CJK>
+0xE955 0x9920 # <CJK>
+0xE956 0x992C # <CJK>
+0xE957 0x992E # <CJK>
+0xE958 0x993D # <CJK>
+0xE959 0x993E # <CJK>
+0xE95A 0x9942 # <CJK>
+0xE95B 0x9949 # <CJK>
+0xE95C 0x9945 # <CJK>
+0xE95D 0x9950 # <CJK>
+0xE95E 0x994B # <CJK>
+0xE95F 0x9951 # <CJK>
+0xE960 0x9952 # <CJK>
+0xE961 0x994C # <CJK>
+0xE962 0x9955 # <CJK>
+0xE963 0x9997 # <CJK>
+0xE964 0x9998 # <CJK>
+0xE965 0x99A5 # <CJK>
+0xE966 0x99AD # <CJK>
+0xE967 0x99AE # <CJK>
+0xE968 0x99BC # <CJK>
+0xE969 0x99DF # <CJK>
+0xE96A 0x99DB # <CJK>
+0xE96B 0x99DD # <CJK>
+0xE96C 0x99D8 # <CJK>
+0xE96D 0x99D1 # <CJK>
+0xE96E 0x99ED # <CJK>
+0xE96F 0x99EE # <CJK>
+0xE970 0x99F1 # <CJK>
+0xE971 0x99F2 # <CJK>
+0xE972 0x99FB # <CJK>
+0xE973 0x99F8 # <CJK>
+0xE974 0x9A01 # <CJK>
+0xE975 0x9A0F # <CJK>
+0xE976 0x9A05 # <CJK>
+0xE977 0x99E2 # <CJK>
+0xE978 0x9A19 # <CJK>
+0xE979 0x9A2B # <CJK>
+0xE97A 0x9A37 # <CJK>
+0xE97B 0x9A45 # <CJK>
+0xE97C 0x9A42 # <CJK>
+0xE97D 0x9A40 # <CJK>
+0xE97E 0x9A43 # <CJK>
+0xE980 0x9A3E # <CJK>
+0xE981 0x9A55 # <CJK>
+0xE982 0x9A4D # <CJK>
+0xE983 0x9A5B # <CJK>
+0xE984 0x9A57 # <CJK>
+0xE985 0x9A5F # <CJK>
+0xE986 0x9A62 # <CJK>
+0xE987 0x9A65 # <CJK>
+0xE988 0x9A64 # <CJK>
+0xE989 0x9A69 # <CJK>
+0xE98A 0x9A6B # <CJK>
+0xE98B 0x9A6A # <CJK>
+0xE98C 0x9AAD # <CJK>
+0xE98D 0x9AB0 # <CJK>
+0xE98E 0x9ABC # <CJK>
+0xE98F 0x9AC0 # <CJK>
+0xE990 0x9ACF # <CJK>
+0xE991 0x9AD1 # <CJK>
+0xE992 0x9AD3 # <CJK>
+0xE993 0x9AD4 # <CJK>
+0xE994 0x9ADE # <CJK>
+0xE995 0x9ADF # <CJK>
+0xE996 0x9AE2 # <CJK>
+0xE997 0x9AE3 # <CJK>
+0xE998 0x9AE6 # <CJK>
+0xE999 0x9AEF # <CJK>
+0xE99A 0x9AEB # <CJK>
+0xE99B 0x9AEE # <CJK>
+0xE99C 0x9AF4 # <CJK>
+0xE99D 0x9AF1 # <CJK>
+0xE99E 0x9AF7 # <CJK>
+0xE99F 0x9AFB # <CJK>
+0xE9A0 0x9B06 # <CJK>
+0xE9A1 0x9B18 # <CJK>
+0xE9A2 0x9B1A # <CJK>
+0xE9A3 0x9B1F # <CJK>
+0xE9A4 0x9B22 # <CJK>
+0xE9A5 0x9B23 # <CJK>
+0xE9A6 0x9B25 # <CJK>
+0xE9A7 0x9B27 # <CJK>
+0xE9A8 0x9B28 # <CJK>
+0xE9A9 0x9B29 # <CJK>
+0xE9AA 0x9B2A # <CJK>
+0xE9AB 0x9B2E # <CJK>
+0xE9AC 0x9B2F # <CJK>
+0xE9AD 0x9B32 # <CJK>
+0xE9AE 0x9B44 # <CJK>
+0xE9AF 0x9B43 # <CJK>
+0xE9B0 0x9B4F # <CJK>
+0xE9B1 0x9B4D # <CJK>
+0xE9B2 0x9B4E # <CJK>
+0xE9B3 0x9B51 # <CJK>
+0xE9B4 0x9B58 # <CJK>
+0xE9B5 0x9B74 # <CJK>
+0xE9B6 0x9B93 # <CJK>
+0xE9B7 0x9B83 # <CJK>
+0xE9B8 0x9B91 # <CJK>
+0xE9B9 0x9B96 # <CJK>
+0xE9BA 0x9B97 # <CJK>
+0xE9BB 0x9B9F # <CJK>
+0xE9BC 0x9BA0 # <CJK>
+0xE9BD 0x9BA8 # <CJK>
+0xE9BE 0x9BB4 # <CJK>
+0xE9BF 0x9BC0 # <CJK>
+0xE9C0 0x9BCA # <CJK>
+0xE9C1 0x9BB9 # <CJK>
+0xE9C2 0x9BC6 # <CJK>
+0xE9C3 0x9BCF # <CJK>
+0xE9C4 0x9BD1 # <CJK>
+0xE9C5 0x9BD2 # <CJK>
+0xE9C6 0x9BE3 # <CJK>
+0xE9C7 0x9BE2 # <CJK>
+0xE9C8 0x9BE4 # <CJK>
+0xE9C9 0x9BD4 # <CJK>
+0xE9CA 0x9BE1 # <CJK>
+0xE9CB 0x9C3A # <CJK>
+0xE9CC 0x9BF2 # <CJK>
+0xE9CD 0x9BF1 # <CJK>
+0xE9CE 0x9BF0 # <CJK>
+0xE9CF 0x9C15 # <CJK>
+0xE9D0 0x9C14 # <CJK>
+0xE9D1 0x9C09 # <CJK>
+0xE9D2 0x9C13 # <CJK>
+0xE9D3 0x9C0C # <CJK>
+0xE9D4 0x9C06 # <CJK>
+0xE9D5 0x9C08 # <CJK>
+0xE9D6 0x9C12 # <CJK>
+0xE9D7 0x9C0A # <CJK>
+0xE9D8 0x9C04 # <CJK>
+0xE9D9 0x9C2E # <CJK>
+0xE9DA 0x9C1B # <CJK>
+0xE9DB 0x9C25 # <CJK>
+0xE9DC 0x9C24 # <CJK>
+0xE9DD 0x9C21 # <CJK>
+0xE9DE 0x9C30 # <CJK>
+0xE9DF 0x9C47 # <CJK>
+0xE9E0 0x9C32 # <CJK>
+0xE9E1 0x9C46 # <CJK>
+0xE9E2 0x9C3E # <CJK>
+0xE9E3 0x9C5A # <CJK>
+0xE9E4 0x9C60 # <CJK>
+0xE9E5 0x9C67 # <CJK>
+0xE9E6 0x9C76 # <CJK>
+0xE9E7 0x9C78 # <CJK>
+0xE9E8 0x9CE7 # <CJK>
+0xE9E9 0x9CEC # <CJK>
+0xE9EA 0x9CF0 # <CJK>
+0xE9EB 0x9D09 # <CJK>
+0xE9EC 0x9D08 # <CJK>
+0xE9ED 0x9CEB # <CJK>
+0xE9EE 0x9D03 # <CJK>
+0xE9EF 0x9D06 # <CJK>
+0xE9F0 0x9D2A # <CJK>
+0xE9F1 0x9D26 # <CJK>
+0xE9F2 0x9DAF # <CJK>
+0xE9F3 0x9D23 # <CJK>
+0xE9F4 0x9D1F # <CJK>
+0xE9F5 0x9D44 # <CJK>
+0xE9F6 0x9D15 # <CJK>
+0xE9F7 0x9D12 # <CJK>
+0xE9F8 0x9D41 # <CJK>
+0xE9F9 0x9D3F # <CJK>
+0xE9FA 0x9D3E # <CJK>
+0xE9FB 0x9D46 # <CJK>
+0xE9FC 0x9D48 # <CJK>
+0xEA40 0x9D5D # <CJK>
+0xEA41 0x9D5E # <CJK>
+0xEA42 0x9D64 # <CJK>
+0xEA43 0x9D51 # <CJK>
+0xEA44 0x9D50 # <CJK>
+0xEA45 0x9D59 # <CJK>
+0xEA46 0x9D72 # <CJK>
+0xEA47 0x9D89 # <CJK>
+0xEA48 0x9D87 # <CJK>
+0xEA49 0x9DAB # <CJK>
+0xEA4A 0x9D6F # <CJK>
+0xEA4B 0x9D7A # <CJK>
+0xEA4C 0x9D9A # <CJK>
+0xEA4D 0x9DA4 # <CJK>
+0xEA4E 0x9DA9 # <CJK>
+0xEA4F 0x9DB2 # <CJK>
+0xEA50 0x9DC4 # <CJK>
+0xEA51 0x9DC1 # <CJK>
+0xEA52 0x9DBB # <CJK>
+0xEA53 0x9DB8 # <CJK>
+0xEA54 0x9DBA # <CJK>
+0xEA55 0x9DC6 # <CJK>
+0xEA56 0x9DCF # <CJK>
+0xEA57 0x9DC2 # <CJK>
+0xEA58 0x9DD9 # <CJK>
+0xEA59 0x9DD3 # <CJK>
+0xEA5A 0x9DF8 # <CJK>
+0xEA5B 0x9DE6 # <CJK>
+0xEA5C 0x9DED # <CJK>
+0xEA5D 0x9DEF # <CJK>
+0xEA5E 0x9DFD # <CJK>
+0xEA5F 0x9E1A # <CJK>
+0xEA60 0x9E1B # <CJK>
+0xEA61 0x9E1E # <CJK>
+0xEA62 0x9E75 # <CJK>
+0xEA63 0x9E79 # <CJK>
+0xEA64 0x9E7D # <CJK>
+0xEA65 0x9E81 # <CJK>
+0xEA66 0x9E88 # <CJK>
+0xEA67 0x9E8B # <CJK>
+0xEA68 0x9E8C # <CJK>
+0xEA69 0x9E92 # <CJK>
+0xEA6A 0x9E95 # <CJK>
+0xEA6B 0x9E91 # <CJK>
+0xEA6C 0x9E9D # <CJK>
+0xEA6D 0x9EA5 # <CJK>
+0xEA6E 0x9EA9 # <CJK>
+0xEA6F 0x9EB8 # <CJK>
+0xEA70 0x9EAA # <CJK>
+0xEA71 0x9EAD # <CJK>
+0xEA72 0x9761 # <CJK>
+0xEA73 0x9ECC # <CJK>
+0xEA74 0x9ECE # <CJK>
+0xEA75 0x9ECF # <CJK>
+0xEA76 0x9ED0 # <CJK>
+0xEA77 0x9ED4 # <CJK>
+0xEA78 0x9EDC # <CJK>
+0xEA79 0x9EDE # <CJK>
+0xEA7A 0x9EDD # <CJK>
+0xEA7B 0x9EE0 # <CJK>
+0xEA7C 0x9EE5 # <CJK>
+0xEA7D 0x9EE8 # <CJK>
+0xEA7E 0x9EEF # <CJK>
+0xEA80 0x9EF4 # <CJK>
+0xEA81 0x9EF6 # <CJK>
+0xEA82 0x9EF7 # <CJK>
+0xEA83 0x9EF9 # <CJK>
+0xEA84 0x9EFB # <CJK>
+0xEA85 0x9EFC # <CJK>
+0xEA86 0x9EFD # <CJK>
+0xEA87 0x9F07 # <CJK>
+0xEA88 0x9F08 # <CJK>
+0xEA89 0x76B7 # <CJK>
+0xEA8A 0x9F15 # <CJK>
+0xEA8B 0x9F21 # <CJK>
+0xEA8C 0x9F2C # <CJK>
+0xEA8D 0x9F3E # <CJK>
+0xEA8E 0x9F4A # <CJK>
+0xEA8F 0x9F52 # <CJK>
+0xEA90 0x9F54 # <CJK>
+0xEA91 0x9F63 # <CJK>
+0xEA92 0x9F5F # <CJK>
+0xEA93 0x9F60 # <CJK>
+0xEA94 0x9F61 # <CJK>
+0xEA95 0x9F66 # <CJK>
+0xEA96 0x9F67 # <CJK>
+0xEA97 0x9F6C # <CJK>
+0xEA98 0x9F6A # <CJK>
+0xEA99 0x9F77 # <CJK>
+0xEA9A 0x9F72 # <CJK>
+0xEA9B 0x9F76 # <CJK>
+0xEA9C 0x9F95 # <CJK>
+0xEA9D 0x9F9C # <CJK>
+0xEA9E 0x9FA0 # <CJK>
+0xEA9F 0x582F # <CJK>
+0xEAA0 0x69C7 # <CJK>
+0xEAA1 0x9059 # <CJK>
+0xEAA2 0x7464 # <CJK>
+0xEAA3 0x51DC # <CJK>
+0xEAA4 0x7199 # <CJK>
diff --git a/ext/mbstring/tests/data/SJIS-2004.txt b/ext/mbstring/tests/data/SJIS-2004.txt
new file mode 100644
index 0000000000..2db475d088
--- /dev/null
+++ b/ext/mbstring/tests/data/SJIS-2004.txt
@@ -0,0 +1,11549 @@
+## Shift_JIS-2004 (JIS X 0213:2004 Appendix 1) vs Unicode mapping table
+##
+## Date: 3 May 2009
+## License:
+## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
+## Copyright (C) 2001 I'O, All Rights Reserved.
+## Copyright (C) 2006, 2009 Project X0213, All Rights Reserved.
+## You can use, modify, distribute this table freely.
+## Note:
+## [1983] JIS codepoint defined by JIS X 0208-1983
+## [1990] JIS codepoint defined by JIS X 0208-1990
+## [2000] JIS codepoint defined by JIS X 0213:2000
+## [2004] JIS codepoint defined by JIS X 0213:2004
+## [Unicode3.1] UCS codepoint defined by Unicode 3.1
+## [Unicode3.2] UCS codepoint defined by Unicode 3.2
+## Fullwidth UCS fullwidth form (U+Fxxx)
+## Windows Windows (CP932) mapping
+## Some 0213 character can't represent by one UCS character.
+## In this table, such characters are described as 'U+xxxx+xxxx'.
+##
+## JIS Unicode Name Note
+0x00 U+0000 # <control>
+0x01 U+0001 # <control>
+0x02 U+0002 # <control>
+0x03 U+0003 # <control>
+0x04 U+0004 # <control>
+0x05 U+0005 # <control>
+0x06 U+0006 # <control>
+0x07 U+0007 # <control>
+0x08 U+0008 # <control>
+0x09 U+0009 # <control>
+0x0A U+000A # <control>
+0x0B U+000B # <control>
+0x0C U+000C # <control>
+0x0D U+000D # <control>
+0x0E U+000E # <control>
+0x0F U+000F # <control>
+0x10 U+0010 # <control>
+0x11 U+0011 # <control>
+0x12 U+0012 # <control>
+0x13 U+0013 # <control>
+0x14 U+0014 # <control>
+0x15 U+0015 # <control>
+0x16 U+0016 # <control>
+0x17 U+0017 # <control>
+0x18 U+0018 # <control>
+0x19 U+0019 # <control>
+0x1A U+001A # <control>
+0x1B U+001B # <control>
+0x1C U+001C # <control>
+0x1D U+001D # <control>
+0x1E U+001E # <control>
+0x1F U+001F # <control>
+0x20 U+0020 # SPACE
+0x21 U+0021 # EXCLAMATION MARK
+0x22 U+0022 # QUOTATION MARK
+0x23 U+0023 # NUMBER SIGN
+0x24 U+0024 # DOLLAR SIGN
+0x25 U+0025 # PERCENT SIGN
+0x26 U+0026 # AMPERSAND
+0x27 U+0027 # APOSTROPHE
+0x28 U+0028 # LEFT PARENTHESIS
+0x29 U+0029 # RIGHT PARENTHESIS
+0x2A U+002A # ASTERISK
+0x2B U+002B # PLUS SIGN
+0x2C U+002C # COMMA
+0x2D U+002D # HYPHEN-MINUS
+0x2E U+002E # FULL STOP
+0x2F U+002F # SOLIDUS
+0x30 U+0030 # DIGIT ZERO
+0x31 U+0031 # DIGIT ONE
+0x32 U+0032 # DIGIT TWO
+0x33 U+0033 # DIGIT THREE
+0x34 U+0034 # DIGIT FOUR
+0x35 U+0035 # DIGIT FIVE
+0x36 U+0036 # DIGIT SIX
+0x37 U+0037 # DIGIT SEVEN
+0x38 U+0038 # DIGIT EIGHT
+0x39 U+0039 # DIGIT NINE
+0x3A U+003A # COLON
+0x3B U+003B # SEMICOLON
+0x3C U+003C # LESS-THAN SIGN
+0x3D U+003D # EQUALS SIGN
+0x3E U+003E # GREATER-THAN SIGN
+0x3F U+003F # QUESTION MARK
+0x40 U+0040 # COMMERCIAL AT
+0x41 U+0041 # LATIN CAPITAL LETTER A
+0x42 U+0042 # LATIN CAPITAL LETTER B
+0x43 U+0043 # LATIN CAPITAL LETTER C
+0x44 U+0044 # LATIN CAPITAL LETTER D
+0x45 U+0045 # LATIN CAPITAL LETTER E
+0x46 U+0046 # LATIN CAPITAL LETTER F
+0x47 U+0047 # LATIN CAPITAL LETTER G
+0x48 U+0048 # LATIN CAPITAL LETTER H
+0x49 U+0049 # LATIN CAPITAL LETTER I
+0x4A U+004A # LATIN CAPITAL LETTER J
+0x4B U+004B # LATIN CAPITAL LETTER K
+0x4C U+004C # LATIN CAPITAL LETTER L
+0x4D U+004D # LATIN CAPITAL LETTER M
+0x4E U+004E # LATIN CAPITAL LETTER N
+0x4F U+004F # LATIN CAPITAL LETTER O
+0x50 U+0050 # LATIN CAPITAL LETTER P
+0x51 U+0051 # LATIN CAPITAL LETTER Q
+0x52 U+0052 # LATIN CAPITAL LETTER R
+0x53 U+0053 # LATIN CAPITAL LETTER S
+0x54 U+0054 # LATIN CAPITAL LETTER T
+0x55 U+0055 # LATIN CAPITAL LETTER U
+0x56 U+0056 # LATIN CAPITAL LETTER V
+0x57 U+0057 # LATIN CAPITAL LETTER W
+0x58 U+0058 # LATIN CAPITAL LETTER X
+0x59 U+0059 # LATIN CAPITAL LETTER Y
+0x5A U+005A # LATIN CAPITAL LETTER Z
+0x5B U+005B # LEFT SQUARE BRACKET
+0x5C U+00A5 # YEN SIGN
+0x5D U+005D # RIGHT SQUARE BRACKET
+0x5E U+005E # CIRCUMFLEX ACCENT
+0x5F U+005F # LOW LINE
+0x60 U+0060 # GRAVE ACCENT
+0x61 U+0061 # LATIN SMALL LETTER A
+0x62 U+0062 # LATIN SMALL LETTER B
+0x63 U+0063 # LATIN SMALL LETTER C
+0x64 U+0064 # LATIN SMALL LETTER D
+0x65 U+0065 # LATIN SMALL LETTER E
+0x66 U+0066 # LATIN SMALL LETTER F
+0x67 U+0067 # LATIN SMALL LETTER G
+0x68 U+0068 # LATIN SMALL LETTER H
+0x69 U+0069 # LATIN SMALL LETTER I
+0x6A U+006A # LATIN SMALL LETTER J
+0x6B U+006B # LATIN SMALL LETTER K
+0x6C U+006C # LATIN SMALL LETTER L
+0x6D U+006D # LATIN SMALL LETTER M
+0x6E U+006E # LATIN SMALL LETTER N
+0x6F U+006F # LATIN SMALL LETTER O
+0x70 U+0070 # LATIN SMALL LETTER P
+0x71 U+0071 # LATIN SMALL LETTER Q
+0x72 U+0072 # LATIN SMALL LETTER R
+0x73 U+0073 # LATIN SMALL LETTER S
+0x74 U+0074 # LATIN SMALL LETTER T
+0x75 U+0075 # LATIN SMALL LETTER U
+0x76 U+0076 # LATIN SMALL LETTER V
+0x77 U+0077 # LATIN SMALL LETTER W
+0x78 U+0078 # LATIN SMALL LETTER X
+0x79 U+0079 # LATIN SMALL LETTER Y
+0x7A U+007A # LATIN SMALL LETTER Z
+0x7B U+007B # LEFT CURLY BRACKET
+0x7C U+007C # VERTICAL LINE
+0x7D U+007D # RIGHT CURLY BRACKET
+0x7E U+203E # OVERLINE
+0x7F U+007F # <control>
+0x80 # <reserved>
+0x81 # <doublebytes>
+0x82 # <doublebytes>
+0x83 # <doublebytes>
+0x84 # <doublebytes>
+0x85 # <doublebytes>
+0x86 # <doublebytes>
+0x87 # <doublebytes>
+0x88 # <doublebytes>
+0x89 # <doublebytes>
+0x8A # <doublebytes>
+0x8B # <doublebytes>
+0x8C # <doublebytes>
+0x8D # <doublebytes>
+0x8E # <doublebytes>
+0x8F # <doublebytes>
+0x90 # <doublebytes>
+0x91 # <doublebytes>
+0x92 # <doublebytes>
+0x93 # <doublebytes>
+0x94 # <doublebytes>
+0x95 # <doublebytes>
+0x96 # <doublebytes>
+0x97 # <doublebytes>
+0x98 # <doublebytes>
+0x99 # <doublebytes>
+0x9A # <doublebytes>
+0x9B # <doublebytes>
+0x9C # <doublebytes>
+0x9D # <doublebytes>
+0x9E # <doublebytes>
+0x9F # <doublebytes>
+0xA0 # <reserved>
+0xA1 U+FF61 # HALFWIDTH IDEOGRAPHIC FULL STOP
+0xA2 U+FF62 # HALFWIDTH LEFT CORNER BRACKET
+0xA3 U+FF63 # HALFWIDTH RIGHT CORNER BRACKET
+0xA4 U+FF64 # HALFWIDTH IDEOGRAPHIC COMMA
+0xA5 U+FF65 # HALFWIDTH KATAKANA MIDDLE DOT
+0xA6 U+FF66 # HALFWIDTH KATAKANA LETTER WO
+0xA7 U+FF67 # HALFWIDTH KATAKANA LETTER SMALL A
+0xA8 U+FF68 # HALFWIDTH KATAKANA LETTER SMALL I
+0xA9 U+FF69 # HALFWIDTH KATAKANA LETTER SMALL U
+0xAA U+FF6A # HALFWIDTH KATAKANA LETTER SMALL E
+0xAB U+FF6B # HALFWIDTH KATAKANA LETTER SMALL O
+0xAC U+FF6C # HALFWIDTH KATAKANA LETTER SMALL YA
+0xAD U+FF6D # HALFWIDTH KATAKANA LETTER SMALL YU
+0xAE U+FF6E # HALFWIDTH KATAKANA LETTER SMALL YO
+0xAF U+FF6F # HALFWIDTH KATAKANA LETTER SMALL TU
+0xB0 U+FF70 # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0xB1 U+FF71 # HALFWIDTH KATAKANA LETTER A
+0xB2 U+FF72 # HALFWIDTH KATAKANA LETTER I
+0xB3 U+FF73 # HALFWIDTH KATAKANA LETTER U
+0xB4 U+FF74 # HALFWIDTH KATAKANA LETTER E
+0xB5 U+FF75 # HALFWIDTH KATAKANA LETTER O
+0xB6 U+FF76 # HALFWIDTH KATAKANA LETTER KA
+0xB7 U+FF77 # HALFWIDTH KATAKANA LETTER KI
+0xB8 U+FF78 # HALFWIDTH KATAKANA LETTER KU
+0xB9 U+FF79 # HALFWIDTH KATAKANA LETTER KE
+0xBA U+FF7A # HALFWIDTH KATAKANA LETTER KO
+0xBB U+FF7B # HALFWIDTH KATAKANA LETTER SA
+0xBC U+FF7C # HALFWIDTH KATAKANA LETTER SI
+0xBD U+FF7D # HALFWIDTH KATAKANA LETTER SU
+0xBE U+FF7E # HALFWIDTH KATAKANA LETTER SE
+0xBF U+FF7F # HALFWIDTH KATAKANA LETTER SO
+0xC0 U+FF80 # HALFWIDTH KATAKANA LETTER TA
+0xC1 U+FF81 # HALFWIDTH KATAKANA LETTER TI
+0xC2 U+FF82 # HALFWIDTH KATAKANA LETTER TU
+0xC3 U+FF83 # HALFWIDTH KATAKANA LETTER TE
+0xC4 U+FF84 # HALFWIDTH KATAKANA LETTER TO
+0xC5 U+FF85 # HALFWIDTH KATAKANA LETTER NA
+0xC6 U+FF86 # HALFWIDTH KATAKANA LETTER NI
+0xC7 U+FF87 # HALFWIDTH KATAKANA LETTER NU
+0xC8 U+FF88 # HALFWIDTH KATAKANA LETTER NE
+0xC9 U+FF89 # HALFWIDTH KATAKANA LETTER NO
+0xCA U+FF8A # HALFWIDTH KATAKANA LETTER HA
+0xCB U+FF8B # HALFWIDTH KATAKANA LETTER HI
+0xCC U+FF8C # HALFWIDTH KATAKANA LETTER HU
+0xCD U+FF8D # HALFWIDTH KATAKANA LETTER HE
+0xCE U+FF8E # HALFWIDTH KATAKANA LETTER HO
+0xCF U+FF8F # HALFWIDTH KATAKANA LETTER MA
+0xD0 U+FF90 # HALFWIDTH KATAKANA LETTER MI
+0xD1 U+FF91 # HALFWIDTH KATAKANA LETTER MU
+0xD2 U+FF92 # HALFWIDTH KATAKANA LETTER ME
+0xD3 U+FF93 # HALFWIDTH KATAKANA LETTER MO
+0xD4 U+FF94 # HALFWIDTH KATAKANA LETTER YA
+0xD5 U+FF95 # HALFWIDTH KATAKANA LETTER YU
+0xD6 U+FF96 # HALFWIDTH KATAKANA LETTER YO
+0xD7 U+FF97 # HALFWIDTH KATAKANA LETTER RA
+0xD8 U+FF98 # HALFWIDTH KATAKANA LETTER RI
+0xD9 U+FF99 # HALFWIDTH KATAKANA LETTER RU
+0xDA U+FF9A # HALFWIDTH KATAKANA LETTER RE
+0xDB U+FF9B # HALFWIDTH KATAKANA LETTER RO
+0xDC U+FF9C # HALFWIDTH KATAKANA LETTER WA
+0xDD U+FF9D # HALFWIDTH KATAKANA LETTER N
+0xDE U+FF9E # HALFWIDTH KATAKANA VOICED SOUND MARK
+0xDF U+FF9F # HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+0xE0 # <doublebytes>
+0xE1 # <doublebytes>
+0xE2 # <doublebytes>
+0xE3 # <doublebytes>
+0xE4 # <doublebytes>
+0xE5 # <doublebytes>
+0xE6 # <doublebytes>
+0xE7 # <doublebytes>
+0xE8 # <doublebytes>
+0xE9 # <doublebytes>
+0xEA # <doublebytes>
+0xEB # <doublebytes>
+0xEC # <doublebytes>
+0xED # <doublebytes>
+0xEE # <doublebytes>
+0xEF # <doublebytes>
+0xF0 # <doublebytes>
+0xF1 # <doublebytes>
+0xF2 # <doublebytes>
+0xF3 # <doublebytes>
+0xF4 # <doublebytes>
+0xF5 # <doublebytes>
+0xF6 # <doublebytes>
+0xF7 # <doublebytes>
+0xF8 # <doublebytes>
+0xF9 # <doublebytes>
+0xFA # <doublebytes>
+0xFB # <doublebytes>
+0xFC # <doublebytes>
+0xFD # <reserved>
+0xFE # <reserved>
+0xFF # <reserved>
+0x8140 U+3000 # IDEOGRAPHIC SPACE
+0x8141 U+3001 # IDEOGRAPHIC COMMA
+0x8142 U+3002 # IDEOGRAPHIC FULL STOP
+0x8143 U+FF0C # FULLWIDTH COMMA
+0x8144 U+FF0E # FULLWIDTH FULL STOP
+0x8145 U+30FB # KATAKANA MIDDLE DOT
+0x8146 U+FF1A # FULLWIDTH COLON
+0x8147 U+FF1B # FULLWIDTH SEMICOLON
+0x8148 U+FF1F # FULLWIDTH QUESTION MARK
+0x8149 U+FF01 # FULLWIDTH EXCLAMATION MARK
+0x814A U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK
+0x814B U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+0x814C U+00B4 # ACUTE ACCENT
+0x814D U+FF40 # FULLWIDTH GRAVE ACCENT
+0x814E U+00A8 # DIAERESIS
+0x814F U+FF3E # FULLWIDTH CIRCUMFLEX ACCENT
+0x8150 U+FFE3 # FULLWIDTH MACRON
+0x8151 U+FF3F # FULLWIDTH LOW LINE
+0x8152 U+30FD # KATAKANA ITERATION MARK
+0x8153 U+30FE # KATAKANA VOICED ITERATION MARK
+0x8154 U+309D # HIRAGANA ITERATION MARK
+0x8155 U+309E # HIRAGANA VOICED ITERATION MARK
+0x8156 U+3003 # DITTO MARK
+0x8157 U+4EDD # <cjk>
+0x8158 U+3005 # IDEOGRAPHIC ITERATION MARK
+0x8159 U+3006 # IDEOGRAPHIC CLOSING MARK
+0x815A U+3007 # IDEOGRAPHIC NUMBER ZERO
+0x815B U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+0x815C U+2014 # EM DASH Windows: U+2015
+0x815D U+2010 # HYPHEN
+0x815E U+FF0F # FULLWIDTH SOLIDUS
+0x815F U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C
+0x8160 U+301C # WAVE DASH Windows: U+FF5E
+0x8161 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225
+0x8162 U+FF5C # FULLWIDTH VERTICAL LINE
+0x8163 U+2026 # HORIZONTAL ELLIPSIS
+0x8164 U+2025 # TWO DOT LEADER
+0x8165 U+2018 # LEFT SINGLE QUOTATION MARK
+0x8166 U+2019 # RIGHT SINGLE QUOTATION MARK
+0x8167 U+201C # LEFT DOUBLE QUOTATION MARK
+0x8168 U+201D # RIGHT DOUBLE QUOTATION MARK
+0x8169 U+FF08 # FULLWIDTH LEFT PARENTHESIS
+0x816A U+FF09 # FULLWIDTH RIGHT PARENTHESIS
+0x816B U+3014 # LEFT TORTOISE SHELL BRACKET
+0x816C U+3015 # RIGHT TORTOISE SHELL BRACKET
+0x816D U+FF3B # FULLWIDTH LEFT SQUARE BRACKET
+0x816E U+FF3D # FULLWIDTH RIGHT SQUARE BRACKET
+0x816F U+FF5B # FULLWIDTH LEFT CURLY BRACKET
+0x8170 U+FF5D # FULLWIDTH RIGHT CURLY BRACKET
+0x8171 U+3008 # LEFT ANGLE BRACKET
+0x8172 U+3009 # RIGHT ANGLE BRACKET
+0x8173 U+300A # LEFT DOUBLE ANGLE BRACKET
+0x8174 U+300B # RIGHT DOUBLE ANGLE BRACKET
+0x8175 U+300C # LEFT CORNER BRACKET
+0x8176 U+300D # RIGHT CORNER BRACKET
+0x8177 U+300E # LEFT WHITE CORNER BRACKET
+0x8178 U+300F # RIGHT WHITE CORNER BRACKET
+0x8179 U+3010 # LEFT BLACK LENTICULAR BRACKET
+0x817A U+3011 # RIGHT BLACK LENTICULAR BRACKET
+0x817B U+FF0B # FULLWIDTH PLUS SIGN
+0x817C U+2212 # MINUS SIGN Windows: U+FF0D
+0x817D U+00B1 # PLUS-MINUS SIGN
+0x817E U+00D7 # MULTIPLICATION SIGN
+0x8180 U+00F7 # DIVISION SIGN
+0x8181 U+FF1D # FULLWIDTH EQUALS SIGN
+0x8182 U+2260 # NOT EQUAL TO
+0x8183 U+FF1C # FULLWIDTH LESS-THAN SIGN
+0x8184 U+FF1E # FULLWIDTH GREATER-THAN SIGN
+0x8185 U+2266 # LESS-THAN OVER EQUAL TO
+0x8186 U+2267 # GREATER-THAN OVER EQUAL TO
+0x8187 U+221E # INFINITY
+0x8188 U+2234 # THEREFORE
+0x8189 U+2642 # MALE SIGN
+0x818A U+2640 # FEMALE SIGN
+0x818B U+00B0 # DEGREE SIGN
+0x818C U+2032 # PRIME
+0x818D U+2033 # DOUBLE PRIME
+0x818E U+2103 # DEGREE CELSIUS
+0x818F U+FFE5 # FULLWIDTH YEN SIGN
+0x8190 U+FF04 # FULLWIDTH DOLLAR SIGN
+0x8191 U+00A2 # CENT SIGN Windows: U+FFE0
+0x8192 U+00A3 # POUND SIGN Windows: U+FFE1
+0x8193 U+FF05 # FULLWIDTH PERCENT SIGN
+0x8194 U+FF03 # FULLWIDTH NUMBER SIGN
+0x8195 U+FF06 # FULLWIDTH AMPERSAND
+0x8196 U+FF0A # FULLWIDTH ASTERISK
+0x8197 U+FF20 # FULLWIDTH COMMERCIAL AT
+0x8198 U+00A7 # SECTION SIGN
+0x8199 U+2606 # WHITE STAR
+0x819A U+2605 # BLACK STAR
+0x819B U+25CB # WHITE CIRCLE
+0x819C U+25CF # BLACK CIRCLE
+0x819D U+25CE # BULLSEYE
+0x819E U+25C7 # WHITE DIAMOND
+0x819F U+25C6 # BLACK DIAMOND
+0x81A0 U+25A1 # WHITE SQUARE
+0x81A1 U+25A0 # BLACK SQUARE
+0x81A2 U+25B3 # WHITE UP-POINTING TRIANGLE
+0x81A3 U+25B2 # BLACK UP-POINTING TRIANGLE
+0x81A4 U+25BD # WHITE DOWN-POINTING TRIANGLE
+0x81A5 U+25BC # BLACK DOWN-POINTING TRIANGLE
+0x81A6 U+203B # REFERENCE MARK
+0x81A7 U+3012 # POSTAL MARK
+0x81A8 U+2192 # RIGHTWARDS ARROW
+0x81A9 U+2190 # LEFTWARDS ARROW
+0x81AA U+2191 # UPWARDS ARROW
+0x81AB U+2193 # DOWNWARDS ARROW
+0x81AC U+3013 # GETA MARK
+0x81AD U+FF07 # FULLWIDTH APOSTROPHE [2000]
+0x81AE U+FF02 # FULLWIDTH QUOTATION MARK [2000]
+0x81AF U+FF0D # FULLWIDTH HYPHEN-MINUS [2000]
+0x81B0 U+007E # TILDE [2000] Fullwidth: U+FF5E
+0x81B1 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000]
+0x81B2 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000]
+0x81B3 U+3035 # VERTICAL KANA REPEAT MARK LOWER HALF [2000]
+0x81B4 U+303B # VERTICAL IDEOGRAPHIC ITERATION MARK [2000] [Unicode3.2]
+0x81B5 U+303C # MASU MARK [2000] [Unicode3.2]
+0x81B6 U+30FF # KATAKANA DIGRAPH KOTO [2000] [Unicode3.2]
+0x81B7 U+309F # HIRAGANA DIGRAPH YORI [2000] [Unicode3.2]
+0x81B8 U+2208 # ELEMENT OF [1983]
+0x81B9 U+220B # CONTAINS AS MEMBER [1983]
+0x81BA U+2286 # SUBSET OF OR EQUAL TO [1983]
+0x81BB U+2287 # SUPERSET OF OR EQUAL TO [1983]
+0x81BC U+2282 # SUBSET OF [1983]
+0x81BD U+2283 # SUPERSET OF [1983]
+0x81BE U+222A # UNION [1983]
+0x81BF U+2229 # INTERSECTION [1983]
+0x81C0 U+2284 # NOT A SUBSET OF [2000]
+0x81C1 U+2285 # NOT A SUPERSET OF [2000]
+0x81C2 U+228A # SUBSET OF WITH NOT EQUAL TO [2000]
+0x81C3 U+228B # SUPERSET OF WITH NOT EQUAL TO [2000]
+0x81C4 U+2209 # NOT AN ELEMENT OF [2000]
+0x81C5 U+2205 # EMPTY SET [2000]
+0x81C6 U+2305 # PROJECTIVE [2000]
+0x81C7 U+2306 # PERSPECTIVE [2000]
+0x81C8 U+2227 # LOGICAL AND [1983]
+0x81C9 U+2228 # LOGICAL OR [1983]
+0x81CA U+00AC # NOT SIGN [1983] Windows: U+FFE2
+0x81CB U+21D2 # RIGHTWARDS DOUBLE ARROW [1983]
+0x81CC U+21D4 # LEFT RIGHT DOUBLE ARROW [1983]
+0x81CD U+2200 # FOR ALL [1983]
+0x81CE U+2203 # THERE EXISTS [1983]
+0x81CF U+2295 # CIRCLED PLUS [2000]
+0x81D0 U+2296 # CIRCLED MINUS [2000]
+0x81D1 U+2297 # CIRCLED TIMES [2000]
+0x81D2 U+2225 # PARALLEL TO [2000]
+0x81D3 U+2226 # NOT PARALLEL TO [2000]
+0x81D4 U+FF5F # FULLWIDTH LEFT WHITE PARENTHESIS [2000] [Unicode3.2]
+0x81D5 U+FF60 # FULLWIDTH RIGHT WHITE PARENTHESIS [2000] [Unicode3.2]
+0x81D6 U+3018 # LEFT WHITE TORTOISE SHELL BRACKET [2000]
+0x81D7 U+3019 # RIGHT WHITE TORTOISE SHELL BRACKET [2000]
+0x81D8 U+3016 # LEFT WHITE LENTICULAR BRACKET [2000]
+0x81D9 U+3017 # RIGHT WHITE LENTICULAR BRACKET [2000]
+0x81DA U+2220 # ANGLE [1983]
+0x81DB U+22A5 # UP TACK [1983]
+0x81DC U+2312 # ARC [1983]
+0x81DD U+2202 # PARTIAL DIFFERENTIAL [1983]
+0x81DE U+2207 # NABLA [1983]
+0x81DF U+2261 # IDENTICAL TO [1983]
+0x81E0 U+2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF [1983]
+0x81E1 U+226A # MUCH LESS-THAN [1983]
+0x81E2 U+226B # MUCH GREATER-THAN [1983]
+0x81E3 U+221A # SQUARE ROOT [1983]
+0x81E4 U+223D # REVERSED TILDE [1983]
+0x81E5 U+221D # PROPORTIONAL TO [1983]
+0x81E6 U+2235 # BECAUSE [1983]
+0x81E7 U+222B # INTEGRAL [1983]
+0x81E8 U+222C # DOUBLE INTEGRAL [1983]
+0x81E9 U+2262 # NOT IDENTICAL TO [2000]
+0x81EA U+2243 # ASYMPTOTICALLY EQUAL TO [2000]
+0x81EB U+2245 # APPROXIMATELY EQUAL TO [2000]
+0x81EC U+2248 # ALMOST EQUAL TO [2000]
+0x81ED U+2276 # LESS-THAN OR GREATER-THAN [2000]
+0x81EE U+2277 # GREATER-THAN OR LESS-THAN [2000]
+0x81EF U+2194 # LEFT RIGHT ARROW [2000]
+0x81F0 U+212B # ANGSTROM SIGN [1983]
+0x81F1 U+2030 # PER MILLE SIGN [1983]
+0x81F2 U+266F # MUSIC SHARP SIGN [1983]
+0x81F3 U+266D # MUSIC FLAT SIGN [1983]
+0x81F4 U+266A # EIGHTH NOTE [1983]
+0x81F5 U+2020 # DAGGER [1983]
+0x81F6 U+2021 # DOUBLE DAGGER [1983]
+0x81F7 U+00B6 # PILCROW SIGN [1983]
+0x81F8 U+266E # MUSIC NATURAL SIGN [2000]
+0x81F9 U+266B # BEAMED EIGHTH NOTES [2000]
+0x81FA U+266C # BEAMED SIXTEENTH NOTES [2000]
+0x81FB U+2669 # QUARTER NOTE [2000]
+0x81FC U+25EF # LARGE CIRCLE [1983]
+0x8240 U+25B7 # WHITE RIGHT-POINTING TRIANGLE [2000]
+0x8241 U+25B6 # BLACK RIGHT-POINTING TRIANGLE [2000]
+0x8242 U+25C1 # WHITE LEFT-POINTING TRIANGLE [2000]
+0x8243 U+25C0 # BLACK LEFT-POINTING TRIANGLE [2000]
+0x8244 U+2197 # NORTH EAST ARROW [2000]
+0x8245 U+2198 # SOUTH EAST ARROW [2000]
+0x8246 U+2196 # NORTH WEST ARROW [2000]
+0x8247 U+2199 # SOUTH WEST ARROW [2000]
+0x8248 U+21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW [2000]
+0x8249 U+21E8 # RIGHTWARDS WHITE ARROW [2000]
+0x824A U+21E6 # LEFTWARDS WHITE ARROW [2000]
+0x824B U+21E7 # UPWARDS WHITE ARROW [2000]
+0x824C U+21E9 # DOWNWARDS WHITE ARROW [2000]
+0x824D U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2]
+0x824E U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2]
+0x824F U+FF10 # FULLWIDTH DIGIT ZERO
+0x8250 U+FF11 # FULLWIDTH DIGIT ONE
+0x8251 U+FF12 # FULLWIDTH DIGIT TWO
+0x8252 U+FF13 # FULLWIDTH DIGIT THREE
+0x8253 U+FF14 # FULLWIDTH DIGIT FOUR
+0x8254 U+FF15 # FULLWIDTH DIGIT FIVE
+0x8255 U+FF16 # FULLWIDTH DIGIT SIX
+0x8256 U+FF17 # FULLWIDTH DIGIT SEVEN
+0x8257 U+FF18 # FULLWIDTH DIGIT EIGHT
+0x8258 U+FF19 # FULLWIDTH DIGIT NINE
+0x8259 U+29BF # CIRCLED BULLET [2000] [Unicode3.2]
+0x825A U+25C9 # FISHEYE [2000]
+0x825B U+303D # PART ALTERNATION MARK [2000] [Unicode3.2]
+0x825C U+FE46 # WHITE SESAME DOT [2000] [Unicode3.2]
+0x825D U+FE45 # SESAME DOT [2000] [Unicode3.2]
+0x825E U+25E6 # WHITE BULLET [2000]
+0x825F U+2022 # BULLET [2000]
+0x8260 U+FF21 # FULLWIDTH LATIN CAPITAL LETTER A
+0x8261 U+FF22 # FULLWIDTH LATIN CAPITAL LETTER B
+0x8262 U+FF23 # FULLWIDTH LATIN CAPITAL LETTER C
+0x8263 U+FF24 # FULLWIDTH LATIN CAPITAL LETTER D
+0x8264 U+FF25 # FULLWIDTH LATIN CAPITAL LETTER E
+0x8265 U+FF26 # FULLWIDTH LATIN CAPITAL LETTER F
+0x8266 U+FF27 # FULLWIDTH LATIN CAPITAL LETTER G
+0x8267 U+FF28 # FULLWIDTH LATIN CAPITAL LETTER H
+0x8268 U+FF29 # FULLWIDTH LATIN CAPITAL LETTER I
+0x8269 U+FF2A # FULLWIDTH LATIN CAPITAL LETTER J
+0x826A U+FF2B # FULLWIDTH LATIN CAPITAL LETTER K
+0x826B U+FF2C # FULLWIDTH LATIN CAPITAL LETTER L
+0x826C U+FF2D # FULLWIDTH LATIN CAPITAL LETTER M
+0x826D U+FF2E # FULLWIDTH LATIN CAPITAL LETTER N
+0x826E U+FF2F # FULLWIDTH LATIN CAPITAL LETTER O
+0x826F U+FF30 # FULLWIDTH LATIN CAPITAL LETTER P
+0x8270 U+FF31 # FULLWIDTH LATIN CAPITAL LETTER Q
+0x8271 U+FF32 # FULLWIDTH LATIN CAPITAL LETTER R
+0x8272 U+FF33 # FULLWIDTH LATIN CAPITAL LETTER S
+0x8273 U+FF34 # FULLWIDTH LATIN CAPITAL LETTER T
+0x8274 U+FF35 # FULLWIDTH LATIN CAPITAL LETTER U
+0x8275 U+FF36 # FULLWIDTH LATIN CAPITAL LETTER V
+0x8276 U+FF37 # FULLWIDTH LATIN CAPITAL LETTER W
+0x8277 U+FF38 # FULLWIDTH LATIN CAPITAL LETTER X
+0x8278 U+FF39 # FULLWIDTH LATIN CAPITAL LETTER Y
+0x8279 U+FF3A # FULLWIDTH LATIN CAPITAL LETTER Z
+0x827A U+2213 # MINUS-OR-PLUS SIGN [2000]
+0x827B U+2135 # ALEF SYMBOL [2000]
+0x827C U+210F # PLANCK CONSTANT OVER TWO PI [2000]
+0x827D U+33CB # SQUARE HP [2000]
+0x827E U+2113 # SCRIPT SMALL L [2000]
+0x8280 U+2127 # INVERTED OHM SIGN [2000]
+0x8281 U+FF41 # FULLWIDTH LATIN SMALL LETTER A
+0x8282 U+FF42 # FULLWIDTH LATIN SMALL LETTER B
+0x8283 U+FF43 # FULLWIDTH LATIN SMALL LETTER C
+0x8284 U+FF44 # FULLWIDTH LATIN SMALL LETTER D
+0x8285 U+FF45 # FULLWIDTH LATIN SMALL LETTER E
+0x8286 U+FF46 # FULLWIDTH LATIN SMALL LETTER F
+0x8287 U+FF47 # FULLWIDTH LATIN SMALL LETTER G
+0x8288 U+FF48 # FULLWIDTH LATIN SMALL LETTER H
+0x8289 U+FF49 # FULLWIDTH LATIN SMALL LETTER I
+0x828A U+FF4A # FULLWIDTH LATIN SMALL LETTER J
+0x828B U+FF4B # FULLWIDTH LATIN SMALL LETTER K
+0x828C U+FF4C # FULLWIDTH LATIN SMALL LETTER L
+0x828D U+FF4D # FULLWIDTH LATIN SMALL LETTER M
+0x828E U+FF4E # FULLWIDTH LATIN SMALL LETTER N
+0x828F U+FF4F # FULLWIDTH LATIN SMALL LETTER O
+0x8290 U+FF50 # FULLWIDTH LATIN SMALL LETTER P
+0x8291 U+FF51 # FULLWIDTH LATIN SMALL LETTER Q
+0x8292 U+FF52 # FULLWIDTH LATIN SMALL LETTER R
+0x8293 U+FF53 # FULLWIDTH LATIN SMALL LETTER S
+0x8294 U+FF54 # FULLWIDTH LATIN SMALL LETTER T
+0x8295 U+FF55 # FULLWIDTH LATIN SMALL LETTER U
+0x8296 U+FF56 # FULLWIDTH LATIN SMALL LETTER V
+0x8297 U+FF57 # FULLWIDTH LATIN SMALL LETTER W
+0x8298 U+FF58 # FULLWIDTH LATIN SMALL LETTER X
+0x8299 U+FF59 # FULLWIDTH LATIN SMALL LETTER Y
+0x829A U+FF5A # FULLWIDTH LATIN SMALL LETTER Z
+0x829B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2]
+0x829C U+2013 # EN DASH [2000]
+0x829D U+29FA # DOUBLE PLUS [2000] [Unicode3.2]
+0x829E U+29FB # TRIPLE PLUS [2000] [Unicode3.2]
+0x829F U+3041 # HIRAGANA LETTER SMALL A
+0x82A0 U+3042 # HIRAGANA LETTER A
+0x82A1 U+3043 # HIRAGANA LETTER SMALL I
+0x82A2 U+3044 # HIRAGANA LETTER I
+0x82A3 U+3045 # HIRAGANA LETTER SMALL U
+0x82A4 U+3046 # HIRAGANA LETTER U
+0x82A5 U+3047 # HIRAGANA LETTER SMALL E
+0x82A6 U+3048 # HIRAGANA LETTER E
+0x82A7 U+3049 # HIRAGANA LETTER SMALL O
+0x82A8 U+304A # HIRAGANA LETTER O
+0x82A9 U+304B # HIRAGANA LETTER KA
+0x82AA U+304C # HIRAGANA LETTER GA
+0x82AB U+304D # HIRAGANA LETTER KI
+0x82AC U+304E # HIRAGANA LETTER GI
+0x82AD U+304F # HIRAGANA LETTER KU
+0x82AE U+3050 # HIRAGANA LETTER GU
+0x82AF U+3051 # HIRAGANA LETTER KE
+0x82B0 U+3052 # HIRAGANA LETTER GE
+0x82B1 U+3053 # HIRAGANA LETTER KO
+0x82B2 U+3054 # HIRAGANA LETTER GO
+0x82B3 U+3055 # HIRAGANA LETTER SA
+0x82B4 U+3056 # HIRAGANA LETTER ZA
+0x82B5 U+3057 # HIRAGANA LETTER SI
+0x82B6 U+3058 # HIRAGANA LETTER ZI
+0x82B7 U+3059 # HIRAGANA LETTER SU
+0x82B8 U+305A # HIRAGANA LETTER ZU
+0x82B9 U+305B # HIRAGANA LETTER SE
+0x82BA U+305C # HIRAGANA LETTER ZE
+0x82BB U+305D # HIRAGANA LETTER SO
+0x82BC U+305E # HIRAGANA LETTER ZO
+0x82BD U+305F # HIRAGANA LETTER TA
+0x82BE U+3060 # HIRAGANA LETTER DA
+0x82BF U+3061 # HIRAGANA LETTER TI
+0x82C0 U+3062 # HIRAGANA LETTER DI
+0x82C1 U+3063 # HIRAGANA LETTER SMALL TU
+0x82C2 U+3064 # HIRAGANA LETTER TU
+0x82C3 U+3065 # HIRAGANA LETTER DU
+0x82C4 U+3066 # HIRAGANA LETTER TE
+0x82C5 U+3067 # HIRAGANA LETTER DE
+0x82C6 U+3068 # HIRAGANA LETTER TO
+0x82C7 U+3069 # HIRAGANA LETTER DO
+0x82C8 U+306A # HIRAGANA LETTER NA
+0x82C9 U+306B # HIRAGANA LETTER NI
+0x82CA U+306C # HIRAGANA LETTER NU
+0x82CB U+306D # HIRAGANA LETTER NE
+0x82CC U+306E # HIRAGANA LETTER NO
+0x82CD U+306F # HIRAGANA LETTER HA
+0x82CE U+3070 # HIRAGANA LETTER BA
+0x82CF U+3071 # HIRAGANA LETTER PA
+0x82D0 U+3072 # HIRAGANA LETTER HI
+0x82D1 U+3073 # HIRAGANA LETTER BI
+0x82D2 U+3074 # HIRAGANA LETTER PI
+0x82D3 U+3075 # HIRAGANA LETTER HU
+0x82D4 U+3076 # HIRAGANA LETTER BU
+0x82D5 U+3077 # HIRAGANA LETTER PU
+0x82D6 U+3078 # HIRAGANA LETTER HE
+0x82D7 U+3079 # HIRAGANA LETTER BE
+0x82D8 U+307A # HIRAGANA LETTER PE
+0x82D9 U+307B # HIRAGANA LETTER HO
+0x82DA U+307C # HIRAGANA LETTER BO
+0x82DB U+307D # HIRAGANA LETTER PO
+0x82DC U+307E # HIRAGANA LETTER MA
+0x82DD U+307F # HIRAGANA LETTER MI
+0x82DE U+3080 # HIRAGANA LETTER MU
+0x82DF U+3081 # HIRAGANA LETTER ME
+0x82E0 U+3082 # HIRAGANA LETTER MO
+0x82E1 U+3083 # HIRAGANA LETTER SMALL YA
+0x82E2 U+3084 # HIRAGANA LETTER YA
+0x82E3 U+3085 # HIRAGANA LETTER SMALL YU
+0x82E4 U+3086 # HIRAGANA LETTER YU
+0x82E5 U+3087 # HIRAGANA LETTER SMALL YO
+0x82E6 U+3088 # HIRAGANA LETTER YO
+0x82E7 U+3089 # HIRAGANA LETTER RA
+0x82E8 U+308A # HIRAGANA LETTER RI
+0x82E9 U+308B # HIRAGANA LETTER RU
+0x82EA U+308C # HIRAGANA LETTER RE
+0x82EB U+308D # HIRAGANA LETTER RO
+0x82EC U+308E # HIRAGANA LETTER SMALL WA
+0x82ED U+308F # HIRAGANA LETTER WA
+0x82EE U+3090 # HIRAGANA LETTER WI
+0x82EF U+3091 # HIRAGANA LETTER WE
+0x82F0 U+3092 # HIRAGANA LETTER WO
+0x82F1 U+3093 # HIRAGANA LETTER N
+0x82F2 U+3094 # HIRAGANA LETTER VU [2000]
+0x82F3 U+3095 # HIRAGANA LETTER SMALL KA [2000] [Unicode3.2]
+0x82F4 U+3096 # HIRAGANA LETTER SMALL KE [2000] [Unicode3.2]
+0x82F5 U+304B+309A # [2000]
+0x82F6 U+304D+309A # [2000]
+0x82F7 U+304F+309A # [2000]
+0x82F8 U+3051+309A # [2000]
+0x82F9 U+3053+309A # [2000]
+0x82FA # <reserved>
+0x82FB # <reserved>
+0x82FC # <reserved>
+0x8340 U+30A1 # KATAKANA LETTER SMALL A
+0x8341 U+30A2 # KATAKANA LETTER A
+0x8342 U+30A3 # KATAKANA LETTER SMALL I
+0x8343 U+30A4 # KATAKANA LETTER I
+0x8344 U+30A5 # KATAKANA LETTER SMALL U
+0x8345 U+30A6 # KATAKANA LETTER U
+0x8346 U+30A7 # KATAKANA LETTER SMALL E
+0x8347 U+30A8 # KATAKANA LETTER E
+0x8348 U+30A9 # KATAKANA LETTER SMALL O
+0x8349 U+30AA # KATAKANA LETTER O
+0x834A U+30AB # KATAKANA LETTER KA
+0x834B U+30AC # KATAKANA LETTER GA
+0x834C U+30AD # KATAKANA LETTER KI
+0x834D U+30AE # KATAKANA LETTER GI
+0x834E U+30AF # KATAKANA LETTER KU
+0x834F U+30B0 # KATAKANA LETTER GU
+0x8350 U+30B1 # KATAKANA LETTER KE
+0x8351 U+30B2 # KATAKANA LETTER GE
+0x8352 U+30B3 # KATAKANA LETTER KO
+0x8353 U+30B4 # KATAKANA LETTER GO
+0x8354 U+30B5 # KATAKANA LETTER SA
+0x8355 U+30B6 # KATAKANA LETTER ZA
+0x8356 U+30B7 # KATAKANA LETTER SI
+0x8357 U+30B8 # KATAKANA LETTER ZI
+0x8358 U+30B9 # KATAKANA LETTER SU
+0x8359 U+30BA # KATAKANA LETTER ZU
+0x835A U+30BB # KATAKANA LETTER SE
+0x835B U+30BC # KATAKANA LETTER ZE
+0x835C U+30BD # KATAKANA LETTER SO
+0x835D U+30BE # KATAKANA LETTER ZO
+0x835E U+30BF # KATAKANA LETTER TA
+0x835F U+30C0 # KATAKANA LETTER DA
+0x8360 U+30C1 # KATAKANA LETTER TI
+0x8361 U+30C2 # KATAKANA LETTER DI
+0x8362 U+30C3 # KATAKANA LETTER SMALL TU
+0x8363 U+30C4 # KATAKANA LETTER TU
+0x8364 U+30C5 # KATAKANA LETTER DU
+0x8365 U+30C6 # KATAKANA LETTER TE
+0x8366 U+30C7 # KATAKANA LETTER DE
+0x8367 U+30C8 # KATAKANA LETTER TO
+0x8368 U+30C9 # KATAKANA LETTER DO
+0x8369 U+30CA # KATAKANA LETTER NA
+0x836A U+30CB # KATAKANA LETTER NI
+0x836B U+30CC # KATAKANA LETTER NU
+0x836C U+30CD # KATAKANA LETTER NE
+0x836D U+30CE # KATAKANA LETTER NO
+0x836E U+30CF # KATAKANA LETTER HA
+0x836F U+30D0 # KATAKANA LETTER BA
+0x8370 U+30D1 # KATAKANA LETTER PA
+0x8371 U+30D2 # KATAKANA LETTER HI
+0x8372 U+30D3 # KATAKANA LETTER BI
+0x8373 U+30D4 # KATAKANA LETTER PI
+0x8374 U+30D5 # KATAKANA LETTER HU
+0x8375 U+30D6 # KATAKANA LETTER BU
+0x8376 U+30D7 # KATAKANA LETTER PU
+0x8377 U+30D8 # KATAKANA LETTER HE
+0x8378 U+30D9 # KATAKANA LETTER BE
+0x8379 U+30DA # KATAKANA LETTER PE
+0x837A U+30DB # KATAKANA LETTER HO
+0x837B U+30DC # KATAKANA LETTER BO
+0x837C U+30DD # KATAKANA LETTER PO
+0x837D U+30DE # KATAKANA LETTER MA
+0x837E U+30DF # KATAKANA LETTER MI
+0x8380 U+30E0 # KATAKANA LETTER MU
+0x8381 U+30E1 # KATAKANA LETTER ME
+0x8382 U+30E2 # KATAKANA LETTER MO
+0x8383 U+30E3 # KATAKANA LETTER SMALL YA
+0x8384 U+30E4 # KATAKANA LETTER YA
+0x8385 U+30E5 # KATAKANA LETTER SMALL YU
+0x8386 U+30E6 # KATAKANA LETTER YU
+0x8387 U+30E7 # KATAKANA LETTER SMALL YO
+0x8388 U+30E8 # KATAKANA LETTER YO
+0x8389 U+30E9 # KATAKANA LETTER RA
+0x838A U+30EA # KATAKANA LETTER RI
+0x838B U+30EB # KATAKANA LETTER RU
+0x838C U+30EC # KATAKANA LETTER RE
+0x838D U+30ED # KATAKANA LETTER RO
+0x838E U+30EE # KATAKANA LETTER SMALL WA
+0x838F U+30EF # KATAKANA LETTER WA
+0x8390 U+30F0 # KATAKANA LETTER WI
+0x8391 U+30F1 # KATAKANA LETTER WE
+0x8392 U+30F2 # KATAKANA LETTER WO
+0x8393 U+30F3 # KATAKANA LETTER N
+0x8394 U+30F4 # KATAKANA LETTER VU
+0x8395 U+30F5 # KATAKANA LETTER SMALL KA
+0x8396 U+30F6 # KATAKANA LETTER SMALL KE
+0x8397 U+30AB+309A # [2000]
+0x8398 U+30AD+309A # [2000]
+0x8399 U+30AF+309A # [2000]
+0x839A U+30B1+309A # [2000]
+0x839B U+30B3+309A # [2000]
+0x839C U+30BB+309A # [2000]
+0x839D U+30C4+309A # [2000]
+0x839E U+30C8+309A # [2000]
+0x839F U+0391 # GREEK CAPITAL LETTER ALPHA
+0x83A0 U+0392 # GREEK CAPITAL LETTER BETA
+0x83A1 U+0393 # GREEK CAPITAL LETTER GAMMA
+0x83A2 U+0394 # GREEK CAPITAL LETTER DELTA
+0x83A3 U+0395 # GREEK CAPITAL LETTER EPSILON
+0x83A4 U+0396 # GREEK CAPITAL LETTER ZETA
+0x83A5 U+0397 # GREEK CAPITAL LETTER ETA
+0x83A6 U+0398 # GREEK CAPITAL LETTER THETA
+0x83A7 U+0399 # GREEK CAPITAL LETTER IOTA
+0x83A8 U+039A # GREEK CAPITAL LETTER KAPPA
+0x83A9 U+039B # GREEK CAPITAL LETTER LAMDA
+0x83AA U+039C # GREEK CAPITAL LETTER MU
+0x83AB U+039D # GREEK CAPITAL LETTER NU
+0x83AC U+039E # GREEK CAPITAL LETTER XI
+0x83AD U+039F # GREEK CAPITAL LETTER OMICRON
+0x83AE U+03A0 # GREEK CAPITAL LETTER PI
+0x83AF U+03A1 # GREEK CAPITAL LETTER RHO
+0x83B0 U+03A3 # GREEK CAPITAL LETTER SIGMA
+0x83B1 U+03A4 # GREEK CAPITAL LETTER TAU
+0x83B2 U+03A5 # GREEK CAPITAL LETTER UPSILON
+0x83B3 U+03A6 # GREEK CAPITAL LETTER PHI
+0x83B4 U+03A7 # GREEK CAPITAL LETTER CHI
+0x83B5 U+03A8 # GREEK CAPITAL LETTER PSI
+0x83B6 U+03A9 # GREEK CAPITAL LETTER OMEGA
+0x83B7 U+2664 # WHITE SPADE SUIT [2000]
+0x83B8 U+2660 # BLACK SPADE SUIT [2000]
+0x83B9 U+2662 # WHITE DIAMOND SUIT [2000]
+0x83BA U+2666 # BLACK DIAMOND SUIT [2000]
+0x83BB U+2661 # WHITE HEART SUIT [2000]
+0x83BC U+2665 # BLACK HEART SUIT [2000]
+0x83BD U+2667 # WHITE CLUB SUIT [2000]
+0x83BE U+2663 # BLACK CLUB SUIT [2000]
+0x83BF U+03B1 # GREEK SMALL LETTER ALPHA
+0x83C0 U+03B2 # GREEK SMALL LETTER BETA
+0x83C1 U+03B3 # GREEK SMALL LETTER GAMMA
+0x83C2 U+03B4 # GREEK SMALL LETTER DELTA
+0x83C3 U+03B5 # GREEK SMALL LETTER EPSILON
+0x83C4 U+03B6 # GREEK SMALL LETTER ZETA
+0x83C5 U+03B7 # GREEK SMALL LETTER ETA
+0x83C6 U+03B8 # GREEK SMALL LETTER THETA
+0x83C7 U+03B9 # GREEK SMALL LETTER IOTA
+0x83C8 U+03BA # GREEK SMALL LETTER KAPPA
+0x83C9 U+03BB # GREEK SMALL LETTER LAMDA
+0x83CA U+03BC # GREEK SMALL LETTER MU
+0x83CB U+03BD # GREEK SMALL LETTER NU
+0x83CC U+03BE # GREEK SMALL LETTER XI
+0x83CD U+03BF # GREEK SMALL LETTER OMICRON
+0x83CE U+03C0 # GREEK SMALL LETTER PI
+0x83CF U+03C1 # GREEK SMALL LETTER RHO
+0x83D0 U+03C3 # GREEK SMALL LETTER SIGMA
+0x83D1 U+03C4 # GREEK SMALL LETTER TAU
+0x83D2 U+03C5 # GREEK SMALL LETTER UPSILON
+0x83D3 U+03C6 # GREEK SMALL LETTER PHI
+0x83D4 U+03C7 # GREEK SMALL LETTER CHI
+0x83D5 U+03C8 # GREEK SMALL LETTER PSI
+0x83D6 U+03C9 # GREEK SMALL LETTER OMEGA
+0x83D7 U+03C2 # GREEK SMALL LETTER FINAL SIGMA [2000]
+0x83D8 U+24F5 # DOUBLE CIRCLED DIGIT ONE [2000] [Unicode3.2]
+0x83D9 U+24F6 # DOUBLE CIRCLED DIGIT TWO [2000] [Unicode3.2]
+0x83DA U+24F7 # DOUBLE CIRCLED DIGIT THREE [2000] [Unicode3.2]
+0x83DB U+24F8 # DOUBLE CIRCLED DIGIT FOUR [2000] [Unicode3.2]
+0x83DC U+24F9 # DOUBLE CIRCLED DIGIT FIVE [2000] [Unicode3.2]
+0x83DD U+24FA # DOUBLE CIRCLED DIGIT SIX [2000] [Unicode3.2]
+0x83DE U+24FB # DOUBLE CIRCLED DIGIT SEVEN [2000] [Unicode3.2]
+0x83DF U+24FC # DOUBLE CIRCLED DIGIT EIGHT [2000] [Unicode3.2]
+0x83E0 U+24FD # DOUBLE CIRCLED DIGIT NINE [2000] [Unicode3.2]
+0x83E1 U+24FE # DOUBLE CIRCLED NUMBER TEN [2000] [Unicode3.2]
+0x83E2 U+2616 # WHITE SHOGI PIECE [2000] [Unicode3.2]
+0x83E3 U+2617 # BLACK SHOGI PIECE [2000] [Unicode3.2]
+0x83E4 U+3020 # POSTAL MARK FACE [2000]
+0x83E5 U+260E # BLACK TELEPHONE [2000]
+0x83E6 U+2600 # BLACK SUN WITH RAYS [2000]
+0x83E7 U+2601 # CLOUD [2000]
+0x83E8 U+2602 # UMBRELLA [2000]
+0x83E9 U+2603 # SNOWMAN [2000]
+0x83EA U+2668 # HOT SPRINGS [2000]
+0x83EB U+25B1 # WHITE PARALLELOGRAM [2000]
+0x83EC U+31F0 # KATAKANA LETTER SMALL KU [2000] [Unicode3.2]
+0x83ED U+31F1 # KATAKANA LETTER SMALL SI [2000] [Unicode3.2]
+0x83EE U+31F2 # KATAKANA LETTER SMALL SU [2000] [Unicode3.2]
+0x83EF U+31F3 # KATAKANA LETTER SMALL TO [2000] [Unicode3.2]
+0x83F0 U+31F4 # KATAKANA LETTER SMALL NU [2000] [Unicode3.2]
+0x83F1 U+31F5 # KATAKANA LETTER SMALL HA [2000] [Unicode3.2]
+0x83F2 U+31F6 # KATAKANA LETTER SMALL HI [2000] [Unicode3.2]
+0x83F3 U+31F7 # KATAKANA LETTER SMALL HU [2000] [Unicode3.2]
+0x83F4 U+31F8 # KATAKANA LETTER SMALL HE [2000] [Unicode3.2]
+0x83F5 U+31F9 # KATAKANA LETTER SMALL HO [2000] [Unicode3.2]
+0x83F6 U+31F7+309A # [2000]
+0x83F7 U+31FA # KATAKANA LETTER SMALL MU [2000] [Unicode3.2]
+0x83F8 U+31FB # KATAKANA LETTER SMALL RA [2000] [Unicode3.2]
+0x83F9 U+31FC # KATAKANA LETTER SMALL RI [2000] [Unicode3.2]
+0x83FA U+31FD # KATAKANA LETTER SMALL RU [2000] [Unicode3.2]
+0x83FB U+31FE # KATAKANA LETTER SMALL RE [2000] [Unicode3.2]
+0x83FC U+31FF # KATAKANA LETTER SMALL RO [2000] [Unicode3.2]
+0x8440 U+0410 # CYRILLIC CAPITAL LETTER A
+0x8441 U+0411 # CYRILLIC CAPITAL LETTER BE
+0x8442 U+0412 # CYRILLIC CAPITAL LETTER VE
+0x8443 U+0413 # CYRILLIC CAPITAL LETTER GHE
+0x8444 U+0414 # CYRILLIC CAPITAL LETTER DE
+0x8445 U+0415 # CYRILLIC CAPITAL LETTER IE
+0x8446 U+0401 # CYRILLIC CAPITAL LETTER IO
+0x8447 U+0416 # CYRILLIC CAPITAL LETTER ZHE
+0x8448 U+0417 # CYRILLIC CAPITAL LETTER ZE
+0x8449 U+0418 # CYRILLIC CAPITAL LETTER I
+0x844A U+0419 # CYRILLIC CAPITAL LETTER SHORT I
+0x844B U+041A # CYRILLIC CAPITAL LETTER KA
+0x844C U+041B # CYRILLIC CAPITAL LETTER EL
+0x844D U+041C # CYRILLIC CAPITAL LETTER EM
+0x844E U+041D # CYRILLIC CAPITAL LETTER EN
+0x844F U+041E # CYRILLIC CAPITAL LETTER O
+0x8450 U+041F # CYRILLIC CAPITAL LETTER PE
+0x8451 U+0420 # CYRILLIC CAPITAL LETTER ER
+0x8452 U+0421 # CYRILLIC CAPITAL LETTER ES
+0x8453 U+0422 # CYRILLIC CAPITAL LETTER TE
+0x8454 U+0423 # CYRILLIC CAPITAL LETTER U
+0x8455 U+0424 # CYRILLIC CAPITAL LETTER EF
+0x8456 U+0425 # CYRILLIC CAPITAL LETTER HA
+0x8457 U+0426 # CYRILLIC CAPITAL LETTER TSE
+0x8458 U+0427 # CYRILLIC CAPITAL LETTER CHE
+0x8459 U+0428 # CYRILLIC CAPITAL LETTER SHA
+0x845A U+0429 # CYRILLIC CAPITAL LETTER SHCHA
+0x845B U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
+0x845C U+042B # CYRILLIC CAPITAL LETTER YERU
+0x845D U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN
+0x845E U+042D # CYRILLIC CAPITAL LETTER E
+0x845F U+042E # CYRILLIC CAPITAL LETTER YU
+0x8460 U+042F # CYRILLIC CAPITAL LETTER YA
+0x8461 U+23BE # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT [2000] [Unicode3.2]
+0x8462 U+23BF # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT [2000] [Unicode3.2]
+0x8463 U+23C0 # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE [2000] [Unicode3.2]
+0x8464 U+23C1 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0x8465 U+23C2 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2]
+0x8466 U+23C3 # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8467 U+23C4 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8468 U+23C5 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2]
+0x8469 U+23C6 # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE [2000] [Unicode3.2]
+0x846A U+23C7 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0x846B U+23C8 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE [2000] [Unicode3.2]
+0x846C U+23C9 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL [2000] [Unicode3.2]
+0x846D U+23CA # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL [2000] [Unicode3.2]
+0x846E U+23CB # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT [2000] [Unicode3.2]
+0x846F U+23CC # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT [2000] [Unicode3.2]
+0x8470 U+0430 # CYRILLIC SMALL LETTER A
+0x8471 U+0431 # CYRILLIC SMALL LETTER BE
+0x8472 U+0432 # CYRILLIC SMALL LETTER VE
+0x8473 U+0433 # CYRILLIC SMALL LETTER GHE
+0x8474 U+0434 # CYRILLIC SMALL LETTER DE
+0x8475 U+0435 # CYRILLIC SMALL LETTER IE
+0x8476 U+0451 # CYRILLIC SMALL LETTER IO
+0x8477 U+0436 # CYRILLIC SMALL LETTER ZHE
+0x8478 U+0437 # CYRILLIC SMALL LETTER ZE
+0x8479 U+0438 # CYRILLIC SMALL LETTER I
+0x847A U+0439 # CYRILLIC SMALL LETTER SHORT I
+0x847B U+043A # CYRILLIC SMALL LETTER KA
+0x847C U+043B # CYRILLIC SMALL LETTER EL
+0x847D U+043C # CYRILLIC SMALL LETTER EM
+0x847E U+043D # CYRILLIC SMALL LETTER EN
+0x8480 U+043E # CYRILLIC SMALL LETTER O
+0x8481 U+043F # CYRILLIC SMALL LETTER PE
+0x8482 U+0440 # CYRILLIC SMALL LETTER ER
+0x8483 U+0441 # CYRILLIC SMALL LETTER ES
+0x8484 U+0442 # CYRILLIC SMALL LETTER TE
+0x8485 U+0443 # CYRILLIC SMALL LETTER U
+0x8486 U+0444 # CYRILLIC SMALL LETTER EF
+0x8487 U+0445 # CYRILLIC SMALL LETTER HA
+0x8488 U+0446 # CYRILLIC SMALL LETTER TSE
+0x8489 U+0447 # CYRILLIC SMALL LETTER CHE
+0x848A U+0448 # CYRILLIC SMALL LETTER SHA
+0x848B U+0449 # CYRILLIC SMALL LETTER SHCHA
+0x848C U+044A # CYRILLIC SMALL LETTER HARD SIGN
+0x848D U+044B # CYRILLIC SMALL LETTER YERU
+0x848E U+044C # CYRILLIC SMALL LETTER SOFT SIGN
+0x848F U+044D # CYRILLIC SMALL LETTER E
+0x8490 U+044E # CYRILLIC SMALL LETTER YU
+0x8491 U+044F # CYRILLIC SMALL LETTER YA
+0x8492 U+30F7 # KATAKANA LETTER VA [2000]
+0x8493 U+30F8 # KATAKANA LETTER VI [2000]
+0x8494 U+30F9 # KATAKANA LETTER VE [2000]
+0x8495 U+30FA # KATAKANA LETTER VO [2000]
+0x8496 U+22DA # LESS-THAN EQUAL TO OR GREATER-THAN [2000]
+0x8497 U+22DB # GREATER-THAN EQUAL TO OR LESS-THAN [2000]
+0x8498 U+2153 # VULGAR FRACTION ONE THIRD [2000]
+0x8499 U+2154 # VULGAR FRACTION TWO THIRDS [2000]
+0x849A U+2155 # VULGAR FRACTION ONE FIFTH [2000]
+0x849B U+2713 # CHECK MARK [2000]
+0x849C U+2318 # PLACE OF INTEREST SIGN [2000]
+0x849D U+2423 # OPEN BOX [2000]
+0x849E U+23CE # RETURN SYMBOL [2000] [Unicode3.2]
+0x849F U+2500 # BOX DRAWINGS LIGHT HORIZONTAL [1983]
+0x84A0 U+2502 # BOX DRAWINGS LIGHT VERTICAL [1983]
+0x84A1 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT [1983]
+0x84A2 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT [1983]
+0x84A3 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT [1983]
+0x84A4 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT [1983]
+0x84A5 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT [1983]
+0x84A6 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL [1983]
+0x84A7 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT [1983]
+0x84A8 U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL [1983]
+0x84A9 U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL [1983]
+0x84AA U+2501 # BOX DRAWINGS HEAVY HORIZONTAL [1983]
+0x84AB U+2503 # BOX DRAWINGS HEAVY VERTICAL [1983]
+0x84AC U+250F # BOX DRAWINGS HEAVY DOWN AND RIGHT [1983]
+0x84AD U+2513 # BOX DRAWINGS HEAVY DOWN AND LEFT [1983]
+0x84AE U+251B # BOX DRAWINGS HEAVY UP AND LEFT [1983]
+0x84AF U+2517 # BOX DRAWINGS HEAVY UP AND RIGHT [1983]
+0x84B0 U+2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT [1983]
+0x84B1 U+2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL [1983]
+0x84B2 U+252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT [1983]
+0x84B3 U+253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL [1983]
+0x84B4 U+254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL [1983]
+0x84B5 U+2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT [1983]
+0x84B6 U+252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY [1983]
+0x84B7 U+2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT [1983]
+0x84B8 U+2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY [1983]
+0x84B9 U+253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY [1983]
+0x84BA U+251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY [1983]
+0x84BB U+2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BC U+2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY [1983]
+0x84BD U+2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BE U+2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT [1983]
+0x84BF U+3251 # CIRCLED NUMBER TWENTY ONE [2000] [Unicode3.2]
+0x84C0 U+3252 # CIRCLED NUMBER TWENTY TWO [2000] [Unicode3.2]
+0x84C1 U+3253 # CIRCLED NUMBER TWENTY THREE [2000] [Unicode3.2]
+0x84C2 U+3254 # CIRCLED NUMBER TWENTY FOUR [2000] [Unicode3.2]
+0x84C3 U+3255 # CIRCLED NUMBER TWENTY FIVE [2000] [Unicode3.2]
+0x84C4 U+3256 # CIRCLED NUMBER TWENTY SIX [2000] [Unicode3.2]
+0x84C5 U+3257 # CIRCLED NUMBER TWENTY SEVEN [2000] [Unicode3.2]
+0x84C6 U+3258 # CIRCLED NUMBER TWENTY EIGHT [2000] [Unicode3.2]
+0x84C7 U+3259 # CIRCLED NUMBER TWENTY NINE [2000] [Unicode3.2]
+0x84C8 U+325A # CIRCLED NUMBER THIRTY [2000] [Unicode3.2]
+0x84C9 U+325B # CIRCLED NUMBER THIRTY ONE [2000] [Unicode3.2]
+0x84CA U+325C # CIRCLED NUMBER THIRTY TWO [2000] [Unicode3.2]
+0x84CB U+325D # CIRCLED NUMBER THIRTY THREE [2000] [Unicode3.2]
+0x84CC U+325E # CIRCLED NUMBER THIRTY FOUR [2000] [Unicode3.2]
+0x84CD U+325F # CIRCLED NUMBER THIRTY FIVE [2000] [Unicode3.2]
+0x84CE U+32B1 # CIRCLED NUMBER THIRTY SIX [2000] [Unicode3.2]
+0x84CF U+32B2 # CIRCLED NUMBER THIRTY SEVEN [2000] [Unicode3.2]
+0x84D0 U+32B3 # CIRCLED NUMBER THIRTY EIGHT [2000] [Unicode3.2]
+0x84D1 U+32B4 # CIRCLED NUMBER THIRTY NINE [2000] [Unicode3.2]
+0x84D2 U+32B5 # CIRCLED NUMBER FORTY [2000] [Unicode3.2]
+0x84D3 U+32B6 # CIRCLED NUMBER FORTY ONE [2000] [Unicode3.2]
+0x84D4 U+32B7 # CIRCLED NUMBER FORTY TWO [2000] [Unicode3.2]
+0x84D5 U+32B8 # CIRCLED NUMBER FORTY THREE [2000] [Unicode3.2]
+0x84D6 U+32B9 # CIRCLED NUMBER FORTY FOUR [2000] [Unicode3.2]
+0x84D7 U+32BA # CIRCLED NUMBER FORTY FIVE [2000] [Unicode3.2]
+0x84D8 U+32BB # CIRCLED NUMBER FORTY SIX [2000] [Unicode3.2]
+0x84D9 U+32BC # CIRCLED NUMBER FORTY SEVEN [2000] [Unicode3.2]
+0x84DA U+32BD # CIRCLED NUMBER FORTY EIGHT [2000] [Unicode3.2]
+0x84DB U+32BE # CIRCLED NUMBER FORTY NINE [2000] [Unicode3.2]
+0x84DC U+32BF # CIRCLED NUMBER FIFTY [2000] [Unicode3.2]
+0x84DD # <reserved>
+0x84DE # <reserved>
+0x84DF # <reserved>
+0x84E0 # <reserved>
+0x84E1 # <reserved>
+0x84E2 # <reserved>
+0x84E3 # <reserved>
+0x84E4 # <reserved>
+0x84E5 U+25D0 # CIRCLE WITH LEFT HALF BLACK [2000]
+0x84E6 U+25D1 # CIRCLE WITH RIGHT HALF BLACK [2000]
+0x84E7 U+25D2 # CIRCLE WITH LOWER HALF BLACK [2000]
+0x84E8 U+25D3 # CIRCLE WITH UPPER HALF BLACK [2000]
+0x84E9 U+203C # DOUBLE EXCLAMATION MARK [2000]
+0x84EA U+2047 # DOUBLE QUESTION MARK [2000] [Unicode3.2]
+0x84EB U+2048 # QUESTION EXCLAMATION MARK [2000]
+0x84EC U+2049 # EXCLAMATION QUESTION MARK [2000]
+0x84ED U+01CD # LATIN CAPITAL LETTER A WITH CARON [2000]
+0x84EE U+01CE # LATIN SMALL LETTER A WITH CARON [2000]
+0x84EF U+01D0 # LATIN SMALL LETTER I WITH CARON [2000]
+0x84F0 U+1E3E # LATIN CAPITAL LETTER M WITH ACUTE [2000]
+0x84F1 U+1E3F # LATIN SMALL LETTER M WITH ACUTE [2000]
+0x84F2 U+01F8 # LATIN CAPITAL LETTER N WITH GRAVE [2000]
+0x84F3 U+01F9 # LATIN SMALL LETTER N WITH GRAVE [2000]
+0x84F4 U+01D1 # LATIN CAPITAL LETTER O WITH CARON [2000]
+0x84F5 U+01D2 # LATIN SMALL LETTER O WITH CARON [2000]
+0x84F6 U+01D4 # LATIN SMALL LETTER U WITH CARON [2000]
+0x84F7 U+01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON [2000]
+0x84F8 U+01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE [2000]
+0x84F9 U+01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON [2000]
+0x84FA U+01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE [2000]
+0x84FB # <reserved>
+0x84FC # <reserved>
+0x8540 U+20AC # EURO SIGN [2000]
+0x8541 U+00A0 # NO-BREAK SPACE [2000]
+0x8542 U+00A1 # INVERTED EXCLAMATION MARK [2000]
+0x8543 U+00A4 # CURRENCY SIGN [2000]
+0x8544 U+00A6 # BROKEN BAR [2000]
+0x8545 U+00A9 # COPYRIGHT SIGN [2000]
+0x8546 U+00AA # FEMININE ORDINAL INDICATOR [2000]
+0x8547 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0x8548 U+00AD # SOFT HYPHEN [2000]
+0x8549 U+00AE # REGISTERED SIGN [2000]
+0x854A U+00AF # MACRON [2000]
+0x854B U+00B2 # SUPERSCRIPT TWO [2000]
+0x854C U+00B3 # SUPERSCRIPT THREE [2000]
+0x854D U+00B7 # MIDDLE DOT [2000]
+0x854E U+00B8 # CEDILLA [2000]
+0x854F U+00B9 # SUPERSCRIPT ONE [2000]
+0x8550 U+00BA # MASCULINE ORDINAL INDICATOR [2000]
+0x8551 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [2000]
+0x8552 U+00BC # VULGAR FRACTION ONE QUARTER [2000]
+0x8553 U+00BD # VULGAR FRACTION ONE HALF [2000]
+0x8554 U+00BE # VULGAR FRACTION THREE QUARTERS [2000]
+0x8555 U+00BF # INVERTED QUESTION MARK [2000]
+0x8556 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE [2000]
+0x8557 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE [2000]
+0x8558 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX [2000]
+0x8559 U+00C3 # LATIN CAPITAL LETTER A WITH TILDE [2000]
+0x855A U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS [2000]
+0x855B U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE [2000]
+0x855C U+00C6 # LATIN CAPITAL LETTER AE [2000]
+0x855D U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA [2000]
+0x855E U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE [2000]
+0x855F U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE [2000]
+0x8560 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX [2000]
+0x8561 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS [2000]
+0x8562 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE [2000]
+0x8563 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE [2000]
+0x8564 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX [2000]
+0x8565 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS [2000]
+0x8566 U+00D0 # LATIN CAPITAL LETTER ETH [2000]
+0x8567 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE [2000]
+0x8568 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE [2000]
+0x8569 U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE [2000]
+0x856A U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX [2000]
+0x856B U+00D5 # LATIN CAPITAL LETTER O WITH TILDE [2000]
+0x856C U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS [2000]
+0x856D U+00D8 # LATIN CAPITAL LETTER O WITH STROKE [2000]
+0x856E U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE [2000]
+0x856F U+00DA # LATIN CAPITAL LETTER U WITH ACUTE [2000]
+0x8570 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX [2000]
+0x8571 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS [2000]
+0x8572 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE [2000]
+0x8573 U+00DE # LATIN CAPITAL LETTER THORN [2000]
+0x8574 U+00DF # LATIN SMALL LETTER SHARP S [2000]
+0x8575 U+00E0 # LATIN SMALL LETTER A WITH GRAVE [2000]
+0x8576 U+00E1 # LATIN SMALL LETTER A WITH ACUTE [2000]
+0x8577 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX [2000]
+0x8578 U+00E3 # LATIN SMALL LETTER A WITH TILDE [2000]
+0x8579 U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS [2000]
+0x857A U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE [2000]
+0x857B U+00E6 # LATIN SMALL LETTER AE [2000]
+0x857C U+00E7 # LATIN SMALL LETTER C WITH CEDILLA [2000]
+0x857D U+00E8 # LATIN SMALL LETTER E WITH GRAVE [2000]
+0x857E U+00E9 # LATIN SMALL LETTER E WITH ACUTE [2000]
+0x8580 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX [2000]
+0x8581 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS [2000]
+0x8582 U+00EC # LATIN SMALL LETTER I WITH GRAVE [2000]
+0x8583 U+00ED # LATIN SMALL LETTER I WITH ACUTE [2000]
+0x8584 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX [2000]
+0x8585 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS [2000]
+0x8586 U+00F0 # LATIN SMALL LETTER ETH [2000]
+0x8587 U+00F1 # LATIN SMALL LETTER N WITH TILDE [2000]
+0x8588 U+00F2 # LATIN SMALL LETTER O WITH GRAVE [2000]
+0x8589 U+00F3 # LATIN SMALL LETTER O WITH ACUTE [2000]
+0x858A U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX [2000]
+0x858B U+00F5 # LATIN SMALL LETTER O WITH TILDE [2000]
+0x858C U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS [2000]
+0x858D U+00F8 # LATIN SMALL LETTER O WITH STROKE [2000]
+0x858E U+00F9 # LATIN SMALL LETTER U WITH GRAVE [2000]
+0x858F U+00FA # LATIN SMALL LETTER U WITH ACUTE [2000]
+0x8590 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX [2000]
+0x8591 U+00FC # LATIN SMALL LETTER U WITH DIAERESIS [2000]
+0x8592 U+00FD # LATIN SMALL LETTER Y WITH ACUTE [2000]
+0x8593 U+00FE # LATIN SMALL LETTER THORN [2000]
+0x8594 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS [2000]
+0x8595 U+0100 # LATIN CAPITAL LETTER A WITH MACRON [2000]
+0x8596 U+012A # LATIN CAPITAL LETTER I WITH MACRON [2000]
+0x8597 U+016A # LATIN CAPITAL LETTER U WITH MACRON [2000]
+0x8598 U+0112 # LATIN CAPITAL LETTER E WITH MACRON [2000]
+0x8599 U+014C # LATIN CAPITAL LETTER O WITH MACRON [2000]
+0x859A U+0101 # LATIN SMALL LETTER A WITH MACRON [2000]
+0x859B U+012B # LATIN SMALL LETTER I WITH MACRON [2000]
+0x859C U+016B # LATIN SMALL LETTER U WITH MACRON [2000]
+0x859D U+0113 # LATIN SMALL LETTER E WITH MACRON [2000]
+0x859E U+014D # LATIN SMALL LETTER O WITH MACRON [2000]
+0x859F U+0104 # LATIN CAPITAL LETTER A WITH OGONEK [2000]
+0x85A0 U+02D8 # BREVE [2000]
+0x85A1 U+0141 # LATIN CAPITAL LETTER L WITH STROKE [2000]
+0x85A2 U+013D # LATIN CAPITAL LETTER L WITH CARON [2000]
+0x85A3 U+015A # LATIN CAPITAL LETTER S WITH ACUTE [2000]
+0x85A4 U+0160 # LATIN CAPITAL LETTER S WITH CARON [2000]
+0x85A5 U+015E # LATIN CAPITAL LETTER S WITH CEDILLA [2000]
+0x85A6 U+0164 # LATIN CAPITAL LETTER T WITH CARON [2000]
+0x85A7 U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE [2000]
+0x85A8 U+017D # LATIN CAPITAL LETTER Z WITH CARON [2000]
+0x85A9 U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE [2000]
+0x85AA U+0105 # LATIN SMALL LETTER A WITH OGONEK [2000]
+0x85AB U+02DB # OGONEK [2000]
+0x85AC U+0142 # LATIN SMALL LETTER L WITH STROKE [2000]
+0x85AD U+013E # LATIN SMALL LETTER L WITH CARON [2000]
+0x85AE U+015B # LATIN SMALL LETTER S WITH ACUTE [2000]
+0x85AF U+02C7 # CARON [2000]
+0x85B0 U+0161 # LATIN SMALL LETTER S WITH CARON [2000]
+0x85B1 U+015F # LATIN SMALL LETTER S WITH CEDILLA [2000]
+0x85B2 U+0165 # LATIN SMALL LETTER T WITH CARON [2000]
+0x85B3 U+017A # LATIN SMALL LETTER Z WITH ACUTE [2000]
+0x85B4 U+02DD # DOUBLE ACUTE ACCENT [2000]
+0x85B5 U+017E # LATIN SMALL LETTER Z WITH CARON [2000]
+0x85B6 U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE [2000]
+0x85B7 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE [2000]
+0x85B8 U+0102 # LATIN CAPITAL LETTER A WITH BREVE [2000]
+0x85B9 U+0139 # LATIN CAPITAL LETTER L WITH ACUTE [2000]
+0x85BA U+0106 # LATIN CAPITAL LETTER C WITH ACUTE [2000]
+0x85BB U+010C # LATIN CAPITAL LETTER C WITH CARON [2000]
+0x85BC U+0118 # LATIN CAPITAL LETTER E WITH OGONEK [2000]
+0x85BD U+011A # LATIN CAPITAL LETTER E WITH CARON [2000]
+0x85BE U+010E # LATIN CAPITAL LETTER D WITH CARON [2000]
+0x85BF U+0143 # LATIN CAPITAL LETTER N WITH ACUTE [2000]
+0x85C0 U+0147 # LATIN CAPITAL LETTER N WITH CARON [2000]
+0x85C1 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE [2000]
+0x85C2 U+0158 # LATIN CAPITAL LETTER R WITH CARON [2000]
+0x85C3 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE [2000]
+0x85C4 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE [2000]
+0x85C5 U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA [2000]
+0x85C6 U+0155 # LATIN SMALL LETTER R WITH ACUTE [2000]
+0x85C7 U+0103 # LATIN SMALL LETTER A WITH BREVE [2000]
+0x85C8 U+013A # LATIN SMALL LETTER L WITH ACUTE [2000]
+0x85C9 U+0107 # LATIN SMALL LETTER C WITH ACUTE [2000]
+0x85CA U+010D # LATIN SMALL LETTER C WITH CARON [2000]
+0x85CB U+0119 # LATIN SMALL LETTER E WITH OGONEK [2000]
+0x85CC U+011B # LATIN SMALL LETTER E WITH CARON [2000]
+0x85CD U+010F # LATIN SMALL LETTER D WITH CARON [2000]
+0x85CE U+0111 # LATIN SMALL LETTER D WITH STROKE [2000]
+0x85CF U+0144 # LATIN SMALL LETTER N WITH ACUTE [2000]
+0x85D0 U+0148 # LATIN SMALL LETTER N WITH CARON [2000]
+0x85D1 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE [2000]
+0x85D2 U+0159 # LATIN SMALL LETTER R WITH CARON [2000]
+0x85D3 U+016F # LATIN SMALL LETTER U WITH RING ABOVE [2000]
+0x85D4 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE [2000]
+0x85D5 U+0163 # LATIN SMALL LETTER T WITH CEDILLA [2000]
+0x85D6 U+02D9 # DOT ABOVE [2000]
+0x85D7 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX [2000]
+0x85D8 U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX [2000]
+0x85D9 U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX [2000]
+0x85DA U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX [2000]
+0x85DB U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX [2000]
+0x85DC U+016C # LATIN CAPITAL LETTER U WITH BREVE [2000]
+0x85DD U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX [2000]
+0x85DE U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX [2000]
+0x85DF U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX [2000]
+0x85E0 U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX [2000]
+0x85E1 U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX [2000]
+0x85E2 U+016D # LATIN SMALL LETTER U WITH BREVE [2000]
+0x85E3 U+0271 # LATIN SMALL LETTER M WITH HOOK [2000]
+0x85E4 U+028B # LATIN SMALL LETTER V WITH HOOK [2000]
+0x85E5 U+027E # LATIN SMALL LETTER R WITH FISHHOOK [2000]
+0x85E6 U+0283 # LATIN SMALL LETTER ESH [2000]
+0x85E7 U+0292 # LATIN SMALL LETTER EZH [2000]
+0x85E8 U+026C # LATIN SMALL LETTER L WITH BELT [2000]
+0x85E9 U+026E # LATIN SMALL LETTER LEZH [2000]
+0x85EA U+0279 # LATIN SMALL LETTER TURNED R [2000]
+0x85EB U+0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK [2000]
+0x85EC U+0256 # LATIN SMALL LETTER D WITH TAIL [2000]
+0x85ED U+0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK [2000]
+0x85EE U+027D # LATIN SMALL LETTER R WITH TAIL [2000]
+0x85EF U+0282 # LATIN SMALL LETTER S WITH HOOK [2000]
+0x85F0 U+0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK [2000]
+0x85F1 U+027B # LATIN SMALL LETTER TURNED R WITH HOOK [2000]
+0x85F2 U+026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK [2000]
+0x85F3 U+025F # LATIN SMALL LETTER DOTLESS J WITH STROKE [2000]
+0x85F4 U+0272 # LATIN SMALL LETTER N WITH LEFT HOOK [2000]
+0x85F5 U+029D # LATIN SMALL LETTER J WITH CROSSED-TAIL [2000]
+0x85F6 U+028E # LATIN SMALL LETTER TURNED Y [2000]
+0x85F7 U+0261 # LATIN SMALL LETTER SCRIPT G [2000]
+0x85F8 U+014B # LATIN SMALL LETTER ENG [2000]
+0x85F9 U+0270 # LATIN SMALL LETTER TURNED M WITH LONG LEG [2000]
+0x85FA U+0281 # LATIN LETTER SMALL CAPITAL INVERTED R [2000]
+0x85FB U+0127 # LATIN SMALL LETTER H WITH STROKE [2000]
+0x85FC U+0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE [2000]
+0x8640 U+0294 # LATIN LETTER GLOTTAL STOP [2000]
+0x8641 U+0266 # LATIN SMALL LETTER H WITH HOOK [2000]
+0x8642 U+0298 # LATIN LETTER BILABIAL CLICK [2000]
+0x8643 U+01C2 # LATIN LETTER ALVEOLAR CLICK [2000]
+0x8644 U+0253 # LATIN SMALL LETTER B WITH HOOK [2000]
+0x8645 U+0257 # LATIN SMALL LETTER D WITH HOOK [2000]
+0x8646 U+0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK [2000]
+0x8647 U+0260 # LATIN SMALL LETTER G WITH HOOK [2000]
+0x8648 U+0193 # LATIN CAPITAL LETTER G WITH HOOK [2000]
+0x8649 U+0153 # LATIN SMALL LIGATURE OE [2000]
+0x864A U+0152 # LATIN CAPITAL LIGATURE OE [2000]
+0x864B U+0268 # LATIN SMALL LETTER I WITH STROKE [2000]
+0x864C U+0289 # LATIN SMALL LETTER U BAR [2000]
+0x864D U+0258 # LATIN SMALL LETTER REVERSED E [2000]
+0x864E U+0275 # LATIN SMALL LETTER BARRED O [2000]
+0x864F U+0259 # LATIN SMALL LETTER SCHWA [2000]
+0x8650 U+025C # LATIN SMALL LETTER REVERSED OPEN E [2000]
+0x8651 U+025E # LATIN SMALL LETTER CLOSED REVERSED OPEN E [2000]
+0x8652 U+0250 # LATIN SMALL LETTER TURNED A [2000]
+0x8653 U+026F # LATIN SMALL LETTER TURNED M [2000]
+0x8654 U+028A # LATIN SMALL LETTER UPSILON [2000]
+0x8655 U+0264 # LATIN SMALL LETTER RAMS HORN [2000]
+0x8656 U+028C # LATIN SMALL LETTER TURNED V [2000]
+0x8657 U+0254 # LATIN SMALL LETTER OPEN O [2000]
+0x8658 U+0251 # LATIN SMALL LETTER ALPHA [2000]
+0x8659 U+0252 # LATIN SMALL LETTER TURNED ALPHA [2000]
+0x865A U+028D # LATIN SMALL LETTER TURNED W [2000]
+0x865B U+0265 # LATIN SMALL LETTER TURNED H [2000]
+0x865C U+02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE [2000]
+0x865D U+02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE [2000]
+0x865E U+0255 # LATIN SMALL LETTER C WITH CURL [2000]
+0x865F U+0291 # LATIN SMALL LETTER Z WITH CURL [2000]
+0x8660 U+027A # LATIN SMALL LETTER TURNED R WITH LONG LEG [2000]
+0x8661 U+0267 # LATIN SMALL LETTER HENG WITH HOOK [2000]
+0x8662 U+025A # LATIN SMALL LETTER SCHWA WITH HOOK [2000]
+0x8663 U+00E6+0300 # [2000]
+0x8664 U+01FD # LATIN SMALL LETTER AE WITH ACUTE [2000]
+0x8665 U+1F70 # GREEK SMALL LETTER ALPHA WITH VARIA [2000]
+0x8666 U+1F71 # GREEK SMALL LETTER ALPHA WITH OXIA [2000]
+0x8667 U+0254+0300 # [2000]
+0x8668 U+0254+0301 # [2000]
+0x8669 U+028C+0300 # [2000]
+0x866A U+028C+0301 # [2000]
+0x866B U+0259+0300 # [2000]
+0x866C U+0259+0301 # [2000]
+0x866D U+025A+0300 # [2000]
+0x866E U+025A+0301 # [2000]
+0x866F U+1F72 # GREEK SMALL LETTER EPSILON WITH VARIA [2000]
+0x8670 U+1F73 # GREEK SMALL LETTER EPSILON WITH OXIA [2000]
+0x8671 U+0361 # COMBINING DOUBLE INVERTED BREVE [2000]
+0x8672 U+02C8 # MODIFIER LETTER VERTICAL LINE [2000]
+0x8673 U+02CC # MODIFIER LETTER LOW VERTICAL LINE [2000]
+0x8674 U+02D0 # MODIFIER LETTER TRIANGULAR COLON [2000]
+0x8675 U+02D1 # MODIFIER LETTER HALF TRIANGULAR COLON [2000]
+0x8676 U+0306 # COMBINING BREVE [2000]
+0x8677 U+203F # UNDERTIE [2000]
+0x8678 U+030B # COMBINING DOUBLE ACUTE ACCENT [2000]
+0x8679 U+0301 # COMBINING ACUTE ACCENT [2000]
+0x867A U+0304 # COMBINING MACRON [2000]
+0x867B U+0300 # COMBINING GRAVE ACCENT [2000]
+0x867C U+030F # COMBINING DOUBLE GRAVE ACCENT [2000]
+0x867D U+030C # COMBINING CARON [2000]
+0x867E U+0302 # COMBINING CIRCUMFLEX ACCENT [2000]
+0x8680 U+02E5 # MODIFIER LETTER EXTRA-HIGH TONE BAR [2000]
+0x8681 U+02E6 # MODIFIER LETTER HIGH TONE BAR [2000]
+0x8682 U+02E7 # MODIFIER LETTER MID TONE BAR [2000]
+0x8683 U+02E8 # MODIFIER LETTER LOW TONE BAR [2000]
+0x8684 U+02E9 # MODIFIER LETTER EXTRA-LOW TONE BAR [2000]
+0x8685 U+02E9+02E5 # [2000]
+0x8686 U+02E5+02E9 # [2000]
+0x8687 U+0325 # COMBINING RING BELOW [2000]
+0x8688 U+032C # COMBINING CARON BELOW [2000]
+0x8689 U+0339 # COMBINING RIGHT HALF RING BELOW [2000]
+0x868A U+031C # COMBINING LEFT HALF RING BELOW [2000]
+0x868B U+031F # COMBINING PLUS SIGN BELOW [2000]
+0x868C U+0320 # COMBINING MINUS SIGN BELOW [2000]
+0x868D U+0308 # COMBINING DIAERESIS [2000]
+0x868E U+033D # COMBINING X ABOVE [2000]
+0x868F U+0329 # COMBINING VERTICAL LINE BELOW [2000]
+0x8690 U+032F # COMBINING INVERTED BREVE BELOW [2000]
+0x8691 U+02DE # MODIFIER LETTER RHOTIC HOOK [2000]
+0x8692 U+0324 # COMBINING DIAERESIS BELOW [2000]
+0x8693 U+0330 # COMBINING TILDE BELOW [2000]
+0x8694 U+033C # COMBINING SEAGULL BELOW [2000]
+0x8695 U+0334 # COMBINING TILDE OVERLAY [2000]
+0x8696 U+031D # COMBINING UP TACK BELOW [2000]
+0x8697 U+031E # COMBINING DOWN TACK BELOW [2000]
+0x8698 U+0318 # COMBINING LEFT TACK BELOW [2000]
+0x8699 U+0319 # COMBINING RIGHT TACK BELOW [2000]
+0x869A U+032A # COMBINING BRIDGE BELOW [2000]
+0x869B U+033A # COMBINING INVERTED BRIDGE BELOW [2000]
+0x869C U+033B # COMBINING SQUARE BELOW [2000]
+0x869D U+0303 # COMBINING TILDE [2000]
+0x869E U+031A # COMBINING LEFT ANGLE ABOVE [2000]
+0x869F U+2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE [2000]
+0x86A0 U+2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO [2000]
+0x86A1 U+2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE [2000]
+0x86A2 U+2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR [2000]
+0x86A3 U+277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE [2000]
+0x86A4 U+277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX [2000]
+0x86A5 U+277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN [2000]
+0x86A6 U+277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT [2000]
+0x86A7 U+277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE [2000]
+0x86A8 U+277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN [2000]
+0x86A9 U+24EB # NEGATIVE CIRCLED NUMBER ELEVEN [2000] [Unicode3.2]
+0x86AA U+24EC # NEGATIVE CIRCLED NUMBER TWELVE [2000] [Unicode3.2]
+0x86AB U+24ED # NEGATIVE CIRCLED NUMBER THIRTEEN [2000] [Unicode3.2]
+0x86AC U+24EE # NEGATIVE CIRCLED NUMBER FOURTEEN [2000] [Unicode3.2]
+0x86AD U+24EF # NEGATIVE CIRCLED NUMBER FIFTEEN [2000] [Unicode3.2]
+0x86AE U+24F0 # NEGATIVE CIRCLED NUMBER SIXTEEN [2000] [Unicode3.2]
+0x86AF U+24F1 # NEGATIVE CIRCLED NUMBER SEVENTEEN [2000] [Unicode3.2]
+0x86B0 U+24F2 # NEGATIVE CIRCLED NUMBER EIGHTEEN [2000] [Unicode3.2]
+0x86B1 U+24F3 # NEGATIVE CIRCLED NUMBER NINETEEN [2000] [Unicode3.2]
+0x86B2 U+24F4 # NEGATIVE CIRCLED NUMBER TWENTY [2000] [Unicode3.2]
+0x86B3 U+2170 # SMALL ROMAN NUMERAL ONE [2000]
+0x86B4 U+2171 # SMALL ROMAN NUMERAL TWO [2000]
+0x86B5 U+2172 # SMALL ROMAN NUMERAL THREE [2000]
+0x86B6 U+2173 # SMALL ROMAN NUMERAL FOUR [2000]
+0x86B7 U+2174 # SMALL ROMAN NUMERAL FIVE [2000]
+0x86B8 U+2175 # SMALL ROMAN NUMERAL SIX [2000]
+0x86B9 U+2176 # SMALL ROMAN NUMERAL SEVEN [2000]
+0x86BA U+2177 # SMALL ROMAN NUMERAL EIGHT [2000]
+0x86BB U+2178 # SMALL ROMAN NUMERAL NINE [2000]
+0x86BC U+2179 # SMALL ROMAN NUMERAL TEN [2000]
+0x86BD U+217A # SMALL ROMAN NUMERAL ELEVEN [2000]
+0x86BE U+217B # SMALL ROMAN NUMERAL TWELVE [2000]
+0x86BF U+24D0 # CIRCLED LATIN SMALL LETTER A [2000]
+0x86C0 U+24D1 # CIRCLED LATIN SMALL LETTER B [2000]
+0x86C1 U+24D2 # CIRCLED LATIN SMALL LETTER C [2000]
+0x86C2 U+24D3 # CIRCLED LATIN SMALL LETTER D [2000]
+0x86C3 U+24D4 # CIRCLED LATIN SMALL LETTER E [2000]
+0x86C4 U+24D5 # CIRCLED LATIN SMALL LETTER F [2000]
+0x86C5 U+24D6 # CIRCLED LATIN SMALL LETTER G [2000]
+0x86C6 U+24D7 # CIRCLED LATIN SMALL LETTER H [2000]
+0x86C7 U+24D8 # CIRCLED LATIN SMALL LETTER I [2000]
+0x86C8 U+24D9 # CIRCLED LATIN SMALL LETTER J [2000]
+0x86C9 U+24DA # CIRCLED LATIN SMALL LETTER K [2000]
+0x86CA U+24DB # CIRCLED LATIN SMALL LETTER L [2000]
+0x86CB U+24DC # CIRCLED LATIN SMALL LETTER M [2000]
+0x86CC U+24DD # CIRCLED LATIN SMALL LETTER N [2000]
+0x86CD U+24DE # CIRCLED LATIN SMALL LETTER O [2000]
+0x86CE U+24DF # CIRCLED LATIN SMALL LETTER P [2000]
+0x86CF U+24E0 # CIRCLED LATIN SMALL LETTER Q [2000]
+0x86D0 U+24E1 # CIRCLED LATIN SMALL LETTER R [2000]
+0x86D1 U+24E2 # CIRCLED LATIN SMALL LETTER S [2000]
+0x86D2 U+24E3 # CIRCLED LATIN SMALL LETTER T [2000]
+0x86D3 U+24E4 # CIRCLED LATIN SMALL LETTER U [2000]
+0x86D4 U+24E5 # CIRCLED LATIN SMALL LETTER V [2000]
+0x86D5 U+24E6 # CIRCLED LATIN SMALL LETTER W [2000]
+0x86D6 U+24E7 # CIRCLED LATIN SMALL LETTER X [2000]
+0x86D7 U+24E8 # CIRCLED LATIN SMALL LETTER Y [2000]
+0x86D8 U+24E9 # CIRCLED LATIN SMALL LETTER Z [2000]
+0x86D9 U+32D0 # CIRCLED KATAKANA A [2000]
+0x86DA U+32D1 # CIRCLED KATAKANA I [2000]
+0x86DB U+32D2 # CIRCLED KATAKANA U [2000]
+0x86DC U+32D3 # CIRCLED KATAKANA E [2000]
+0x86DD U+32D4 # CIRCLED KATAKANA O [2000]
+0x86DE U+32D5 # CIRCLED KATAKANA KA [2000]
+0x86DF U+32D6 # CIRCLED KATAKANA KI [2000]
+0x86E0 U+32D7 # CIRCLED KATAKANA KU [2000]
+0x86E1 U+32D8 # CIRCLED KATAKANA KE [2000]
+0x86E2 U+32D9 # CIRCLED KATAKANA KO [2000]
+0x86E3 U+32DA # CIRCLED KATAKANA SA [2000]
+0x86E4 U+32DB # CIRCLED KATAKANA SI [2000]
+0x86E5 U+32DC # CIRCLED KATAKANA SU [2000]
+0x86E6 U+32DD # CIRCLED KATAKANA SE [2000]
+0x86E7 U+32DE # CIRCLED KATAKANA SO [2000]
+0x86E8 U+32DF # CIRCLED KATAKANA TA [2000]
+0x86E9 U+32E0 # CIRCLED KATAKANA TI [2000]
+0x86EA U+32E1 # CIRCLED KATAKANA TU [2000]
+0x86EB U+32E2 # CIRCLED KATAKANA TE [2000]
+0x86EC U+32E3 # CIRCLED KATAKANA TO [2000]
+0x86ED U+32FA # CIRCLED KATAKANA RO [2000]
+0x86EE U+32E9 # CIRCLED KATAKANA HA [2000]
+0x86EF U+32E5 # CIRCLED KATAKANA NI [2000]
+0x86F0 U+32ED # CIRCLED KATAKANA HO [2000]
+0x86F1 U+32EC # CIRCLED KATAKANA HE [2000]
+0x86F2 # <reserved>
+0x86F3 # <reserved>
+0x86F4 # <reserved>
+0x86F5 # <reserved>
+0x86F6 # <reserved>
+0x86F7 # <reserved>
+0x86F8 # <reserved>
+0x86F9 # <reserved>
+0x86FA # <reserved>
+0x86FB U+2051 # TWO ASTERISKS ALIGNED VERTICALLY [2000] [Unicode3.2]
+0x86FC U+2042 # ASTERISM [2000]
+0x8740 U+2460 # CIRCLED DIGIT ONE [2000]
+0x8741 U+2461 # CIRCLED DIGIT TWO [2000]
+0x8742 U+2462 # CIRCLED DIGIT THREE [2000]
+0x8743 U+2463 # CIRCLED DIGIT FOUR [2000]
+0x8744 U+2464 # CIRCLED DIGIT FIVE [2000]
+0x8745 U+2465 # CIRCLED DIGIT SIX [2000]
+0x8746 U+2466 # CIRCLED DIGIT SEVEN [2000]
+0x8747 U+2467 # CIRCLED DIGIT EIGHT [2000]
+0x8748 U+2468 # CIRCLED DIGIT NINE [2000]
+0x8749 U+2469 # CIRCLED NUMBER TEN [2000]
+0x874A U+246A # CIRCLED NUMBER ELEVEN [2000]
+0x874B U+246B # CIRCLED NUMBER TWELVE [2000]
+0x874C U+246C # CIRCLED NUMBER THIRTEEN [2000]
+0x874D U+246D # CIRCLED NUMBER FOURTEEN [2000]
+0x874E U+246E # CIRCLED NUMBER FIFTEEN [2000]
+0x874F U+246F # CIRCLED NUMBER SIXTEEN [2000]
+0x8750 U+2470 # CIRCLED NUMBER SEVENTEEN [2000]
+0x8751 U+2471 # CIRCLED NUMBER EIGHTEEN [2000]
+0x8752 U+2472 # CIRCLED NUMBER NINETEEN [2000]
+0x8753 U+2473 # CIRCLED NUMBER TWENTY [2000]
+0x8754 U+2160 # ROMAN NUMERAL ONE [2000]
+0x8755 U+2161 # ROMAN NUMERAL TWO [2000]
+0x8756 U+2162 # ROMAN NUMERAL THREE [2000]
+0x8757 U+2163 # ROMAN NUMERAL FOUR [2000]
+0x8758 U+2164 # ROMAN NUMERAL FIVE [2000]
+0x8759 U+2165 # ROMAN NUMERAL SIX [2000]
+0x875A U+2166 # ROMAN NUMERAL SEVEN [2000]
+0x875B U+2167 # ROMAN NUMERAL EIGHT [2000]
+0x875C U+2168 # ROMAN NUMERAL NINE [2000]
+0x875D U+2169 # ROMAN NUMERAL TEN [2000]
+0x875E U+216A # ROMAN NUMERAL ELEVEN [2000]
+0x875F U+3349 # SQUARE MIRI [2000]
+0x8760 U+3314 # SQUARE KIRO [2000]
+0x8761 U+3322 # SQUARE SENTI [2000]
+0x8762 U+334D # SQUARE MEETORU [2000]
+0x8763 U+3318 # SQUARE GURAMU [2000]
+0x8764 U+3327 # SQUARE TON [2000]
+0x8765 U+3303 # SQUARE AARU [2000]
+0x8766 U+3336 # SQUARE HEKUTAARU [2000]
+0x8767 U+3351 # SQUARE RITTORU [2000]
+0x8768 U+3357 # SQUARE WATTO [2000]
+0x8769 U+330D # SQUARE KARORII [2000]
+0x876A U+3326 # SQUARE DORU [2000]
+0x876B U+3323 # SQUARE SENTO [2000]
+0x876C U+332B # SQUARE PAASENTO [2000]
+0x876D U+334A # SQUARE MIRIBAARU [2000]
+0x876E U+333B # SQUARE PEEZI [2000]
+0x876F U+339C # SQUARE MM [2000]
+0x8770 U+339D # SQUARE CM [2000]
+0x8771 U+339E # SQUARE KM [2000]
+0x8772 U+338E # SQUARE MG [2000]
+0x8773 U+338F # SQUARE KG [2000]
+0x8774 U+33C4 # SQUARE CC [2000]
+0x8775 U+33A1 # SQUARE M SQUARED [2000]
+0x8776 U+216B # ROMAN NUMERAL TWELVE [2000]
+0x8777 # <reserved>
+0x8778 # <reserved>
+0x8779 # <reserved>
+0x877A # <reserved>
+0x877B # <reserved>
+0x877C # <reserved>
+0x877D # <reserved>
+0x877E U+337B # SQUARE ERA NAME HEISEI [2000]
+0x8780 U+301D # REVERSED DOUBLE PRIME QUOTATION MARK [2000]
+0x8781 U+301F # LOW DOUBLE PRIME QUOTATION MARK [2000]
+0x8782 U+2116 # NUMERO SIGN [2000]
+0x8783 U+33CD # SQUARE KK [2000]
+0x8784 U+2121 # TELEPHONE SIGN [2000]
+0x8785 U+32A4 # CIRCLED IDEOGRAPH HIGH [2000]
+0x8786 U+32A5 # CIRCLED IDEOGRAPH CENTRE [2000]
+0x8787 U+32A6 # CIRCLED IDEOGRAPH LOW [2000]
+0x8788 U+32A7 # CIRCLED IDEOGRAPH LEFT [2000]
+0x8789 U+32A8 # CIRCLED IDEOGRAPH RIGHT [2000]
+0x878A U+3231 # PARENTHESIZED IDEOGRAPH STOCK [2000]
+0x878B U+3232 # PARENTHESIZED IDEOGRAPH HAVE [2000]
+0x878C U+3239 # PARENTHESIZED IDEOGRAPH REPRESENT [2000]
+0x878D U+337E # SQUARE ERA NAME MEIZI [2000]
+0x878E U+337D # SQUARE ERA NAME TAISYOU [2000]
+0x878F U+337C # SQUARE ERA NAME SYOUWA [2000]
+0x8790 # <reserved> Windows: U+2252
+0x8791 # <reserved> Windows: U+2261
+0x8792 # <reserved> Windows: U+222B
+0x8793 U+222E # CONTOUR INTEGRAL [2000]
+0x8794 # <reserved> Windows: U+2211
+0x8795 # <reserved> Windows: U+221A
+0x8796 # <reserved> Windows: U+22A5
+0x8797 # <reserved> Windows: U+2220
+0x8798 U+221F # RIGHT ANGLE [2000]
+0x8799 U+22BF # RIGHT TRIANGLE [2000]
+0x879A # <reserved> Windows: U+2235
+0x879B # <reserved> Windows: U+2229
+0x879C # <reserved> Windows: U+222A
+0x879D U+2756 # BLACK DIAMOND MINUS WHITE X [2000]
+0x879E U+261E # WHITE RIGHT POINTING INDEX [2000]
+0x879F U+4FF1 # <cjk> [2004]
+0x87A0 U+2000B # <cjk> [2000] [Unicode3.1]
+0x87A1 U+3402 # <cjk> [2000]
+0x87A2 U+4E28 # <cjk> [2000]
+0x87A3 U+4E2F # <cjk> [2000]
+0x87A4 U+4E30 # <cjk> [2000]
+0x87A5 U+4E8D # <cjk> [2000]
+0x87A6 U+4EE1 # <cjk> [2000]
+0x87A7 U+4EFD # <cjk> [2000]
+0x87A8 U+4EFF # <cjk> [2000]
+0x87A9 U+4F03 # <cjk> [2000]
+0x87AA U+4F0B # <cjk> [2000]
+0x87AB U+4F60 # <cjk> [2000]
+0x87AC U+4F48 # <cjk> [2000]
+0x87AD U+4F49 # <cjk> [2000]
+0x87AE U+4F56 # <cjk> [2000]
+0x87AF U+4F5F # <cjk> [2000]
+0x87B0 U+4F6A # <cjk> [2000]
+0x87B1 U+4F6C # <cjk> [2000]
+0x87B2 U+4F7E # <cjk> [2000]
+0x87B3 U+4F8A # <cjk> [2000]
+0x87B4 U+4F94 # <cjk> [2000]
+0x87B5 U+4F97 # <cjk> [2000]
+0x87B6 U+FA30 # CJK COMPATIBILITY IDEOGRAPH-FA30 [2000] [Unicode3.2]
+0x87B7 U+4FC9 # <cjk> [2000]
+0x87B8 U+4FE0 # <cjk> [2000]
+0x87B9 U+5001 # <cjk> [2000]
+0x87BA U+5002 # <cjk> [2000]
+0x87BB U+500E # <cjk> [2000]
+0x87BC U+5018 # <cjk> [2000]
+0x87BD U+5027 # <cjk> [2000]
+0x87BE U+502E # <cjk> [2000]
+0x87BF U+5040 # <cjk> [2000]
+0x87C0 U+503B # <cjk> [2000]
+0x87C1 U+5041 # <cjk> [2000]
+0x87C2 U+5094 # <cjk> [2000]
+0x87C3 U+50CC # <cjk> [2000]
+0x87C4 U+50F2 # <cjk> [2000]
+0x87C5 U+50D0 # <cjk> [2000]
+0x87C6 U+50E6 # <cjk> [2000]
+0x87C7 U+FA31 # CJK COMPATIBILITY IDEOGRAPH-FA31 [2000] [Unicode3.2]
+0x87C8 U+5106 # <cjk> [2000]
+0x87C9 U+5103 # <cjk> [2000]
+0x87CA U+510B # <cjk> [2000]
+0x87CB U+511E # <cjk> [2000]
+0x87CC U+5135 # <cjk> [2000]
+0x87CD U+514A # <cjk> [2000]
+0x87CE U+FA32 # CJK COMPATIBILITY IDEOGRAPH-FA32 [2000] [Unicode3.2]
+0x87CF U+5155 # <cjk> [2000]
+0x87D0 U+5157 # <cjk> [2000]
+0x87D1 U+34B5 # <cjk> [2000]
+0x87D2 U+519D # <cjk> [2000]
+0x87D3 U+51C3 # <cjk> [2000]
+0x87D4 U+51CA # <cjk> [2000]
+0x87D5 U+51DE # <cjk> [2000]
+0x87D6 U+51E2 # <cjk> [2000]
+0x87D7 U+51EE # <cjk> [2000]
+0x87D8 U+5201 # <cjk> [2000]
+0x87D9 U+34DB # <cjk> [2000]
+0x87DA U+5213 # <cjk> [2000]
+0x87DB U+5215 # <cjk> [2000]
+0x87DC U+5249 # <cjk> [2000]
+0x87DD U+5257 # <cjk> [2000]
+0x87DE U+5261 # <cjk> [2000]
+0x87DF U+5293 # <cjk> [2000]
+0x87E0 U+52C8 # <cjk> [2000]
+0x87E1 U+FA33 # CJK COMPATIBILITY IDEOGRAPH-FA33 [2000] [Unicode3.2]
+0x87E2 U+52CC # <cjk> [2000]
+0x87E3 U+52D0 # <cjk> [2000]
+0x87E4 U+52D6 # <cjk> [2000]
+0x87E5 U+52DB # <cjk> [2000]
+0x87E6 U+FA34 # CJK COMPATIBILITY IDEOGRAPH-FA34 [2000] [Unicode3.2]
+0x87E7 U+52F0 # <cjk> [2000]
+0x87E8 U+52FB # <cjk> [2000]
+0x87E9 U+5300 # <cjk> [2000]
+0x87EA U+5307 # <cjk> [2000]
+0x87EB U+531C # <cjk> [2000]
+0x87EC U+FA35 # CJK COMPATIBILITY IDEOGRAPH-FA35 [2000] [Unicode3.2]
+0x87ED U+5361 # <cjk> [2000]
+0x87EE U+5363 # <cjk> [2000]
+0x87EF U+537D # <cjk> [2000]
+0x87F0 U+5393 # <cjk> [2000]
+0x87F1 U+539D # <cjk> [2000]
+0x87F2 U+53B2 # <cjk> [2000]
+0x87F3 U+5412 # <cjk> [2000]
+0x87F4 U+5427 # <cjk> [2000]
+0x87F5 U+544D # <cjk> [2000]
+0x87F6 U+549C # <cjk> [2000]
+0x87F7 U+546B # <cjk> [2000]
+0x87F8 U+5474 # <cjk> [2000]
+0x87F9 U+547F # <cjk> [2000]
+0x87FA U+5488 # <cjk> [2000]
+0x87FB U+5496 # <cjk> [2000]
+0x87FC U+54A1 # <cjk> [2000]
+0x8840 U+54A9 # <cjk> [2000]
+0x8841 U+54C6 # <cjk> [2000]
+0x8842 U+54FF # <cjk> [2000]
+0x8843 U+550E # <cjk> [2000]
+0x8844 U+552B # <cjk> [2000]
+0x8845 U+5535 # <cjk> [2000]
+0x8846 U+5550 # <cjk> [2000]
+0x8847 U+555E # <cjk> [2000]
+0x8848 U+5581 # <cjk> [2000]
+0x8849 U+5586 # <cjk> [2000]
+0x884A U+558E # <cjk> [2000]
+0x884B U+FA36 # CJK COMPATIBILITY IDEOGRAPH-FA36 [2000] [Unicode3.2]
+0x884C U+55AD # <cjk> [2000]
+0x884D U+55CE # <cjk> [2000]
+0x884E U+FA37 # CJK COMPATIBILITY IDEOGRAPH-FA37 [2000] [Unicode3.2]
+0x884F U+5608 # <cjk> [2000]
+0x8850 U+560E # <cjk> [2000]
+0x8851 U+563B # <cjk> [2000]
+0x8852 U+5649 # <cjk> [2000]
+0x8853 U+5676 # <cjk> [2000]
+0x8854 U+5666 # <cjk> [2000]
+0x8855 U+FA38 # CJK COMPATIBILITY IDEOGRAPH-FA38 [2000] [Unicode3.2]
+0x8856 U+566F # <cjk> [2000]
+0x8857 U+5671 # <cjk> [2000]
+0x8858 U+5672 # <cjk> [2000]
+0x8859 U+5699 # <cjk> [2000]
+0x885A U+569E # <cjk> [2000]
+0x885B U+56A9 # <cjk> [2000]
+0x885C U+56AC # <cjk> [2000]
+0x885D U+56B3 # <cjk> [2000]
+0x885E U+56C9 # <cjk> [2000]
+0x885F U+56CA # <cjk> [2000]
+0x8860 U+570A # <cjk> [2000]
+0x8861 U+2123D # <cjk> [2000] [Unicode3.1]
+0x8862 U+5721 # <cjk> [2000]
+0x8863 U+572F # <cjk> [2000]
+0x8864 U+5733 # <cjk> [2000]
+0x8865 U+5734 # <cjk> [2000]
+0x8866 U+5770 # <cjk> [2000]
+0x8867 U+5777 # <cjk> [2000]
+0x8868 U+577C # <cjk> [2000]
+0x8869 U+579C # <cjk> [2000]
+0x886A U+FA0F # CJK COMPATIBILITY IDEOGRAPH-FA0F [2000]
+0x886B U+2131B # <cjk> [2000] [Unicode3.1]
+0x886C U+57B8 # <cjk> [2000]
+0x886D U+57C7 # <cjk> [2000]
+0x886E U+57C8 # <cjk> [2000]
+0x886F U+57CF # <cjk> [2000]
+0x8870 U+57E4 # <cjk> [2000]
+0x8871 U+57ED # <cjk> [2000]
+0x8872 U+57F5 # <cjk> [2000]
+0x8873 U+57F6 # <cjk> [2000]
+0x8874 U+57FF # <cjk> [2000]
+0x8875 U+5809 # <cjk> [2000]
+0x8876 U+FA10 # CJK COMPATIBILITY IDEOGRAPH-FA10 [2000]
+0x8877 U+5861 # <cjk> [2000]
+0x8878 U+5864 # <cjk> [2000]
+0x8879 U+FA39 # CJK COMPATIBILITY IDEOGRAPH-FA39 [2000] [Unicode3.2]
+0x887A U+587C # <cjk> [2000]
+0x887B U+5889 # <cjk> [2000]
+0x887C U+589E # <cjk> [2000]
+0x887D U+FA3A # CJK COMPATIBILITY IDEOGRAPH-FA3A [2000] [Unicode3.2]
+0x887E U+58A9 # <cjk> [2000]
+0x8880 U+2146E # <cjk> [2000] [Unicode3.1]
+0x8881 U+58D2 # <cjk> [2000]
+0x8882 U+58CE # <cjk> [2000]
+0x8883 U+58D4 # <cjk> [2000]
+0x8884 U+58DA # <cjk> [2000]
+0x8885 U+58E0 # <cjk> [2000]
+0x8886 U+58E9 # <cjk> [2000]
+0x8887 U+590C # <cjk> [2000]
+0x8888 U+8641 # <cjk> [2000]
+0x8889 U+595D # <cjk> [2000]
+0x888A U+596D # <cjk> [2000]
+0x888B U+598B # <cjk> [2000]
+0x888C U+5992 # <cjk> [2000]
+0x888D U+59A4 # <cjk> [2000]
+0x888E U+59C3 # <cjk> [2000]
+0x888F U+59D2 # <cjk> [2000]
+0x8890 U+59DD # <cjk> [2000]
+0x8891 U+5A13 # <cjk> [2000]
+0x8892 U+5A23 # <cjk> [2000]
+0x8893 U+5A67 # <cjk> [2000]
+0x8894 U+5A6D # <cjk> [2000]
+0x8895 U+5A77 # <cjk> [2000]
+0x8896 U+5A7E # <cjk> [2000]
+0x8897 U+5A84 # <cjk> [2000]
+0x8898 U+5A9E # <cjk> [2000]
+0x8899 U+5AA7 # <cjk> [2000]
+0x889A U+5AC4 # <cjk> [2000]
+0x889B U+218BD # <cjk> [2000] [Unicode3.1]
+0x889C U+5B19 # <cjk> [2000]
+0x889D U+5B25 # <cjk> [2000]
+0x889E U+525D # <cjk> [2004]
+0x889F U+4E9C # <cjk>
+0x88A0 U+5516 # <cjk>
+0x88A1 U+5A03 # <cjk>
+0x88A2 U+963F # <cjk>
+0x88A3 U+54C0 # <cjk>
+0x88A4 U+611B # <cjk>
+0x88A5 U+6328 # <cjk>
+0x88A6 U+59F6 # <cjk>
+0x88A7 U+9022 # <cjk>
+0x88A8 U+8475 # <cjk>
+0x88A9 U+831C # <cjk>
+0x88AA U+7A50 # <cjk>
+0x88AB U+60AA # <cjk>
+0x88AC U+63E1 # <cjk>
+0x88AD U+6E25 # <cjk>
+0x88AE U+65ED # <cjk>
+0x88AF U+8466 # <cjk>
+0x88B0 U+82A6 # <cjk>
+0x88B1 U+9BF5 # <cjk>
+0x88B2 U+6893 # <cjk>
+0x88B3 U+5727 # <cjk>
+0x88B4 U+65A1 # <cjk>
+0x88B5 U+6271 # <cjk>
+0x88B6 U+5B9B # <cjk>
+0x88B7 U+59D0 # <cjk>
+0x88B8 U+867B # <cjk>
+0x88B9 U+98F4 # <cjk>
+0x88BA U+7D62 # <cjk>
+0x88BB U+7DBE # <cjk>
+0x88BC U+9B8E # <cjk>
+0x88BD U+6216 # <cjk>
+0x88BE U+7C9F # <cjk>
+0x88BF U+88B7 # <cjk>
+0x88C0 U+5B89 # <cjk>
+0x88C1 U+5EB5 # <cjk>
+0x88C2 U+6309 # <cjk>
+0x88C3 U+6697 # <cjk>
+0x88C4 U+6848 # <cjk>
+0x88C5 U+95C7 # <cjk>
+0x88C6 U+978D # <cjk>
+0x88C7 U+674F # <cjk>
+0x88C8 U+4EE5 # <cjk>
+0x88C9 U+4F0A # <cjk>
+0x88CA U+4F4D # <cjk>
+0x88CB U+4F9D # <cjk>
+0x88CC U+5049 # <cjk>
+0x88CD U+56F2 # <cjk>
+0x88CE U+5937 # <cjk>
+0x88CF U+59D4 # <cjk>
+0x88D0 U+5A01 # <cjk>
+0x88D1 U+5C09 # <cjk>
+0x88D2 U+60DF # <cjk>
+0x88D3 U+610F # <cjk>
+0x88D4 U+6170 # <cjk>
+0x88D5 U+6613 # <cjk>
+0x88D6 U+6905 # <cjk>
+0x88D7 U+70BA # <cjk>
+0x88D8 U+754F # <cjk>
+0x88D9 U+7570 # <cjk>
+0x88DA U+79FB # <cjk>
+0x88DB U+7DAD # <cjk>
+0x88DC U+7DEF # <cjk>
+0x88DD U+80C3 # <cjk>
+0x88DE U+840E # <cjk>
+0x88DF U+8863 # <cjk>
+0x88E0 U+8B02 # <cjk>
+0x88E1 U+9055 # <cjk>
+0x88E2 U+907A # <cjk>
+0x88E3 U+533B # <cjk>
+0x88E4 U+4E95 # <cjk>
+0x88E5 U+4EA5 # <cjk>
+0x88E6 U+57DF # <cjk>
+0x88E7 U+80B2 # <cjk>
+0x88E8 U+90C1 # <cjk>
+0x88E9 U+78EF # <cjk>
+0x88EA U+4E00 # <cjk>
+0x88EB U+58F1 # <cjk>
+0x88EC U+6EA2 # <cjk>
+0x88ED U+9038 # <cjk>
+0x88EE U+7A32 # <cjk>
+0x88EF U+8328 # <cjk>
+0x88F0 U+828B # <cjk>
+0x88F1 U+9C2F # <cjk>
+0x88F2 U+5141 # <cjk>
+0x88F3 U+5370 # <cjk>
+0x88F4 U+54BD # <cjk>
+0x88F5 U+54E1 # <cjk>
+0x88F6 U+56E0 # <cjk>
+0x88F7 U+59FB # <cjk>
+0x88F8 U+5F15 # <cjk>
+0x88F9 U+98F2 # <cjk>
+0x88FA U+6DEB # <cjk>
+0x88FB U+80E4 # <cjk>
+0x88FC U+852D # <cjk>
+0x8940 U+9662 # <cjk>
+0x8941 U+9670 # <cjk>
+0x8942 U+96A0 # <cjk>
+0x8943 U+97FB # <cjk>
+0x8944 U+540B # <cjk>
+0x8945 U+53F3 # <cjk>
+0x8946 U+5B87 # <cjk>
+0x8947 U+70CF # <cjk>
+0x8948 U+7FBD # <cjk>
+0x8949 U+8FC2 # <cjk>
+0x894A U+96E8 # <cjk>
+0x894B U+536F # <cjk>
+0x894C U+9D5C # <cjk>
+0x894D U+7ABA # <cjk>
+0x894E U+4E11 # <cjk>
+0x894F U+7893 # <cjk>
+0x8950 U+81FC # <cjk>
+0x8951 U+6E26 # <cjk>
+0x8952 U+5618 # <cjk>
+0x8953 U+5504 # <cjk>
+0x8954 U+6B1D # <cjk>
+0x8955 U+851A # <cjk>
+0x8956 U+9C3B # <cjk>
+0x8957 U+59E5 # <cjk>
+0x8958 U+53A9 # <cjk>
+0x8959 U+6D66 # <cjk>
+0x895A U+74DC # <cjk>
+0x895B U+958F # <cjk>
+0x895C U+5642 # <cjk>
+0x895D U+4E91 # <cjk>
+0x895E U+904B # <cjk>
+0x895F U+96F2 # <cjk>
+0x8960 U+834F # <cjk>
+0x8961 U+990C # <cjk>
+0x8962 U+53E1 # <cjk>
+0x8963 U+55B6 # <cjk>
+0x8964 U+5B30 # <cjk>
+0x8965 U+5F71 # <cjk>
+0x8966 U+6620 # <cjk>
+0x8967 U+66F3 # <cjk>
+0x8968 U+6804 # <cjk>
+0x8969 U+6C38 # <cjk>
+0x896A U+6CF3 # <cjk>
+0x896B U+6D29 # <cjk>
+0x896C U+745B # <cjk>
+0x896D U+76C8 # <cjk>
+0x896E U+7A4E # <cjk>
+0x896F U+9834 # <cjk>
+0x8970 U+82F1 # <cjk>
+0x8971 U+885B # <cjk>
+0x8972 U+8A60 # <cjk>
+0x8973 U+92ED # <cjk>
+0x8974 U+6DB2 # <cjk>
+0x8975 U+75AB # <cjk>
+0x8976 U+76CA # <cjk>
+0x8977 U+99C5 # <cjk>
+0x8978 U+60A6 # <cjk>
+0x8979 U+8B01 # <cjk>
+0x897A U+8D8A # <cjk>
+0x897B U+95B2 # <cjk>
+0x897C U+698E # <cjk>
+0x897D U+53AD # <cjk>
+0x897E U+5186 # <cjk>
+0x8980 U+5712 # <cjk>
+0x8981 U+5830 # <cjk>
+0x8982 U+5944 # <cjk>
+0x8983 U+5BB4 # <cjk>
+0x8984 U+5EF6 # <cjk>
+0x8985 U+6028 # <cjk>
+0x8986 U+63A9 # <cjk>
+0x8987 U+63F4 # <cjk>
+0x8988 U+6CBF # <cjk>
+0x8989 U+6F14 # <cjk>
+0x898A U+708E # <cjk>
+0x898B U+7114 # <cjk>
+0x898C U+7159 # <cjk>
+0x898D U+71D5 # <cjk>
+0x898E U+733F # <cjk>
+0x898F U+7E01 # <cjk>
+0x8990 U+8276 # <cjk>
+0x8991 U+82D1 # <cjk>
+0x8992 U+8597 # <cjk>
+0x8993 U+9060 # <cjk>
+0x8994 U+925B # <cjk>
+0x8995 U+9D1B # <cjk>
+0x8996 U+5869 # <cjk>
+0x8997 U+65BC # <cjk>
+0x8998 U+6C5A # <cjk>
+0x8999 U+7525 # <cjk>
+0x899A U+51F9 # <cjk>
+0x899B U+592E # <cjk>
+0x899C U+5965 # <cjk>
+0x899D U+5F80 # <cjk>
+0x899E U+5FDC # <cjk>
+0x899F U+62BC # <cjk>
+0x89A0 U+65FA # <cjk>
+0x89A1 U+6A2A # <cjk>
+0x89A2 U+6B27 # <cjk>
+0x89A3 U+6BB4 # <cjk>
+0x89A4 U+738B # <cjk>
+0x89A5 U+7FC1 # <cjk>
+0x89A6 U+8956 # <cjk>
+0x89A7 U+9D2C # <cjk>
+0x89A8 U+9D0E # <cjk>
+0x89A9 U+9EC4 # <cjk>
+0x89AA U+5CA1 # <cjk>
+0x89AB U+6C96 # <cjk>
+0x89AC U+837B # <cjk>
+0x89AD U+5104 # <cjk>
+0x89AE U+5C4B # <cjk>
+0x89AF U+61B6 # <cjk>
+0x89B0 U+81C6 # <cjk>
+0x89B1 U+6876 # <cjk>
+0x89B2 U+7261 # <cjk>
+0x89B3 U+4E59 # <cjk>
+0x89B4 U+4FFA # <cjk>
+0x89B5 U+5378 # <cjk>
+0x89B6 U+6069 # <cjk>
+0x89B7 U+6E29 # <cjk>
+0x89B8 U+7A4F # <cjk>
+0x89B9 U+97F3 # <cjk>
+0x89BA U+4E0B # <cjk>
+0x89BB U+5316 # <cjk>
+0x89BC U+4EEE # <cjk>
+0x89BD U+4F55 # <cjk>
+0x89BE U+4F3D # <cjk>
+0x89BF U+4FA1 # <cjk>
+0x89C0 U+4F73 # <cjk>
+0x89C1 U+52A0 # <cjk>
+0x89C2 U+53EF # <cjk>
+0x89C3 U+5609 # <cjk>
+0x89C4 U+590F # <cjk>
+0x89C5 U+5AC1 # <cjk>
+0x89C6 U+5BB6 # <cjk>
+0x89C7 U+5BE1 # <cjk>
+0x89C8 U+79D1 # <cjk>
+0x89C9 U+6687 # <cjk>
+0x89CA U+679C # <cjk>
+0x89CB U+67B6 # <cjk>
+0x89CC U+6B4C # <cjk>
+0x89CD U+6CB3 # <cjk>
+0x89CE U+706B # <cjk>
+0x89CF U+73C2 # <cjk>
+0x89D0 U+798D # <cjk>
+0x89D1 U+79BE # <cjk>
+0x89D2 U+7A3C # <cjk>
+0x89D3 U+7B87 # <cjk>
+0x89D4 U+82B1 # <cjk>
+0x89D5 U+82DB # <cjk>
+0x89D6 U+8304 # <cjk>
+0x89D7 U+8377 # <cjk>
+0x89D8 U+83EF # <cjk>
+0x89D9 U+83D3 # <cjk>
+0x89DA U+8766 # <cjk>
+0x89DB U+8AB2 # <cjk>
+0x89DC U+5629 # <cjk>
+0x89DD U+8CA8 # <cjk>
+0x89DE U+8FE6 # <cjk>
+0x89DF U+904E # <cjk>
+0x89E0 U+971E # <cjk>
+0x89E1 U+868A # <cjk>
+0x89E2 U+4FC4 # <cjk>
+0x89E3 U+5CE8 # <cjk>
+0x89E4 U+6211 # <cjk>
+0x89E5 U+7259 # <cjk>
+0x89E6 U+753B # <cjk>
+0x89E7 U+81E5 # <cjk>
+0x89E8 U+82BD # <cjk>
+0x89E9 U+86FE # <cjk>
+0x89EA U+8CC0 # <cjk>
+0x89EB U+96C5 # <cjk>
+0x89EC U+9913 # <cjk>
+0x89ED U+99D5 # <cjk>
+0x89EE U+4ECB # <cjk>
+0x89EF U+4F1A # <cjk>
+0x89F0 U+89E3 # <cjk>
+0x89F1 U+56DE # <cjk>
+0x89F2 U+584A # <cjk>
+0x89F3 U+58CA # <cjk>
+0x89F4 U+5EFB # <cjk>
+0x89F5 U+5FEB # <cjk>
+0x89F6 U+602A # <cjk>
+0x89F7 U+6094 # <cjk>
+0x89F8 U+6062 # <cjk>
+0x89F9 U+61D0 # <cjk>
+0x89FA U+6212 # <cjk>
+0x89FB U+62D0 # <cjk>
+0x89FC U+6539 # <cjk>
+0x8A40 U+9B41 # <cjk>
+0x8A41 U+6666 # <cjk>
+0x8A42 U+68B0 # <cjk>
+0x8A43 U+6D77 # <cjk>
+0x8A44 U+7070 # <cjk>
+0x8A45 U+754C # <cjk>
+0x8A46 U+7686 # <cjk>
+0x8A47 U+7D75 # <cjk>
+0x8A48 U+82A5 # <cjk>
+0x8A49 U+87F9 # <cjk>
+0x8A4A U+958B # <cjk>
+0x8A4B U+968E # <cjk>
+0x8A4C U+8C9D # <cjk>
+0x8A4D U+51F1 # <cjk>
+0x8A4E U+52BE # <cjk>
+0x8A4F U+5916 # <cjk>
+0x8A50 U+54B3 # <cjk>
+0x8A51 U+5BB3 # <cjk>
+0x8A52 U+5D16 # <cjk>
+0x8A53 U+6168 # <cjk>
+0x8A54 U+6982 # <cjk>
+0x8A55 U+6DAF # <cjk>
+0x8A56 U+788D # <cjk>
+0x8A57 U+84CB # <cjk>
+0x8A58 U+8857 # <cjk>
+0x8A59 U+8A72 # <cjk>
+0x8A5A U+93A7 # <cjk>
+0x8A5B U+9AB8 # <cjk>
+0x8A5C U+6D6C # <cjk>
+0x8A5D U+99A8 # <cjk>
+0x8A5E U+86D9 # <cjk>
+0x8A5F U+57A3 # <cjk>
+0x8A60 U+67FF # <cjk>
+0x8A61 U+86CE # <cjk>
+0x8A62 U+920E # <cjk>
+0x8A63 U+5283 # <cjk>
+0x8A64 U+5687 # <cjk>
+0x8A65 U+5404 # <cjk>
+0x8A66 U+5ED3 # <cjk>
+0x8A67 U+62E1 # <cjk>
+0x8A68 U+64B9 # <cjk>
+0x8A69 U+683C # <cjk>
+0x8A6A U+6838 # <cjk>
+0x8A6B U+6BBB # <cjk>
+0x8A6C U+7372 # <cjk>
+0x8A6D U+78BA # <cjk>
+0x8A6E U+7A6B # <cjk>
+0x8A6F U+899A # <cjk>
+0x8A70 U+89D2 # <cjk>
+0x8A71 U+8D6B # <cjk>
+0x8A72 U+8F03 # <cjk>
+0x8A73 U+90ED # <cjk>
+0x8A74 U+95A3 # <cjk>
+0x8A75 U+9694 # <cjk>
+0x8A76 U+9769 # <cjk>
+0x8A77 U+5B66 # <cjk>
+0x8A78 U+5CB3 # <cjk>
+0x8A79 U+697D # <cjk>
+0x8A7A U+984D # <cjk>
+0x8A7B U+984E # <cjk>
+0x8A7C U+639B # <cjk>
+0x8A7D U+7B20 # <cjk>
+0x8A7E U+6A2B # <cjk>
+0x8A80 U+6A7F # <cjk>
+0x8A81 U+68B6 # <cjk>
+0x8A82 U+9C0D # <cjk>
+0x8A83 U+6F5F # <cjk>
+0x8A84 U+5272 # <cjk>
+0x8A85 U+559D # <cjk>
+0x8A86 U+6070 # <cjk>
+0x8A87 U+62EC # <cjk>
+0x8A88 U+6D3B # <cjk>
+0x8A89 U+6E07 # <cjk>
+0x8A8A U+6ED1 # <cjk>
+0x8A8B U+845B # <cjk>
+0x8A8C U+8910 # <cjk>
+0x8A8D U+8F44 # <cjk>
+0x8A8E U+4E14 # <cjk>
+0x8A8F U+9C39 # <cjk>
+0x8A90 U+53F6 # <cjk>
+0x8A91 U+691B # <cjk>
+0x8A92 U+6A3A # <cjk>
+0x8A93 U+9784 # <cjk>
+0x8A94 U+682A # <cjk>
+0x8A95 U+515C # <cjk>
+0x8A96 U+7AC3 # <cjk>
+0x8A97 U+84B2 # <cjk>
+0x8A98 U+91DC # <cjk>
+0x8A99 U+938C # <cjk>
+0x8A9A U+565B # <cjk>
+0x8A9B U+9D28 # <cjk>
+0x8A9C U+6822 # <cjk>
+0x8A9D U+8305 # <cjk>
+0x8A9E U+8431 # <cjk>
+0x8A9F U+7CA5 # <cjk>
+0x8AA0 U+5208 # <cjk>
+0x8AA1 U+82C5 # <cjk>
+0x8AA2 U+74E6 # <cjk>
+0x8AA3 U+4E7E # <cjk>
+0x8AA4 U+4F83 # <cjk>
+0x8AA5 U+51A0 # <cjk>
+0x8AA6 U+5BD2 # <cjk>
+0x8AA7 U+520A # <cjk>
+0x8AA8 U+52D8 # <cjk>
+0x8AA9 U+52E7 # <cjk>
+0x8AAA U+5DFB # <cjk>
+0x8AAB U+559A # <cjk>
+0x8AAC U+582A # <cjk>
+0x8AAD U+59E6 # <cjk>
+0x8AAE U+5B8C # <cjk>
+0x8AAF U+5B98 # <cjk>
+0x8AB0 U+5BDB # <cjk>
+0x8AB1 U+5E72 # <cjk>
+0x8AB2 U+5E79 # <cjk>
+0x8AB3 U+60A3 # <cjk>
+0x8AB4 U+611F # <cjk>
+0x8AB5 U+6163 # <cjk>
+0x8AB6 U+61BE # <cjk>
+0x8AB7 U+63DB # <cjk>
+0x8AB8 U+6562 # <cjk>
+0x8AB9 U+67D1 # <cjk>
+0x8ABA U+6853 # <cjk>
+0x8ABB U+68FA # <cjk>
+0x8ABC U+6B3E # <cjk>
+0x8ABD U+6B53 # <cjk>
+0x8ABE U+6C57 # <cjk>
+0x8ABF U+6F22 # <cjk>
+0x8AC0 U+6F97 # <cjk>
+0x8AC1 U+6F45 # <cjk>
+0x8AC2 U+74B0 # <cjk>
+0x8AC3 U+7518 # <cjk>
+0x8AC4 U+76E3 # <cjk>
+0x8AC5 U+770B # <cjk>
+0x8AC6 U+7AFF # <cjk>
+0x8AC7 U+7BA1 # <cjk>
+0x8AC8 U+7C21 # <cjk>
+0x8AC9 U+7DE9 # <cjk>
+0x8ACA U+7F36 # <cjk>
+0x8ACB U+7FF0 # <cjk>
+0x8ACC U+809D # <cjk>
+0x8ACD U+8266 # <cjk>
+0x8ACE U+839E # <cjk>
+0x8ACF U+89B3 # <cjk>
+0x8AD0 U+8ACC # <cjk>
+0x8AD1 U+8CAB # <cjk>
+0x8AD2 U+9084 # <cjk>
+0x8AD3 U+9451 # <cjk>
+0x8AD4 U+9593 # <cjk>
+0x8AD5 U+9591 # <cjk>
+0x8AD6 U+95A2 # <cjk>
+0x8AD7 U+9665 # <cjk>
+0x8AD8 U+97D3 # <cjk>
+0x8AD9 U+9928 # <cjk>
+0x8ADA U+8218 # <cjk>
+0x8ADB U+4E38 # <cjk>
+0x8ADC U+542B # <cjk>
+0x8ADD U+5CB8 # <cjk>
+0x8ADE U+5DCC # <cjk>
+0x8ADF U+73A9 # <cjk>
+0x8AE0 U+764C # <cjk>
+0x8AE1 U+773C # <cjk>
+0x8AE2 U+5CA9 # <cjk>
+0x8AE3 U+7FEB # <cjk>
+0x8AE4 U+8D0B # <cjk>
+0x8AE5 U+96C1 # <cjk>
+0x8AE6 U+9811 # <cjk>
+0x8AE7 U+9854 # <cjk>
+0x8AE8 U+9858 # <cjk>
+0x8AE9 U+4F01 # <cjk>
+0x8AEA U+4F0E # <cjk>
+0x8AEB U+5371 # <cjk>
+0x8AEC U+559C # <cjk>
+0x8AED U+5668 # <cjk>
+0x8AEE U+57FA # <cjk>
+0x8AEF U+5947 # <cjk>
+0x8AF0 U+5B09 # <cjk>
+0x8AF1 U+5BC4 # <cjk>
+0x8AF2 U+5C90 # <cjk>
+0x8AF3 U+5E0C # <cjk>
+0x8AF4 U+5E7E # <cjk>
+0x8AF5 U+5FCC # <cjk>
+0x8AF6 U+63EE # <cjk>
+0x8AF7 U+673A # <cjk>
+0x8AF8 U+65D7 # <cjk>
+0x8AF9 U+65E2 # <cjk>
+0x8AFA U+671F # <cjk>
+0x8AFB U+68CB # <cjk>
+0x8AFC U+68C4 # <cjk>
+0x8B40 U+6A5F # <cjk>
+0x8B41 U+5E30 # <cjk>
+0x8B42 U+6BC5 # <cjk>
+0x8B43 U+6C17 # <cjk>
+0x8B44 U+6C7D # <cjk>
+0x8B45 U+757F # <cjk>
+0x8B46 U+7948 # <cjk>
+0x8B47 U+5B63 # <cjk>
+0x8B48 U+7A00 # <cjk>
+0x8B49 U+7D00 # <cjk>
+0x8B4A U+5FBD # <cjk>
+0x8B4B U+898F # <cjk>
+0x8B4C U+8A18 # <cjk>
+0x8B4D U+8CB4 # <cjk>
+0x8B4E U+8D77 # <cjk>
+0x8B4F U+8ECC # <cjk>
+0x8B50 U+8F1D # <cjk>
+0x8B51 U+98E2 # <cjk>
+0x8B52 U+9A0E # <cjk>
+0x8B53 U+9B3C # <cjk>
+0x8B54 U+4E80 # <cjk>
+0x8B55 U+507D # <cjk>
+0x8B56 U+5100 # <cjk>
+0x8B57 U+5993 # <cjk>
+0x8B58 U+5B9C # <cjk>
+0x8B59 U+622F # <cjk>
+0x8B5A U+6280 # <cjk>
+0x8B5B U+64EC # <cjk>
+0x8B5C U+6B3A # <cjk>
+0x8B5D U+72A0 # <cjk>
+0x8B5E U+7591 # <cjk>
+0x8B5F U+7947 # <cjk>
+0x8B60 U+7FA9 # <cjk>
+0x8B61 U+87FB # <cjk>
+0x8B62 U+8ABC # <cjk>
+0x8B63 U+8B70 # <cjk>
+0x8B64 U+63AC # <cjk>
+0x8B65 U+83CA # <cjk>
+0x8B66 U+97A0 # <cjk>
+0x8B67 U+5409 # <cjk>
+0x8B68 U+5403 # <cjk>
+0x8B69 U+55AB # <cjk>
+0x8B6A U+6854 # <cjk>
+0x8B6B U+6A58 # <cjk>
+0x8B6C U+8A70 # <cjk>
+0x8B6D U+7827 # <cjk>
+0x8B6E U+6775 # <cjk>
+0x8B6F U+9ECD # <cjk>
+0x8B70 U+5374 # <cjk>
+0x8B71 U+5BA2 # <cjk>
+0x8B72 U+811A # <cjk>
+0x8B73 U+8650 # <cjk>
+0x8B74 U+9006 # <cjk>
+0x8B75 U+4E18 # <cjk>
+0x8B76 U+4E45 # <cjk>
+0x8B77 U+4EC7 # <cjk>
+0x8B78 U+4F11 # <cjk>
+0x8B79 U+53CA # <cjk>
+0x8B7A U+5438 # <cjk>
+0x8B7B U+5BAE # <cjk>
+0x8B7C U+5F13 # <cjk>
+0x8B7D U+6025 # <cjk>
+0x8B7E U+6551 # <cjk>
+0x8B80 U+673D # <cjk>
+0x8B81 U+6C42 # <cjk>
+0x8B82 U+6C72 # <cjk>
+0x8B83 U+6CE3 # <cjk>
+0x8B84 U+7078 # <cjk>
+0x8B85 U+7403 # <cjk>
+0x8B86 U+7A76 # <cjk>
+0x8B87 U+7AAE # <cjk>
+0x8B88 U+7B08 # <cjk>
+0x8B89 U+7D1A # <cjk>
+0x8B8A U+7CFE # <cjk>
+0x8B8B U+7D66 # <cjk>
+0x8B8C U+65E7 # <cjk>
+0x8B8D U+725B # <cjk>
+0x8B8E U+53BB # <cjk>
+0x8B8F U+5C45 # <cjk>
+0x8B90 U+5DE8 # <cjk>
+0x8B91 U+62D2 # <cjk>
+0x8B92 U+62E0 # <cjk>
+0x8B93 U+6319 # <cjk>
+0x8B94 U+6E20 # <cjk>
+0x8B95 U+865A # <cjk>
+0x8B96 U+8A31 # <cjk>
+0x8B97 U+8DDD # <cjk>
+0x8B98 U+92F8 # <cjk>
+0x8B99 U+6F01 # <cjk>
+0x8B9A U+79A6 # <cjk>
+0x8B9B U+9B5A # <cjk>
+0x8B9C U+4EA8 # <cjk>
+0x8B9D U+4EAB # <cjk>
+0x8B9E U+4EAC # <cjk>
+0x8B9F U+4F9B # <cjk>
+0x8BA0 U+4FA0 # <cjk>
+0x8BA1 U+50D1 # <cjk>
+0x8BA2 U+5147 # <cjk>
+0x8BA3 U+7AF6 # <cjk>
+0x8BA4 U+5171 # <cjk>
+0x8BA5 U+51F6 # <cjk>
+0x8BA6 U+5354 # <cjk>
+0x8BA7 U+5321 # <cjk>
+0x8BA8 U+537F # <cjk>
+0x8BA9 U+53EB # <cjk>
+0x8BAA U+55AC # <cjk>
+0x8BAB U+5883 # <cjk>
+0x8BAC U+5CE1 # <cjk>
+0x8BAD U+5F37 # <cjk>
+0x8BAE U+5F4A # <cjk>
+0x8BAF U+602F # <cjk>
+0x8BB0 U+6050 # <cjk>
+0x8BB1 U+606D # <cjk>
+0x8BB2 U+631F # <cjk>
+0x8BB3 U+6559 # <cjk>
+0x8BB4 U+6A4B # <cjk>
+0x8BB5 U+6CC1 # <cjk>
+0x8BB6 U+72C2 # <cjk>
+0x8BB7 U+72ED # <cjk>
+0x8BB8 U+77EF # <cjk>
+0x8BB9 U+80F8 # <cjk>
+0x8BBA U+8105 # <cjk>
+0x8BBB U+8208 # <cjk>
+0x8BBC U+854E # <cjk>
+0x8BBD U+90F7 # <cjk>
+0x8BBE U+93E1 # <cjk>
+0x8BBF U+97FF # <cjk>
+0x8BC0 U+9957 # <cjk>
+0x8BC1 U+9A5A # <cjk>
+0x8BC2 U+4EF0 # <cjk>
+0x8BC3 U+51DD # <cjk>
+0x8BC4 U+5C2D # <cjk>
+0x8BC5 U+6681 # <cjk>
+0x8BC6 U+696D # <cjk>
+0x8BC7 U+5C40 # <cjk>
+0x8BC8 U+66F2 # <cjk>
+0x8BC9 U+6975 # <cjk>
+0x8BCA U+7389 # <cjk>
+0x8BCB U+6850 # <cjk>
+0x8BCC U+7C81 # <cjk>
+0x8BCD U+50C5 # <cjk>
+0x8BCE U+52E4 # <cjk>
+0x8BCF U+5747 # <cjk>
+0x8BD0 U+5DFE # <cjk>
+0x8BD1 U+9326 # <cjk>
+0x8BD2 U+65A4 # <cjk>
+0x8BD3 U+6B23 # <cjk>
+0x8BD4 U+6B3D # <cjk>
+0x8BD5 U+7434 # <cjk>
+0x8BD6 U+7981 # <cjk>
+0x8BD7 U+79BD # <cjk>
+0x8BD8 U+7B4B # <cjk>
+0x8BD9 U+7DCA # <cjk>
+0x8BDA U+82B9 # <cjk>
+0x8BDB U+83CC # <cjk>
+0x8BDC U+887F # <cjk>
+0x8BDD U+895F # <cjk>
+0x8BDE U+8B39 # <cjk>
+0x8BDF U+8FD1 # <cjk>
+0x8BE0 U+91D1 # <cjk>
+0x8BE1 U+541F # <cjk>
+0x8BE2 U+9280 # <cjk>
+0x8BE3 U+4E5D # <cjk>
+0x8BE4 U+5036 # <cjk>
+0x8BE5 U+53E5 # <cjk>
+0x8BE6 U+533A # <cjk>
+0x8BE7 U+72D7 # <cjk>
+0x8BE8 U+7396 # <cjk>
+0x8BE9 U+77E9 # <cjk>
+0x8BEA U+82E6 # <cjk>
+0x8BEB U+8EAF # <cjk>
+0x8BEC U+99C6 # <cjk>
+0x8BED U+99C8 # <cjk>
+0x8BEE U+99D2 # <cjk>
+0x8BEF U+5177 # <cjk>
+0x8BF0 U+611A # <cjk>
+0x8BF1 U+865E # <cjk>
+0x8BF2 U+55B0 # <cjk>
+0x8BF3 U+7A7A # <cjk>
+0x8BF4 U+5076 # <cjk>
+0x8BF5 U+5BD3 # <cjk>
+0x8BF6 U+9047 # <cjk>
+0x8BF7 U+9685 # <cjk>
+0x8BF8 U+4E32 # <cjk>
+0x8BF9 U+6ADB # <cjk>
+0x8BFA U+91E7 # <cjk>
+0x8BFB U+5C51 # <cjk>
+0x8BFC U+5C48 # <cjk>
+0x8C40 U+6398 # <cjk>
+0x8C41 U+7A9F # <cjk>
+0x8C42 U+6C93 # <cjk>
+0x8C43 U+9774 # <cjk>
+0x8C44 U+8F61 # <cjk>
+0x8C45 U+7AAA # <cjk>
+0x8C46 U+718A # <cjk>
+0x8C47 U+9688 # <cjk>
+0x8C48 U+7C82 # <cjk>
+0x8C49 U+6817 # <cjk>
+0x8C4A U+7E70 # <cjk>
+0x8C4B U+6851 # <cjk>
+0x8C4C U+936C # <cjk>
+0x8C4D U+52F2 # <cjk>
+0x8C4E U+541B # <cjk>
+0x8C4F U+85AB # <cjk>
+0x8C50 U+8A13 # <cjk>
+0x8C51 U+7FA4 # <cjk>
+0x8C52 U+8ECD # <cjk>
+0x8C53 U+90E1 # <cjk>
+0x8C54 U+5366 # <cjk>
+0x8C55 U+8888 # <cjk>
+0x8C56 U+7941 # <cjk>
+0x8C57 U+4FC2 # <cjk>
+0x8C58 U+50BE # <cjk>
+0x8C59 U+5211 # <cjk>
+0x8C5A U+5144 # <cjk>
+0x8C5B U+5553 # <cjk>
+0x8C5C U+572D # <cjk>
+0x8C5D U+73EA # <cjk>
+0x8C5E U+578B # <cjk>
+0x8C5F U+5951 # <cjk>
+0x8C60 U+5F62 # <cjk>
+0x8C61 U+5F84 # <cjk>
+0x8C62 U+6075 # <cjk>
+0x8C63 U+6176 # <cjk>
+0x8C64 U+6167 # <cjk>
+0x8C65 U+61A9 # <cjk>
+0x8C66 U+63B2 # <cjk>
+0x8C67 U+643A # <cjk>
+0x8C68 U+656C # <cjk>
+0x8C69 U+666F # <cjk>
+0x8C6A U+6842 # <cjk>
+0x8C6B U+6E13 # <cjk>
+0x8C6C U+7566 # <cjk>
+0x8C6D U+7A3D # <cjk>
+0x8C6E U+7CFB # <cjk>
+0x8C6F U+7D4C # <cjk>
+0x8C70 U+7D99 # <cjk>
+0x8C71 U+7E4B # <cjk>
+0x8C72 U+7F6B # <cjk>
+0x8C73 U+830E # <cjk>
+0x8C74 U+834A # <cjk>
+0x8C75 U+86CD # <cjk>
+0x8C76 U+8A08 # <cjk>
+0x8C77 U+8A63 # <cjk>
+0x8C78 U+8B66 # <cjk>
+0x8C79 U+8EFD # <cjk>
+0x8C7A U+981A # <cjk>
+0x8C7B U+9D8F # <cjk>
+0x8C7C U+82B8 # <cjk>
+0x8C7D U+8FCE # <cjk>
+0x8C7E U+9BE8 # <cjk>
+0x8C80 U+5287 # <cjk>
+0x8C81 U+621F # <cjk>
+0x8C82 U+6483 # <cjk>
+0x8C83 U+6FC0 # <cjk>
+0x8C84 U+9699 # <cjk>
+0x8C85 U+6841 # <cjk>
+0x8C86 U+5091 # <cjk>
+0x8C87 U+6B20 # <cjk>
+0x8C88 U+6C7A # <cjk>
+0x8C89 U+6F54 # <cjk>
+0x8C8A U+7A74 # <cjk>
+0x8C8B U+7D50 # <cjk>
+0x8C8C U+8840 # <cjk>
+0x8C8D U+8A23 # <cjk>
+0x8C8E U+6708 # <cjk>
+0x8C8F U+4EF6 # <cjk>
+0x8C90 U+5039 # <cjk>
+0x8C91 U+5026 # <cjk>
+0x8C92 U+5065 # <cjk>
+0x8C93 U+517C # <cjk>
+0x8C94 U+5238 # <cjk>
+0x8C95 U+5263 # <cjk>
+0x8C96 U+55A7 # <cjk>
+0x8C97 U+570F # <cjk>
+0x8C98 U+5805 # <cjk>
+0x8C99 U+5ACC # <cjk>
+0x8C9A U+5EFA # <cjk>
+0x8C9B U+61B2 # <cjk>
+0x8C9C U+61F8 # <cjk>
+0x8C9D U+62F3 # <cjk>
+0x8C9E U+6372 # <cjk>
+0x8C9F U+691C # <cjk>
+0x8CA0 U+6A29 # <cjk>
+0x8CA1 U+727D # <cjk>
+0x8CA2 U+72AC # <cjk>
+0x8CA3 U+732E # <cjk>
+0x8CA4 U+7814 # <cjk>
+0x8CA5 U+786F # <cjk>
+0x8CA6 U+7D79 # <cjk>
+0x8CA7 U+770C # <cjk>
+0x8CA8 U+80A9 # <cjk>
+0x8CA9 U+898B # <cjk>
+0x8CAA U+8B19 # <cjk>
+0x8CAB U+8CE2 # <cjk>
+0x8CAC U+8ED2 # <cjk>
+0x8CAD U+9063 # <cjk>
+0x8CAE U+9375 # <cjk>
+0x8CAF U+967A # <cjk>
+0x8CB0 U+9855 # <cjk>
+0x8CB1 U+9A13 # <cjk>
+0x8CB2 U+9E78 # <cjk>
+0x8CB3 U+5143 # <cjk>
+0x8CB4 U+539F # <cjk>
+0x8CB5 U+53B3 # <cjk>
+0x8CB6 U+5E7B # <cjk>
+0x8CB7 U+5F26 # <cjk>
+0x8CB8 U+6E1B # <cjk>
+0x8CB9 U+6E90 # <cjk>
+0x8CBA U+7384 # <cjk>
+0x8CBB U+73FE # <cjk>
+0x8CBC U+7D43 # <cjk>
+0x8CBD U+8237 # <cjk>
+0x8CBE U+8A00 # <cjk>
+0x8CBF U+8AFA # <cjk>
+0x8CC0 U+9650 # <cjk>
+0x8CC1 U+4E4E # <cjk>
+0x8CC2 U+500B # <cjk>
+0x8CC3 U+53E4 # <cjk>
+0x8CC4 U+547C # <cjk>
+0x8CC5 U+56FA # <cjk>
+0x8CC6 U+59D1 # <cjk>
+0x8CC7 U+5B64 # <cjk>
+0x8CC8 U+5DF1 # <cjk>
+0x8CC9 U+5EAB # <cjk>
+0x8CCA U+5F27 # <cjk>
+0x8CCB U+6238 # <cjk>
+0x8CCC U+6545 # <cjk>
+0x8CCD U+67AF # <cjk>
+0x8CCE U+6E56 # <cjk>
+0x8CCF U+72D0 # <cjk>
+0x8CD0 U+7CCA # <cjk>
+0x8CD1 U+88B4 # <cjk>
+0x8CD2 U+80A1 # <cjk>
+0x8CD3 U+80E1 # <cjk>
+0x8CD4 U+83F0 # <cjk>
+0x8CD5 U+864E # <cjk>
+0x8CD6 U+8A87 # <cjk>
+0x8CD7 U+8DE8 # <cjk>
+0x8CD8 U+9237 # <cjk>
+0x8CD9 U+96C7 # <cjk>
+0x8CDA U+9867 # <cjk>
+0x8CDB U+9F13 # <cjk>
+0x8CDC U+4E94 # <cjk>
+0x8CDD U+4E92 # <cjk>
+0x8CDE U+4F0D # <cjk>
+0x8CDF U+5348 # <cjk>
+0x8CE0 U+5449 # <cjk>
+0x8CE1 U+543E # <cjk>
+0x8CE2 U+5A2F # <cjk>
+0x8CE3 U+5F8C # <cjk>
+0x8CE4 U+5FA1 # <cjk>
+0x8CE5 U+609F # <cjk>
+0x8CE6 U+68A7 # <cjk>
+0x8CE7 U+6A8E # <cjk>
+0x8CE8 U+745A # <cjk>
+0x8CE9 U+7881 # <cjk>
+0x8CEA U+8A9E # <cjk>
+0x8CEB U+8AA4 # <cjk>
+0x8CEC U+8B77 # <cjk>
+0x8CED U+9190 # <cjk>
+0x8CEE U+4E5E # <cjk>
+0x8CEF U+9BC9 # <cjk>
+0x8CF0 U+4EA4 # <cjk>
+0x8CF1 U+4F7C # <cjk>
+0x8CF2 U+4FAF # <cjk>
+0x8CF3 U+5019 # <cjk>
+0x8CF4 U+5016 # <cjk>
+0x8CF5 U+5149 # <cjk>
+0x8CF6 U+516C # <cjk>
+0x8CF7 U+529F # <cjk>
+0x8CF8 U+52B9 # <cjk>
+0x8CF9 U+52FE # <cjk>
+0x8CFA U+539A # <cjk>
+0x8CFB U+53E3 # <cjk>
+0x8CFC U+5411 # <cjk>
+0x8D40 U+540E # <cjk>
+0x8D41 U+5589 # <cjk>
+0x8D42 U+5751 # <cjk>
+0x8D43 U+57A2 # <cjk>
+0x8D44 U+597D # <cjk>
+0x8D45 U+5B54 # <cjk>
+0x8D46 U+5B5D # <cjk>
+0x8D47 U+5B8F # <cjk>
+0x8D48 U+5DE5 # <cjk>
+0x8D49 U+5DE7 # <cjk>
+0x8D4A U+5DF7 # <cjk>
+0x8D4B U+5E78 # <cjk>
+0x8D4C U+5E83 # <cjk>
+0x8D4D U+5E9A # <cjk>
+0x8D4E U+5EB7 # <cjk>
+0x8D4F U+5F18 # <cjk>
+0x8D50 U+6052 # <cjk>
+0x8D51 U+614C # <cjk>
+0x8D52 U+6297 # <cjk>
+0x8D53 U+62D8 # <cjk>
+0x8D54 U+63A7 # <cjk>
+0x8D55 U+653B # <cjk>
+0x8D56 U+6602 # <cjk>
+0x8D57 U+6643 # <cjk>
+0x8D58 U+66F4 # <cjk>
+0x8D59 U+676D # <cjk>
+0x8D5A U+6821 # <cjk>
+0x8D5B U+6897 # <cjk>
+0x8D5C U+69CB # <cjk>
+0x8D5D U+6C5F # <cjk>
+0x8D5E U+6D2A # <cjk>
+0x8D5F U+6D69 # <cjk>
+0x8D60 U+6E2F # <cjk>
+0x8D61 U+6E9D # <cjk>
+0x8D62 U+7532 # <cjk>
+0x8D63 U+7687 # <cjk>
+0x8D64 U+786C # <cjk>
+0x8D65 U+7A3F # <cjk>
+0x8D66 U+7CE0 # <cjk>
+0x8D67 U+7D05 # <cjk>
+0x8D68 U+7D18 # <cjk>
+0x8D69 U+7D5E # <cjk>
+0x8D6A U+7DB1 # <cjk>
+0x8D6B U+8015 # <cjk>
+0x8D6C U+8003 # <cjk>
+0x8D6D U+80AF # <cjk>
+0x8D6E U+80B1 # <cjk>
+0x8D6F U+8154 # <cjk>
+0x8D70 U+818F # <cjk>
+0x8D71 U+822A # <cjk>
+0x8D72 U+8352 # <cjk>
+0x8D73 U+884C # <cjk>
+0x8D74 U+8861 # <cjk>
+0x8D75 U+8B1B # <cjk>
+0x8D76 U+8CA2 # <cjk>
+0x8D77 U+8CFC # <cjk>
+0x8D78 U+90CA # <cjk>
+0x8D79 U+9175 # <cjk>
+0x8D7A U+9271 # <cjk>
+0x8D7B U+783F # <cjk>
+0x8D7C U+92FC # <cjk>
+0x8D7D U+95A4 # <cjk>
+0x8D7E U+964D # <cjk>
+0x8D80 U+9805 # <cjk>
+0x8D81 U+9999 # <cjk>
+0x8D82 U+9AD8 # <cjk>
+0x8D83 U+9D3B # <cjk>
+0x8D84 U+525B # <cjk>
+0x8D85 U+52AB # <cjk>
+0x8D86 U+53F7 # <cjk>
+0x8D87 U+5408 # <cjk>
+0x8D88 U+58D5 # <cjk>
+0x8D89 U+62F7 # <cjk>
+0x8D8A U+6FE0 # <cjk>
+0x8D8B U+8C6A # <cjk>
+0x8D8C U+8F5F # <cjk>
+0x8D8D U+9EB9 # <cjk>
+0x8D8E U+514B # <cjk>
+0x8D8F U+523B # <cjk>
+0x8D90 U+544A # <cjk>
+0x8D91 U+56FD # <cjk>
+0x8D92 U+7A40 # <cjk>
+0x8D93 U+9177 # <cjk>
+0x8D94 U+9D60 # <cjk>
+0x8D95 U+9ED2 # <cjk>
+0x8D96 U+7344 # <cjk>
+0x8D97 U+6F09 # <cjk>
+0x8D98 U+8170 # <cjk>
+0x8D99 U+7511 # <cjk>
+0x8D9A U+5FFD # <cjk>
+0x8D9B U+60DA # <cjk>
+0x8D9C U+9AA8 # <cjk>
+0x8D9D U+72DB # <cjk>
+0x8D9E U+8FBC # <cjk>
+0x8D9F U+6B64 # <cjk>
+0x8DA0 U+9803 # <cjk>
+0x8DA1 U+4ECA # <cjk>
+0x8DA2 U+56F0 # <cjk>
+0x8DA3 U+5764 # <cjk>
+0x8DA4 U+58BE # <cjk>
+0x8DA5 U+5A5A # <cjk>
+0x8DA6 U+6068 # <cjk>
+0x8DA7 U+61C7 # <cjk>
+0x8DA8 U+660F # <cjk>
+0x8DA9 U+6606 # <cjk>
+0x8DAA U+6839 # <cjk>
+0x8DAB U+68B1 # <cjk>
+0x8DAC U+6DF7 # <cjk>
+0x8DAD U+75D5 # <cjk>
+0x8DAE U+7D3A # <cjk>
+0x8DAF U+826E # <cjk>
+0x8DB0 U+9B42 # <cjk>
+0x8DB1 U+4E9B # <cjk>
+0x8DB2 U+4F50 # <cjk>
+0x8DB3 U+53C9 # <cjk>
+0x8DB4 U+5506 # <cjk>
+0x8DB5 U+5D6F # <cjk>
+0x8DB6 U+5DE6 # <cjk>
+0x8DB7 U+5DEE # <cjk>
+0x8DB8 U+67FB # <cjk>
+0x8DB9 U+6C99 # <cjk>
+0x8DBA U+7473 # <cjk>
+0x8DBB U+7802 # <cjk>
+0x8DBC U+8A50 # <cjk>
+0x8DBD U+9396 # <cjk>
+0x8DBE U+88DF # <cjk>
+0x8DBF U+5750 # <cjk>
+0x8DC0 U+5EA7 # <cjk>
+0x8DC1 U+632B # <cjk>
+0x8DC2 U+50B5 # <cjk>
+0x8DC3 U+50AC # <cjk>
+0x8DC4 U+518D # <cjk>
+0x8DC5 U+6700 # <cjk>
+0x8DC6 U+54C9 # <cjk>
+0x8DC7 U+585E # <cjk>
+0x8DC8 U+59BB # <cjk>
+0x8DC9 U+5BB0 # <cjk>
+0x8DCA U+5F69 # <cjk>
+0x8DCB U+624D # <cjk>
+0x8DCC U+63A1 # <cjk>
+0x8DCD U+683D # <cjk>
+0x8DCE U+6B73 # <cjk>
+0x8DCF U+6E08 # <cjk>
+0x8DD0 U+707D # <cjk>
+0x8DD1 U+91C7 # <cjk>
+0x8DD2 U+7280 # <cjk>
+0x8DD3 U+7815 # <cjk>
+0x8DD4 U+7826 # <cjk>
+0x8DD5 U+796D # <cjk>
+0x8DD6 U+658E # <cjk>
+0x8DD7 U+7D30 # <cjk>
+0x8DD8 U+83DC # <cjk>
+0x8DD9 U+88C1 # <cjk>
+0x8DDA U+8F09 # <cjk>
+0x8DDB U+969B # <cjk>
+0x8DDC U+5264 # <cjk>
+0x8DDD U+5728 # <cjk>
+0x8DDE U+6750 # <cjk>
+0x8DDF U+7F6A # <cjk>
+0x8DE0 U+8CA1 # <cjk>
+0x8DE1 U+51B4 # <cjk>
+0x8DE2 U+5742 # <cjk>
+0x8DE3 U+962A # <cjk>
+0x8DE4 U+583A # <cjk>
+0x8DE5 U+698A # <cjk>
+0x8DE6 U+80B4 # <cjk>
+0x8DE7 U+54B2 # <cjk>
+0x8DE8 U+5D0E # <cjk>
+0x8DE9 U+57FC # <cjk>
+0x8DEA U+7895 # <cjk>
+0x8DEB U+9DFA # <cjk>
+0x8DEC U+4F5C # <cjk>
+0x8DED U+524A # <cjk>
+0x8DEE U+548B # <cjk>
+0x8DEF U+643E # <cjk>
+0x8DF0 U+6628 # <cjk>
+0x8DF1 U+6714 # <cjk>
+0x8DF2 U+67F5 # <cjk>
+0x8DF3 U+7A84 # <cjk>
+0x8DF4 U+7B56 # <cjk>
+0x8DF5 U+7D22 # <cjk>
+0x8DF6 U+932F # <cjk>
+0x8DF7 U+685C # <cjk>
+0x8DF8 U+9BAD # <cjk>
+0x8DF9 U+7B39 # <cjk>
+0x8DFA U+5319 # <cjk>
+0x8DFB U+518A # <cjk>
+0x8DFC U+5237 # <cjk>
+0x8E40 U+5BDF # <cjk>
+0x8E41 U+62F6 # <cjk>
+0x8E42 U+64AE # <cjk>
+0x8E43 U+64E6 # <cjk>
+0x8E44 U+672D # <cjk>
+0x8E45 U+6BBA # <cjk>
+0x8E46 U+85A9 # <cjk>
+0x8E47 U+96D1 # <cjk>
+0x8E48 U+7690 # <cjk>
+0x8E49 U+9BD6 # <cjk>
+0x8E4A U+634C # <cjk>
+0x8E4B U+9306 # <cjk>
+0x8E4C U+9BAB # <cjk>
+0x8E4D U+76BF # <cjk>
+0x8E4E U+6652 # <cjk>
+0x8E4F U+4E09 # <cjk>
+0x8E50 U+5098 # <cjk>
+0x8E51 U+53C2 # <cjk>
+0x8E52 U+5C71 # <cjk>
+0x8E53 U+60E8 # <cjk>
+0x8E54 U+6492 # <cjk>
+0x8E55 U+6563 # <cjk>
+0x8E56 U+685F # <cjk>
+0x8E57 U+71E6 # <cjk>
+0x8E58 U+73CA # <cjk>
+0x8E59 U+7523 # <cjk>
+0x8E5A U+7B97 # <cjk>
+0x8E5B U+7E82 # <cjk>
+0x8E5C U+8695 # <cjk>
+0x8E5D U+8B83 # <cjk>
+0x8E5E U+8CDB # <cjk>
+0x8E5F U+9178 # <cjk>
+0x8E60 U+9910 # <cjk>
+0x8E61 U+65AC # <cjk>
+0x8E62 U+66AB # <cjk>
+0x8E63 U+6B8B # <cjk>
+0x8E64 U+4ED5 # <cjk>
+0x8E65 U+4ED4 # <cjk>
+0x8E66 U+4F3A # <cjk>
+0x8E67 U+4F7F # <cjk>
+0x8E68 U+523A # <cjk>
+0x8E69 U+53F8 # <cjk>
+0x8E6A U+53F2 # <cjk>
+0x8E6B U+55E3 # <cjk>
+0x8E6C U+56DB # <cjk>
+0x8E6D U+58EB # <cjk>
+0x8E6E U+59CB # <cjk>
+0x8E6F U+59C9 # <cjk>
+0x8E70 U+59FF # <cjk>
+0x8E71 U+5B50 # <cjk>
+0x8E72 U+5C4D # <cjk>
+0x8E73 U+5E02 # <cjk>
+0x8E74 U+5E2B # <cjk>
+0x8E75 U+5FD7 # <cjk>
+0x8E76 U+601D # <cjk>
+0x8E77 U+6307 # <cjk>
+0x8E78 U+652F # <cjk>
+0x8E79 U+5B5C # <cjk>
+0x8E7A U+65AF # <cjk>
+0x8E7B U+65BD # <cjk>
+0x8E7C U+65E8 # <cjk>
+0x8E7D U+679D # <cjk>
+0x8E7E U+6B62 # <cjk>
+0x8E80 U+6B7B # <cjk>
+0x8E81 U+6C0F # <cjk>
+0x8E82 U+7345 # <cjk>
+0x8E83 U+7949 # <cjk>
+0x8E84 U+79C1 # <cjk>
+0x8E85 U+7CF8 # <cjk>
+0x8E86 U+7D19 # <cjk>
+0x8E87 U+7D2B # <cjk>
+0x8E88 U+80A2 # <cjk>
+0x8E89 U+8102 # <cjk>
+0x8E8A U+81F3 # <cjk>
+0x8E8B U+8996 # <cjk>
+0x8E8C U+8A5E # <cjk>
+0x8E8D U+8A69 # <cjk>
+0x8E8E U+8A66 # <cjk>
+0x8E8F U+8A8C # <cjk>
+0x8E90 U+8AEE # <cjk>
+0x8E91 U+8CC7 # <cjk>
+0x8E92 U+8CDC # <cjk>
+0x8E93 U+96CC # <cjk>
+0x8E94 U+98FC # <cjk>
+0x8E95 U+6B6F # <cjk>
+0x8E96 U+4E8B # <cjk>
+0x8E97 U+4F3C # <cjk>
+0x8E98 U+4F8D # <cjk>
+0x8E99 U+5150 # <cjk>
+0x8E9A U+5B57 # <cjk>
+0x8E9B U+5BFA # <cjk>
+0x8E9C U+6148 # <cjk>
+0x8E9D U+6301 # <cjk>
+0x8E9E U+6642 # <cjk>
+0x8E9F U+6B21 # <cjk>
+0x8EA0 U+6ECB # <cjk>
+0x8EA1 U+6CBB # <cjk>
+0x8EA2 U+723E # <cjk>
+0x8EA3 U+74BD # <cjk>
+0x8EA4 U+75D4 # <cjk>
+0x8EA5 U+78C1 # <cjk>
+0x8EA6 U+793A # <cjk>
+0x8EA7 U+800C # <cjk>
+0x8EA8 U+8033 # <cjk>
+0x8EA9 U+81EA # <cjk>
+0x8EAA U+8494 # <cjk>
+0x8EAB U+8F9E # <cjk>
+0x8EAC U+6C50 # <cjk>
+0x8EAD U+9E7F # <cjk>
+0x8EAE U+5F0F # <cjk>
+0x8EAF U+8B58 # <cjk>
+0x8EB0 U+9D2B # <cjk>
+0x8EB1 U+7AFA # <cjk>
+0x8EB2 U+8EF8 # <cjk>
+0x8EB3 U+5B8D # <cjk>
+0x8EB4 U+96EB # <cjk>
+0x8EB5 U+4E03 # <cjk>
+0x8EB6 U+53F1 # <cjk>
+0x8EB7 U+57F7 # <cjk>
+0x8EB8 U+5931 # <cjk>
+0x8EB9 U+5AC9 # <cjk>
+0x8EBA U+5BA4 # <cjk>
+0x8EBB U+6089 # <cjk>
+0x8EBC U+6E7F # <cjk>
+0x8EBD U+6F06 # <cjk>
+0x8EBE U+75BE # <cjk>
+0x8EBF U+8CEA # <cjk>
+0x8EC0 U+5B9F # <cjk>
+0x8EC1 U+8500 # <cjk>
+0x8EC2 U+7BE0 # <cjk>
+0x8EC3 U+5072 # <cjk>
+0x8EC4 U+67F4 # <cjk>
+0x8EC5 U+829D # <cjk>
+0x8EC6 U+5C61 # <cjk>
+0x8EC7 U+854A # <cjk>
+0x8EC8 U+7E1E # <cjk>
+0x8EC9 U+820E # <cjk>
+0x8ECA U+5199 # <cjk>
+0x8ECB U+5C04 # <cjk>
+0x8ECC U+6368 # <cjk>
+0x8ECD U+8D66 # <cjk>
+0x8ECE U+659C # <cjk>
+0x8ECF U+716E # <cjk>
+0x8ED0 U+793E # <cjk>
+0x8ED1 U+7D17 # <cjk>
+0x8ED2 U+8005 # <cjk>
+0x8ED3 U+8B1D # <cjk>
+0x8ED4 U+8ECA # <cjk>
+0x8ED5 U+906E # <cjk>
+0x8ED6 U+86C7 # <cjk>
+0x8ED7 U+90AA # <cjk>
+0x8ED8 U+501F # <cjk>
+0x8ED9 U+52FA # <cjk>
+0x8EDA U+5C3A # <cjk>
+0x8EDB U+6753 # <cjk>
+0x8EDC U+707C # <cjk>
+0x8EDD U+7235 # <cjk>
+0x8EDE U+914C # <cjk>
+0x8EDF U+91C8 # <cjk>
+0x8EE0 U+932B # <cjk>
+0x8EE1 U+82E5 # <cjk>
+0x8EE2 U+5BC2 # <cjk>
+0x8EE3 U+5F31 # <cjk>
+0x8EE4 U+60F9 # <cjk>
+0x8EE5 U+4E3B # <cjk>
+0x8EE6 U+53D6 # <cjk>
+0x8EE7 U+5B88 # <cjk>
+0x8EE8 U+624B # <cjk>
+0x8EE9 U+6731 # <cjk>
+0x8EEA U+6B8A # <cjk>
+0x8EEB U+72E9 # <cjk>
+0x8EEC U+73E0 # <cjk>
+0x8EED U+7A2E # <cjk>
+0x8EEE U+816B # <cjk>
+0x8EEF U+8DA3 # <cjk>
+0x8EF0 U+9152 # <cjk>
+0x8EF1 U+9996 # <cjk>
+0x8EF2 U+5112 # <cjk>
+0x8EF3 U+53D7 # <cjk>
+0x8EF4 U+546A # <cjk>
+0x8EF5 U+5BFF # <cjk>
+0x8EF6 U+6388 # <cjk>
+0x8EF7 U+6A39 # <cjk>
+0x8EF8 U+7DAC # <cjk>
+0x8EF9 U+9700 # <cjk>
+0x8EFA U+56DA # <cjk>
+0x8EFB U+53CE # <cjk>
+0x8EFC U+5468 # <cjk>
+0x8F40 U+5B97 # <cjk>
+0x8F41 U+5C31 # <cjk>
+0x8F42 U+5DDE # <cjk>
+0x8F43 U+4FEE # <cjk>
+0x8F44 U+6101 # <cjk>
+0x8F45 U+62FE # <cjk>
+0x8F46 U+6D32 # <cjk>
+0x8F47 U+79C0 # <cjk>
+0x8F48 U+79CB # <cjk>
+0x8F49 U+7D42 # <cjk>
+0x8F4A U+7E4D # <cjk>
+0x8F4B U+7FD2 # <cjk>
+0x8F4C U+81ED # <cjk>
+0x8F4D U+821F # <cjk>
+0x8F4E U+8490 # <cjk>
+0x8F4F U+8846 # <cjk>
+0x8F50 U+8972 # <cjk>
+0x8F51 U+8B90 # <cjk>
+0x8F52 U+8E74 # <cjk>
+0x8F53 U+8F2F # <cjk>
+0x8F54 U+9031 # <cjk>
+0x8F55 U+914B # <cjk>
+0x8F56 U+916C # <cjk>
+0x8F57 U+96C6 # <cjk>
+0x8F58 U+919C # <cjk>
+0x8F59 U+4EC0 # <cjk>
+0x8F5A U+4F4F # <cjk>
+0x8F5B U+5145 # <cjk>
+0x8F5C U+5341 # <cjk>
+0x8F5D U+5F93 # <cjk>
+0x8F5E U+620E # <cjk>
+0x8F5F U+67D4 # <cjk>
+0x8F60 U+6C41 # <cjk>
+0x8F61 U+6E0B # <cjk>
+0x8F62 U+7363 # <cjk>
+0x8F63 U+7E26 # <cjk>
+0x8F64 U+91CD # <cjk>
+0x8F65 U+9283 # <cjk>
+0x8F66 U+53D4 # <cjk>
+0x8F67 U+5919 # <cjk>
+0x8F68 U+5BBF # <cjk>
+0x8F69 U+6DD1 # <cjk>
+0x8F6A U+795D # <cjk>
+0x8F6B U+7E2E # <cjk>
+0x8F6C U+7C9B # <cjk>
+0x8F6D U+587E # <cjk>
+0x8F6E U+719F # <cjk>
+0x8F6F U+51FA # <cjk>
+0x8F70 U+8853 # <cjk>
+0x8F71 U+8FF0 # <cjk>
+0x8F72 U+4FCA # <cjk>
+0x8F73 U+5CFB # <cjk>
+0x8F74 U+6625 # <cjk>
+0x8F75 U+77AC # <cjk>
+0x8F76 U+7AE3 # <cjk>
+0x8F77 U+821C # <cjk>
+0x8F78 U+99FF # <cjk>
+0x8F79 U+51C6 # <cjk>
+0x8F7A U+5FAA # <cjk>
+0x8F7B U+65EC # <cjk>
+0x8F7C U+696F # <cjk>
+0x8F7D U+6B89 # <cjk>
+0x8F7E U+6DF3 # <cjk>
+0x8F80 U+6E96 # <cjk>
+0x8F81 U+6F64 # <cjk>
+0x8F82 U+76FE # <cjk>
+0x8F83 U+7D14 # <cjk>
+0x8F84 U+5DE1 # <cjk>
+0x8F85 U+9075 # <cjk>
+0x8F86 U+9187 # <cjk>
+0x8F87 U+9806 # <cjk>
+0x8F88 U+51E6 # <cjk>
+0x8F89 U+521D # <cjk>
+0x8F8A U+6240 # <cjk>
+0x8F8B U+6691 # <cjk>
+0x8F8C U+66D9 # <cjk>
+0x8F8D U+6E1A # <cjk>
+0x8F8E U+5EB6 # <cjk>
+0x8F8F U+7DD2 # <cjk>
+0x8F90 U+7F72 # <cjk>
+0x8F91 U+66F8 # <cjk>
+0x8F92 U+85AF # <cjk>
+0x8F93 U+85F7 # <cjk>
+0x8F94 U+8AF8 # <cjk>
+0x8F95 U+52A9 # <cjk>
+0x8F96 U+53D9 # <cjk>
+0x8F97 U+5973 # <cjk>
+0x8F98 U+5E8F # <cjk>
+0x8F99 U+5F90 # <cjk>
+0x8F9A U+6055 # <cjk>
+0x8F9B U+92E4 # <cjk>
+0x8F9C U+9664 # <cjk>
+0x8F9D U+50B7 # <cjk>
+0x8F9E U+511F # <cjk>
+0x8F9F U+52DD # <cjk>
+0x8FA0 U+5320 # <cjk>
+0x8FA1 U+5347 # <cjk>
+0x8FA2 U+53EC # <cjk>
+0x8FA3 U+54E8 # <cjk>
+0x8FA4 U+5546 # <cjk>
+0x8FA5 U+5531 # <cjk>
+0x8FA6 U+5617 # <cjk>
+0x8FA7 U+5968 # <cjk>
+0x8FA8 U+59BE # <cjk>
+0x8FA9 U+5A3C # <cjk>
+0x8FAA U+5BB5 # <cjk>
+0x8FAB U+5C06 # <cjk>
+0x8FAC U+5C0F # <cjk>
+0x8FAD U+5C11 # <cjk>
+0x8FAE U+5C1A # <cjk>
+0x8FAF U+5E84 # <cjk>
+0x8FB0 U+5E8A # <cjk>
+0x8FB1 U+5EE0 # <cjk>
+0x8FB2 U+5F70 # <cjk>
+0x8FB3 U+627F # <cjk>
+0x8FB4 U+6284 # <cjk>
+0x8FB5 U+62DB # <cjk>
+0x8FB6 U+638C # <cjk>
+0x8FB7 U+6377 # <cjk>
+0x8FB8 U+6607 # <cjk>
+0x8FB9 U+660C # <cjk>
+0x8FBA U+662D # <cjk>
+0x8FBB U+6676 # <cjk>
+0x8FBC U+677E # <cjk>
+0x8FBD U+68A2 # <cjk>
+0x8FBE U+6A1F # <cjk>
+0x8FBF U+6A35 # <cjk>
+0x8FC0 U+6CBC # <cjk>
+0x8FC1 U+6D88 # <cjk>
+0x8FC2 U+6E09 # <cjk>
+0x8FC3 U+6E58 # <cjk>
+0x8FC4 U+713C # <cjk>
+0x8FC5 U+7126 # <cjk>
+0x8FC6 U+7167 # <cjk>
+0x8FC7 U+75C7 # <cjk>
+0x8FC8 U+7701 # <cjk>
+0x8FC9 U+785D # <cjk>
+0x8FCA U+7901 # <cjk>
+0x8FCB U+7965 # <cjk>
+0x8FCC U+79F0 # <cjk>
+0x8FCD U+7AE0 # <cjk>
+0x8FCE U+7B11 # <cjk>
+0x8FCF U+7CA7 # <cjk>
+0x8FD0 U+7D39 # <cjk>
+0x8FD1 U+8096 # <cjk>
+0x8FD2 U+83D6 # <cjk>
+0x8FD3 U+848B # <cjk>
+0x8FD4 U+8549 # <cjk>
+0x8FD5 U+885D # <cjk>
+0x8FD6 U+88F3 # <cjk>
+0x8FD7 U+8A1F # <cjk>
+0x8FD8 U+8A3C # <cjk>
+0x8FD9 U+8A54 # <cjk>
+0x8FDA U+8A73 # <cjk>
+0x8FDB U+8C61 # <cjk>
+0x8FDC U+8CDE # <cjk>
+0x8FDD U+91A4 # <cjk>
+0x8FDE U+9266 # <cjk>
+0x8FDF U+937E # <cjk>
+0x8FE0 U+9418 # <cjk>
+0x8FE1 U+969C # <cjk>
+0x8FE2 U+9798 # <cjk>
+0x8FE3 U+4E0A # <cjk>
+0x8FE4 U+4E08 # <cjk>
+0x8FE5 U+4E1E # <cjk>
+0x8FE6 U+4E57 # <cjk>
+0x8FE7 U+5197 # <cjk>
+0x8FE8 U+5270 # <cjk>
+0x8FE9 U+57CE # <cjk>
+0x8FEA U+5834 # <cjk>
+0x8FEB U+58CC # <cjk>
+0x8FEC U+5B22 # <cjk>
+0x8FED U+5E38 # <cjk>
+0x8FEE U+60C5 # <cjk>
+0x8FEF U+64FE # <cjk>
+0x8FF0 U+6761 # <cjk>
+0x8FF1 U+6756 # <cjk>
+0x8FF2 U+6D44 # <cjk>
+0x8FF3 U+72B6 # <cjk>
+0x8FF4 U+7573 # <cjk>
+0x8FF5 U+7A63 # <cjk>
+0x8FF6 U+84B8 # <cjk>
+0x8FF7 U+8B72 # <cjk>
+0x8FF8 U+91B8 # <cjk>
+0x8FF9 U+9320 # <cjk>
+0x8FFA U+5631 # <cjk>
+0x8FFB U+57F4 # <cjk>
+0x8FFC U+98FE # <cjk>
+0x9040 U+62ED # <cjk>
+0x9041 U+690D # <cjk>
+0x9042 U+6B96 # <cjk>
+0x9043 U+71ED # <cjk>
+0x9044 U+7E54 # <cjk>
+0x9045 U+8077 # <cjk>
+0x9046 U+8272 # <cjk>
+0x9047 U+89E6 # <cjk>
+0x9048 U+98DF # <cjk>
+0x9049 U+8755 # <cjk>
+0x904A U+8FB1 # <cjk>
+0x904B U+5C3B # <cjk>
+0x904C U+4F38 # <cjk>
+0x904D U+4FE1 # <cjk>
+0x904E U+4FB5 # <cjk>
+0x904F U+5507 # <cjk>
+0x9050 U+5A20 # <cjk>
+0x9051 U+5BDD # <cjk>
+0x9052 U+5BE9 # <cjk>
+0x9053 U+5FC3 # <cjk>
+0x9054 U+614E # <cjk>
+0x9055 U+632F # <cjk>
+0x9056 U+65B0 # <cjk>
+0x9057 U+664B # <cjk>
+0x9058 U+68EE # <cjk>
+0x9059 U+699B # <cjk>
+0x905A U+6D78 # <cjk>
+0x905B U+6DF1 # <cjk>
+0x905C U+7533 # <cjk>
+0x905D U+75B9 # <cjk>
+0x905E U+771F # <cjk>
+0x905F U+795E # <cjk>
+0x9060 U+79E6 # <cjk>
+0x9061 U+7D33 # <cjk>
+0x9062 U+81E3 # <cjk>
+0x9063 U+82AF # <cjk>
+0x9064 U+85AA # <cjk>
+0x9065 U+89AA # <cjk>
+0x9066 U+8A3A # <cjk>
+0x9067 U+8EAB # <cjk>
+0x9068 U+8F9B # <cjk>
+0x9069 U+9032 # <cjk>
+0x906A U+91DD # <cjk>
+0x906B U+9707 # <cjk>
+0x906C U+4EBA # <cjk>
+0x906D U+4EC1 # <cjk>
+0x906E U+5203 # <cjk>
+0x906F U+5875 # <cjk>
+0x9070 U+58EC # <cjk>
+0x9071 U+5C0B # <cjk>
+0x9072 U+751A # <cjk>
+0x9073 U+5C3D # <cjk>
+0x9074 U+814E # <cjk>
+0x9075 U+8A0A # <cjk>
+0x9076 U+8FC5 # <cjk>
+0x9077 U+9663 # <cjk>
+0x9078 U+976D # <cjk>
+0x9079 U+7B25 # <cjk>
+0x907A U+8ACF # <cjk>
+0x907B U+9808 # <cjk>
+0x907C U+9162 # <cjk>
+0x907D U+56F3 # <cjk>
+0x907E U+53A8 # <cjk>
+0x9080 U+9017 # <cjk>
+0x9081 U+5439 # <cjk>
+0x9082 U+5782 # <cjk>
+0x9083 U+5E25 # <cjk>
+0x9084 U+63A8 # <cjk>
+0x9085 U+6C34 # <cjk>
+0x9086 U+708A # <cjk>
+0x9087 U+7761 # <cjk>
+0x9088 U+7C8B # <cjk>
+0x9089 U+7FE0 # <cjk>
+0x908A U+8870 # <cjk>
+0x908B U+9042 # <cjk>
+0x908C U+9154 # <cjk>
+0x908D U+9310 # <cjk>
+0x908E U+9318 # <cjk>
+0x908F U+968F # <cjk>
+0x9090 U+745E # <cjk>
+0x9091 U+9AC4 # <cjk>
+0x9092 U+5D07 # <cjk>
+0x9093 U+5D69 # <cjk>
+0x9094 U+6570 # <cjk>
+0x9095 U+67A2 # <cjk>
+0x9096 U+8DA8 # <cjk>
+0x9097 U+96DB # <cjk>
+0x9098 U+636E # <cjk>
+0x9099 U+6749 # <cjk>
+0x909A U+6919 # <cjk>
+0x909B U+83C5 # <cjk>
+0x909C U+9817 # <cjk>
+0x909D U+96C0 # <cjk>
+0x909E U+88FE # <cjk>
+0x909F U+6F84 # <cjk>
+0x90A0 U+647A # <cjk>
+0x90A1 U+5BF8 # <cjk>
+0x90A2 U+4E16 # <cjk>
+0x90A3 U+702C # <cjk>
+0x90A4 U+755D # <cjk>
+0x90A5 U+662F # <cjk>
+0x90A6 U+51C4 # <cjk>
+0x90A7 U+5236 # <cjk>
+0x90A8 U+52E2 # <cjk>
+0x90A9 U+59D3 # <cjk>
+0x90AA U+5F81 # <cjk>
+0x90AB U+6027 # <cjk>
+0x90AC U+6210 # <cjk>
+0x90AD U+653F # <cjk>
+0x90AE U+6574 # <cjk>
+0x90AF U+661F # <cjk>
+0x90B0 U+6674 # <cjk>
+0x90B1 U+68F2 # <cjk>
+0x90B2 U+6816 # <cjk>
+0x90B3 U+6B63 # <cjk>
+0x90B4 U+6E05 # <cjk>
+0x90B5 U+7272 # <cjk>
+0x90B6 U+751F # <cjk>
+0x90B7 U+76DB # <cjk>
+0x90B8 U+7CBE # <cjk>
+0x90B9 U+8056 # <cjk>
+0x90BA U+58F0 # <cjk>
+0x90BB U+88FD # <cjk>
+0x90BC U+897F # <cjk>
+0x90BD U+8AA0 # <cjk>
+0x90BE U+8A93 # <cjk>
+0x90BF U+8ACB # <cjk>
+0x90C0 U+901D # <cjk>
+0x90C1 U+9192 # <cjk>
+0x90C2 U+9752 # <cjk>
+0x90C3 U+9759 # <cjk>
+0x90C4 U+6589 # <cjk>
+0x90C5 U+7A0E # <cjk>
+0x90C6 U+8106 # <cjk>
+0x90C7 U+96BB # <cjk>
+0x90C8 U+5E2D # <cjk>
+0x90C9 U+60DC # <cjk>
+0x90CA U+621A # <cjk>
+0x90CB U+65A5 # <cjk>
+0x90CC U+6614 # <cjk>
+0x90CD U+6790 # <cjk>
+0x90CE U+77F3 # <cjk>
+0x90CF U+7A4D # <cjk>
+0x90D0 U+7C4D # <cjk>
+0x90D1 U+7E3E # <cjk>
+0x90D2 U+810A # <cjk>
+0x90D3 U+8CAC # <cjk>
+0x90D4 U+8D64 # <cjk>
+0x90D5 U+8DE1 # <cjk>
+0x90D6 U+8E5F # <cjk>
+0x90D7 U+78A9 # <cjk>
+0x90D8 U+5207 # <cjk>
+0x90D9 U+62D9 # <cjk>
+0x90DA U+63A5 # <cjk>
+0x90DB U+6442 # <cjk>
+0x90DC U+6298 # <cjk>
+0x90DD U+8A2D # <cjk>
+0x90DE U+7A83 # <cjk>
+0x90DF U+7BC0 # <cjk>
+0x90E0 U+8AAC # <cjk>
+0x90E1 U+96EA # <cjk>
+0x90E2 U+7D76 # <cjk>
+0x90E3 U+820C # <cjk>
+0x90E4 U+8749 # <cjk>
+0x90E5 U+4ED9 # <cjk>
+0x90E6 U+5148 # <cjk>
+0x90E7 U+5343 # <cjk>
+0x90E8 U+5360 # <cjk>
+0x90E9 U+5BA3 # <cjk>
+0x90EA U+5C02 # <cjk>
+0x90EB U+5C16 # <cjk>
+0x90EC U+5DDD # <cjk>
+0x90ED U+6226 # <cjk>
+0x90EE U+6247 # <cjk>
+0x90EF U+64B0 # <cjk>
+0x90F0 U+6813 # <cjk>
+0x90F1 U+6834 # <cjk>
+0x90F2 U+6CC9 # <cjk>
+0x90F3 U+6D45 # <cjk>
+0x90F4 U+6D17 # <cjk>
+0x90F5 U+67D3 # <cjk>
+0x90F6 U+6F5C # <cjk>
+0x90F7 U+714E # <cjk>
+0x90F8 U+717D # <cjk>
+0x90F9 U+65CB # <cjk>
+0x90FA U+7A7F # <cjk>
+0x90FB U+7BAD # <cjk>
+0x90FC U+7DDA # <cjk>
+0x9140 U+7E4A # <cjk>
+0x9141 U+7FA8 # <cjk>
+0x9142 U+817A # <cjk>
+0x9143 U+821B # <cjk>
+0x9144 U+8239 # <cjk>
+0x9145 U+85A6 # <cjk>
+0x9146 U+8A6E # <cjk>
+0x9147 U+8CCE # <cjk>
+0x9148 U+8DF5 # <cjk>
+0x9149 U+9078 # <cjk>
+0x914A U+9077 # <cjk>
+0x914B U+92AD # <cjk>
+0x914C U+9291 # <cjk>
+0x914D U+9583 # <cjk>
+0x914E U+9BAE # <cjk>
+0x914F U+524D # <cjk>
+0x9150 U+5584 # <cjk>
+0x9151 U+6F38 # <cjk>
+0x9152 U+7136 # <cjk>
+0x9153 U+5168 # <cjk>
+0x9154 U+7985 # <cjk>
+0x9155 U+7E55 # <cjk>
+0x9156 U+81B3 # <cjk>
+0x9157 U+7CCE # <cjk>
+0x9158 U+564C # <cjk>
+0x9159 U+5851 # <cjk>
+0x915A U+5CA8 # <cjk>
+0x915B U+63AA # <cjk>
+0x915C U+66FE # <cjk>
+0x915D U+66FD # <cjk>
+0x915E U+695A # <cjk>
+0x915F U+72D9 # <cjk>
+0x9160 U+758F # <cjk>
+0x9161 U+758E # <cjk>
+0x9162 U+790E # <cjk>
+0x9163 U+7956 # <cjk>
+0x9164 U+79DF # <cjk>
+0x9165 U+7C97 # <cjk>
+0x9166 U+7D20 # <cjk>
+0x9167 U+7D44 # <cjk>
+0x9168 U+8607 # <cjk>
+0x9169 U+8A34 # <cjk>
+0x916A U+963B # <cjk>
+0x916B U+9061 # <cjk>
+0x916C U+9F20 # <cjk>
+0x916D U+50E7 # <cjk>
+0x916E U+5275 # <cjk>
+0x916F U+53CC # <cjk>
+0x9170 U+53E2 # <cjk>
+0x9171 U+5009 # <cjk>
+0x9172 U+55AA # <cjk>
+0x9173 U+58EE # <cjk>
+0x9174 U+594F # <cjk>
+0x9175 U+723D # <cjk>
+0x9176 U+5B8B # <cjk>
+0x9177 U+5C64 # <cjk>
+0x9178 U+531D # <cjk>
+0x9179 U+60E3 # <cjk>
+0x917A U+60F3 # <cjk>
+0x917B U+635C # <cjk>
+0x917C U+6383 # <cjk>
+0x917D U+633F # <cjk>
+0x917E U+63BB # <cjk>
+0x9180 U+64CD # <cjk>
+0x9181 U+65E9 # <cjk>
+0x9182 U+66F9 # <cjk>
+0x9183 U+5DE3 # <cjk>
+0x9184 U+69CD # <cjk>
+0x9185 U+69FD # <cjk>
+0x9186 U+6F15 # <cjk>
+0x9187 U+71E5 # <cjk>
+0x9188 U+4E89 # <cjk>
+0x9189 U+75E9 # <cjk>
+0x918A U+76F8 # <cjk>
+0x918B U+7A93 # <cjk>
+0x918C U+7CDF # <cjk>
+0x918D U+7DCF # <cjk>
+0x918E U+7D9C # <cjk>
+0x918F U+8061 # <cjk>
+0x9190 U+8349 # <cjk>
+0x9191 U+8358 # <cjk>
+0x9192 U+846C # <cjk>
+0x9193 U+84BC # <cjk>
+0x9194 U+85FB # <cjk>
+0x9195 U+88C5 # <cjk>
+0x9196 U+8D70 # <cjk>
+0x9197 U+9001 # <cjk>
+0x9198 U+906D # <cjk>
+0x9199 U+9397 # <cjk>
+0x919A U+971C # <cjk>
+0x919B U+9A12 # <cjk>
+0x919C U+50CF # <cjk>
+0x919D U+5897 # <cjk>
+0x919E U+618E # <cjk>
+0x919F U+81D3 # <cjk>
+0x91A0 U+8535 # <cjk>
+0x91A1 U+8D08 # <cjk>
+0x91A2 U+9020 # <cjk>
+0x91A3 U+4FC3 # <cjk>
+0x91A4 U+5074 # <cjk>
+0x91A5 U+5247 # <cjk>
+0x91A6 U+5373 # <cjk>
+0x91A7 U+606F # <cjk>
+0x91A8 U+6349 # <cjk>
+0x91A9 U+675F # <cjk>
+0x91AA U+6E2C # <cjk>
+0x91AB U+8DB3 # <cjk>
+0x91AC U+901F # <cjk>
+0x91AD U+4FD7 # <cjk>
+0x91AE U+5C5E # <cjk>
+0x91AF U+8CCA # <cjk>
+0x91B0 U+65CF # <cjk>
+0x91B1 U+7D9A # <cjk>
+0x91B2 U+5352 # <cjk>
+0x91B3 U+8896 # <cjk>
+0x91B4 U+5176 # <cjk>
+0x91B5 U+63C3 # <cjk>
+0x91B6 U+5B58 # <cjk>
+0x91B7 U+5B6B # <cjk>
+0x91B8 U+5C0A # <cjk>
+0x91B9 U+640D # <cjk>
+0x91BA U+6751 # <cjk>
+0x91BB U+905C # <cjk>
+0x91BC U+4ED6 # <cjk>
+0x91BD U+591A # <cjk>
+0x91BE U+592A # <cjk>
+0x91BF U+6C70 # <cjk>
+0x91C0 U+8A51 # <cjk>
+0x91C1 U+553E # <cjk>
+0x91C2 U+5815 # <cjk>
+0x91C3 U+59A5 # <cjk>
+0x91C4 U+60F0 # <cjk>
+0x91C5 U+6253 # <cjk>
+0x91C6 U+67C1 # <cjk>
+0x91C7 U+8235 # <cjk>
+0x91C8 U+6955 # <cjk>
+0x91C9 U+9640 # <cjk>
+0x91CA U+99C4 # <cjk>
+0x91CB U+9A28 # <cjk>
+0x91CC U+4F53 # <cjk>
+0x91CD U+5806 # <cjk>
+0x91CE U+5BFE # <cjk>
+0x91CF U+8010 # <cjk>
+0x91D0 U+5CB1 # <cjk>
+0x91D1 U+5E2F # <cjk>
+0x91D2 U+5F85 # <cjk>
+0x91D3 U+6020 # <cjk>
+0x91D4 U+614B # <cjk>
+0x91D5 U+6234 # <cjk>
+0x91D6 U+66FF # <cjk>
+0x91D7 U+6CF0 # <cjk>
+0x91D8 U+6EDE # <cjk>
+0x91D9 U+80CE # <cjk>
+0x91DA U+817F # <cjk>
+0x91DB U+82D4 # <cjk>
+0x91DC U+888B # <cjk>
+0x91DD U+8CB8 # <cjk>
+0x91DE U+9000 # <cjk>
+0x91DF U+902E # <cjk>
+0x91E0 U+968A # <cjk>
+0x91E1 U+9EDB # <cjk>
+0x91E2 U+9BDB # <cjk>
+0x91E3 U+4EE3 # <cjk>
+0x91E4 U+53F0 # <cjk>
+0x91E5 U+5927 # <cjk>
+0x91E6 U+7B2C # <cjk>
+0x91E7 U+918D # <cjk>
+0x91E8 U+984C # <cjk>
+0x91E9 U+9DF9 # <cjk>
+0x91EA U+6EDD # <cjk>
+0x91EB U+7027 # <cjk>
+0x91EC U+5353 # <cjk>
+0x91ED U+5544 # <cjk>
+0x91EE U+5B85 # <cjk>
+0x91EF U+6258 # <cjk>
+0x91F0 U+629E # <cjk>
+0x91F1 U+62D3 # <cjk>
+0x91F2 U+6CA2 # <cjk>
+0x91F3 U+6FEF # <cjk>
+0x91F4 U+7422 # <cjk>
+0x91F5 U+8A17 # <cjk>
+0x91F6 U+9438 # <cjk>
+0x91F7 U+6FC1 # <cjk>
+0x91F8 U+8AFE # <cjk>
+0x91F9 U+8338 # <cjk>
+0x91FA U+51E7 # <cjk>
+0x91FB U+86F8 # <cjk>
+0x91FC U+53EA # <cjk>
+0x9240 U+53E9 # <cjk>
+0x9241 U+4F46 # <cjk>
+0x9242 U+9054 # <cjk>
+0x9243 U+8FB0 # <cjk>
+0x9244 U+596A # <cjk>
+0x9245 U+8131 # <cjk>
+0x9246 U+5DFD # <cjk>
+0x9247 U+7AEA # <cjk>
+0x9248 U+8FBF # <cjk>
+0x9249 U+68DA # <cjk>
+0x924A U+8C37 # <cjk>
+0x924B U+72F8 # <cjk>
+0x924C U+9C48 # <cjk>
+0x924D U+6A3D # <cjk>
+0x924E U+8AB0 # <cjk>
+0x924F U+4E39 # <cjk>
+0x9250 U+5358 # <cjk>
+0x9251 U+5606 # <cjk>
+0x9252 U+5766 # <cjk>
+0x9253 U+62C5 # <cjk>
+0x9254 U+63A2 # <cjk>
+0x9255 U+65E6 # <cjk>
+0x9256 U+6B4E # <cjk>
+0x9257 U+6DE1 # <cjk>
+0x9258 U+6E5B # <cjk>
+0x9259 U+70AD # <cjk>
+0x925A U+77ED # <cjk>
+0x925B U+7AEF # <cjk>
+0x925C U+7BAA # <cjk>
+0x925D U+7DBB # <cjk>
+0x925E U+803D # <cjk>
+0x925F U+80C6 # <cjk>
+0x9260 U+86CB # <cjk>
+0x9261 U+8A95 # <cjk>
+0x9262 U+935B # <cjk>
+0x9263 U+56E3 # <cjk>
+0x9264 U+58C7 # <cjk>
+0x9265 U+5F3E # <cjk>
+0x9266 U+65AD # <cjk>
+0x9267 U+6696 # <cjk>
+0x9268 U+6A80 # <cjk>
+0x9269 U+6BB5 # <cjk>
+0x926A U+7537 # <cjk>
+0x926B U+8AC7 # <cjk>
+0x926C U+5024 # <cjk>
+0x926D U+77E5 # <cjk>
+0x926E U+5730 # <cjk>
+0x926F U+5F1B # <cjk>
+0x9270 U+6065 # <cjk>
+0x9271 U+667A # <cjk>
+0x9272 U+6C60 # <cjk>
+0x9273 U+75F4 # <cjk>
+0x9274 U+7A1A # <cjk>
+0x9275 U+7F6E # <cjk>
+0x9276 U+81F4 # <cjk>
+0x9277 U+8718 # <cjk>
+0x9278 U+9045 # <cjk>
+0x9279 U+99B3 # <cjk>
+0x927A U+7BC9 # <cjk>
+0x927B U+755C # <cjk>
+0x927C U+7AF9 # <cjk>
+0x927D U+7B51 # <cjk>
+0x927E U+84C4 # <cjk>
+0x9280 U+9010 # <cjk>
+0x9281 U+79E9 # <cjk>
+0x9282 U+7A92 # <cjk>
+0x9283 U+8336 # <cjk>
+0x9284 U+5AE1 # <cjk>
+0x9285 U+7740 # <cjk>
+0x9286 U+4E2D # <cjk>
+0x9287 U+4EF2 # <cjk>
+0x9288 U+5B99 # <cjk>
+0x9289 U+5FE0 # <cjk>
+0x928A U+62BD # <cjk>
+0x928B U+663C # <cjk>
+0x928C U+67F1 # <cjk>
+0x928D U+6CE8 # <cjk>
+0x928E U+866B # <cjk>
+0x928F U+8877 # <cjk>
+0x9290 U+8A3B # <cjk>
+0x9291 U+914E # <cjk>
+0x9292 U+92F3 # <cjk>
+0x9293 U+99D0 # <cjk>
+0x9294 U+6A17 # <cjk>
+0x9295 U+7026 # <cjk>
+0x9296 U+732A # <cjk>
+0x9297 U+82E7 # <cjk>
+0x9298 U+8457 # <cjk>
+0x9299 U+8CAF # <cjk>
+0x929A U+4E01 # <cjk>
+0x929B U+5146 # <cjk>
+0x929C U+51CB # <cjk>
+0x929D U+558B # <cjk>
+0x929E U+5BF5 # <cjk>
+0x929F U+5E16 # <cjk>
+0x92A0 U+5E33 # <cjk>
+0x92A1 U+5E81 # <cjk>
+0x92A2 U+5F14 # <cjk>
+0x92A3 U+5F35 # <cjk>
+0x92A4 U+5F6B # <cjk>
+0x92A5 U+5FB4 # <cjk>
+0x92A6 U+61F2 # <cjk>
+0x92A7 U+6311 # <cjk>
+0x92A8 U+66A2 # <cjk>
+0x92A9 U+671D # <cjk>
+0x92AA U+6F6E # <cjk>
+0x92AB U+7252 # <cjk>
+0x92AC U+753A # <cjk>
+0x92AD U+773A # <cjk>
+0x92AE U+8074 # <cjk>
+0x92AF U+8139 # <cjk>
+0x92B0 U+8178 # <cjk>
+0x92B1 U+8776 # <cjk>
+0x92B2 U+8ABF # <cjk>
+0x92B3 U+8ADC # <cjk>
+0x92B4 U+8D85 # <cjk>
+0x92B5 U+8DF3 # <cjk>
+0x92B6 U+929A # <cjk>
+0x92B7 U+9577 # <cjk>
+0x92B8 U+9802 # <cjk>
+0x92B9 U+9CE5 # <cjk>
+0x92BA U+52C5 # <cjk>
+0x92BB U+6357 # <cjk>
+0x92BC U+76F4 # <cjk>
+0x92BD U+6715 # <cjk>
+0x92BE U+6C88 # <cjk>
+0x92BF U+73CD # <cjk>
+0x92C0 U+8CC3 # <cjk>
+0x92C1 U+93AE # <cjk>
+0x92C2 U+9673 # <cjk>
+0x92C3 U+6D25 # <cjk>
+0x92C4 U+589C # <cjk>
+0x92C5 U+690E # <cjk>
+0x92C6 U+69CC # <cjk>
+0x92C7 U+8FFD # <cjk>
+0x92C8 U+939A # <cjk>
+0x92C9 U+75DB # <cjk>
+0x92CA U+901A # <cjk>
+0x92CB U+585A # <cjk>
+0x92CC U+6802 # <cjk>
+0x92CD U+63B4 # <cjk>
+0x92CE U+69FB # <cjk>
+0x92CF U+4F43 # <cjk>
+0x92D0 U+6F2C # <cjk>
+0x92D1 U+67D8 # <cjk>
+0x92D2 U+8FBB # <cjk>
+0x92D3 U+8526 # <cjk>
+0x92D4 U+7DB4 # <cjk>
+0x92D5 U+9354 # <cjk>
+0x92D6 U+693F # <cjk>
+0x92D7 U+6F70 # <cjk>
+0x92D8 U+576A # <cjk>
+0x92D9 U+58F7 # <cjk>
+0x92DA U+5B2C # <cjk>
+0x92DB U+7D2C # <cjk>
+0x92DC U+722A # <cjk>
+0x92DD U+540A # <cjk>
+0x92DE U+91E3 # <cjk>
+0x92DF U+9DB4 # <cjk>
+0x92E0 U+4EAD # <cjk>
+0x92E1 U+4F4E # <cjk>
+0x92E2 U+505C # <cjk>
+0x92E3 U+5075 # <cjk>
+0x92E4 U+5243 # <cjk>
+0x92E5 U+8C9E # <cjk>
+0x92E6 U+5448 # <cjk>
+0x92E7 U+5824 # <cjk>
+0x92E8 U+5B9A # <cjk>
+0x92E9 U+5E1D # <cjk>
+0x92EA U+5E95 # <cjk>
+0x92EB U+5EAD # <cjk>
+0x92EC U+5EF7 # <cjk>
+0x92ED U+5F1F # <cjk>
+0x92EE U+608C # <cjk>
+0x92EF U+62B5 # <cjk>
+0x92F0 U+633A # <cjk>
+0x92F1 U+63D0 # <cjk>
+0x92F2 U+68AF # <cjk>
+0x92F3 U+6C40 # <cjk>
+0x92F4 U+7887 # <cjk>
+0x92F5 U+798E # <cjk>
+0x92F6 U+7A0B # <cjk>
+0x92F7 U+7DE0 # <cjk>
+0x92F8 U+8247 # <cjk>
+0x92F9 U+8A02 # <cjk>
+0x92FA U+8AE6 # <cjk>
+0x92FB U+8E44 # <cjk>
+0x92FC U+9013 # <cjk>
+0x9340 U+90B8 # <cjk>
+0x9341 U+912D # <cjk>
+0x9342 U+91D8 # <cjk>
+0x9343 U+9F0E # <cjk>
+0x9344 U+6CE5 # <cjk>
+0x9345 U+6458 # <cjk>
+0x9346 U+64E2 # <cjk>
+0x9347 U+6575 # <cjk>
+0x9348 U+6EF4 # <cjk>
+0x9349 U+7684 # <cjk>
+0x934A U+7B1B # <cjk>
+0x934B U+9069 # <cjk>
+0x934C U+93D1 # <cjk>
+0x934D U+6EBA # <cjk>
+0x934E U+54F2 # <cjk>
+0x934F U+5FB9 # <cjk>
+0x9350 U+64A4 # <cjk>
+0x9351 U+8F4D # <cjk>
+0x9352 U+8FED # <cjk>
+0x9353 U+9244 # <cjk>
+0x9354 U+5178 # <cjk>
+0x9355 U+586B # <cjk>
+0x9356 U+5929 # <cjk>
+0x9357 U+5C55 # <cjk>
+0x9358 U+5E97 # <cjk>
+0x9359 U+6DFB # <cjk>
+0x935A U+7E8F # <cjk>
+0x935B U+751C # <cjk>
+0x935C U+8CBC # <cjk>
+0x935D U+8EE2 # <cjk>
+0x935E U+985B # <cjk>
+0x935F U+70B9 # <cjk>
+0x9360 U+4F1D # <cjk>
+0x9361 U+6BBF # <cjk>
+0x9362 U+6FB1 # <cjk>
+0x9363 U+7530 # <cjk>
+0x9364 U+96FB # <cjk>
+0x9365 U+514E # <cjk>
+0x9366 U+5410 # <cjk>
+0x9367 U+5835 # <cjk>
+0x9368 U+5857 # <cjk>
+0x9369 U+59AC # <cjk>
+0x936A U+5C60 # <cjk>
+0x936B U+5F92 # <cjk>
+0x936C U+6597 # <cjk>
+0x936D U+675C # <cjk>
+0x936E U+6E21 # <cjk>
+0x936F U+767B # <cjk>
+0x9370 U+83DF # <cjk>
+0x9371 U+8CED # <cjk>
+0x9372 U+9014 # <cjk>
+0x9373 U+90FD # <cjk>
+0x9374 U+934D # <cjk>
+0x9375 U+7825 # <cjk>
+0x9376 U+783A # <cjk>
+0x9377 U+52AA # <cjk>
+0x9378 U+5EA6 # <cjk>
+0x9379 U+571F # <cjk>
+0x937A U+5974 # <cjk>
+0x937B U+6012 # <cjk>
+0x937C U+5012 # <cjk>
+0x937D U+515A # <cjk>
+0x937E U+51AC # <cjk>
+0x9380 U+51CD # <cjk>
+0x9381 U+5200 # <cjk>
+0x9382 U+5510 # <cjk>
+0x9383 U+5854 # <cjk>
+0x9384 U+5858 # <cjk>
+0x9385 U+5957 # <cjk>
+0x9386 U+5B95 # <cjk>
+0x9387 U+5CF6 # <cjk>
+0x9388 U+5D8B # <cjk>
+0x9389 U+60BC # <cjk>
+0x938A U+6295 # <cjk>
+0x938B U+642D # <cjk>
+0x938C U+6771 # <cjk>
+0x938D U+6843 # <cjk>
+0x938E U+68BC # <cjk>
+0x938F U+68DF # <cjk>
+0x9390 U+76D7 # <cjk>
+0x9391 U+6DD8 # <cjk>
+0x9392 U+6E6F # <cjk>
+0x9393 U+6D9B # <cjk>
+0x9394 U+706F # <cjk>
+0x9395 U+71C8 # <cjk>
+0x9396 U+5F53 # <cjk>
+0x9397 U+75D8 # <cjk>
+0x9398 U+7977 # <cjk>
+0x9399 U+7B49 # <cjk>
+0x939A U+7B54 # <cjk>
+0x939B U+7B52 # <cjk>
+0x939C U+7CD6 # <cjk>
+0x939D U+7D71 # <cjk>
+0x939E U+5230 # <cjk>
+0x939F U+8463 # <cjk>
+0x93A0 U+8569 # <cjk>
+0x93A1 U+85E4 # <cjk>
+0x93A2 U+8A0E # <cjk>
+0x93A3 U+8B04 # <cjk>
+0x93A4 U+8C46 # <cjk>
+0x93A5 U+8E0F # <cjk>
+0x93A6 U+9003 # <cjk>
+0x93A7 U+900F # <cjk>
+0x93A8 U+9419 # <cjk>
+0x93A9 U+9676 # <cjk>
+0x93AA U+982D # <cjk>
+0x93AB U+9A30 # <cjk>
+0x93AC U+95D8 # <cjk>
+0x93AD U+50CD # <cjk>
+0x93AE U+52D5 # <cjk>
+0x93AF U+540C # <cjk>
+0x93B0 U+5802 # <cjk>
+0x93B1 U+5C0E # <cjk>
+0x93B2 U+61A7 # <cjk>
+0x93B3 U+649E # <cjk>
+0x93B4 U+6D1E # <cjk>
+0x93B5 U+77B3 # <cjk>
+0x93B6 U+7AE5 # <cjk>
+0x93B7 U+80F4 # <cjk>
+0x93B8 U+8404 # <cjk>
+0x93B9 U+9053 # <cjk>
+0x93BA U+9285 # <cjk>
+0x93BB U+5CE0 # <cjk>
+0x93BC U+9D07 # <cjk>
+0x93BD U+533F # <cjk>
+0x93BE U+5F97 # <cjk>
+0x93BF U+5FB3 # <cjk>
+0x93C0 U+6D9C # <cjk>
+0x93C1 U+7279 # <cjk>
+0x93C2 U+7763 # <cjk>
+0x93C3 U+79BF # <cjk>
+0x93C4 U+7BE4 # <cjk>
+0x93C5 U+6BD2 # <cjk>
+0x93C6 U+72EC # <cjk>
+0x93C7 U+8AAD # <cjk>
+0x93C8 U+6803 # <cjk>
+0x93C9 U+6A61 # <cjk>
+0x93CA U+51F8 # <cjk>
+0x93CB U+7A81 # <cjk>
+0x93CC U+6934 # <cjk>
+0x93CD U+5C4A # <cjk>
+0x93CE U+9CF6 # <cjk>
+0x93CF U+82EB # <cjk>
+0x93D0 U+5BC5 # <cjk>
+0x93D1 U+9149 # <cjk>
+0x93D2 U+701E # <cjk>
+0x93D3 U+5678 # <cjk>
+0x93D4 U+5C6F # <cjk>
+0x93D5 U+60C7 # <cjk>
+0x93D6 U+6566 # <cjk>
+0x93D7 U+6C8C # <cjk>
+0x93D8 U+8C5A # <cjk>
+0x93D9 U+9041 # <cjk>
+0x93DA U+9813 # <cjk>
+0x93DB U+5451 # <cjk>
+0x93DC U+66C7 # <cjk>
+0x93DD U+920D # <cjk>
+0x93DE U+5948 # <cjk>
+0x93DF U+90A3 # <cjk>
+0x93E0 U+5185 # <cjk>
+0x93E1 U+4E4D # <cjk>
+0x93E2 U+51EA # <cjk>
+0x93E3 U+8599 # <cjk>
+0x93E4 U+8B0E # <cjk>
+0x93E5 U+7058 # <cjk>
+0x93E6 U+637A # <cjk>
+0x93E7 U+934B # <cjk>
+0x93E8 U+6962 # <cjk>
+0x93E9 U+99B4 # <cjk>
+0x93EA U+7E04 # <cjk>
+0x93EB U+7577 # <cjk>
+0x93EC U+5357 # <cjk>
+0x93ED U+6960 # <cjk>
+0x93EE U+8EDF # <cjk>
+0x93EF U+96E3 # <cjk>
+0x93F0 U+6C5D # <cjk>
+0x93F1 U+4E8C # <cjk>
+0x93F2 U+5C3C # <cjk>
+0x93F3 U+5F10 # <cjk>
+0x93F4 U+8FE9 # <cjk>
+0x93F5 U+5302 # <cjk>
+0x93F6 U+8CD1 # <cjk>
+0x93F7 U+8089 # <cjk>
+0x93F8 U+8679 # <cjk>
+0x93F9 U+5EFF # <cjk>
+0x93FA U+65E5 # <cjk>
+0x93FB U+4E73 # <cjk>
+0x93FC U+5165 # <cjk>
+0x9440 U+5982 # <cjk>
+0x9441 U+5C3F # <cjk>
+0x9442 U+97EE # <cjk>
+0x9443 U+4EFB # <cjk>
+0x9444 U+598A # <cjk>
+0x9445 U+5FCD # <cjk>
+0x9446 U+8A8D # <cjk>
+0x9447 U+6FE1 # <cjk>
+0x9448 U+79B0 # <cjk>
+0x9449 U+7962 # <cjk>
+0x944A U+5BE7 # <cjk>
+0x944B U+8471 # <cjk>
+0x944C U+732B # <cjk>
+0x944D U+71B1 # <cjk>
+0x944E U+5E74 # <cjk>
+0x944F U+5FF5 # <cjk>
+0x9450 U+637B # <cjk>
+0x9451 U+649A # <cjk>
+0x9452 U+71C3 # <cjk>
+0x9453 U+7C98 # <cjk>
+0x9454 U+4E43 # <cjk>
+0x9455 U+5EFC # <cjk>
+0x9456 U+4E4B # <cjk>
+0x9457 U+57DC # <cjk>
+0x9458 U+56A2 # <cjk>
+0x9459 U+60A9 # <cjk>
+0x945A U+6FC3 # <cjk>
+0x945B U+7D0D # <cjk>
+0x945C U+80FD # <cjk>
+0x945D U+8133 # <cjk>
+0x945E U+81BF # <cjk>
+0x945F U+8FB2 # <cjk>
+0x9460 U+8997 # <cjk>
+0x9461 U+86A4 # <cjk>
+0x9462 U+5DF4 # <cjk>
+0x9463 U+628A # <cjk>
+0x9464 U+64AD # <cjk>
+0x9465 U+8987 # <cjk>
+0x9466 U+6777 # <cjk>
+0x9467 U+6CE2 # <cjk>
+0x9468 U+6D3E # <cjk>
+0x9469 U+7436 # <cjk>
+0x946A U+7834 # <cjk>
+0x946B U+5A46 # <cjk>
+0x946C U+7F75 # <cjk>
+0x946D U+82AD # <cjk>
+0x946E U+99AC # <cjk>
+0x946F U+4FF3 # <cjk>
+0x9470 U+5EC3 # <cjk>
+0x9471 U+62DD # <cjk>
+0x9472 U+6392 # <cjk>
+0x9473 U+6557 # <cjk>
+0x9474 U+676F # <cjk>
+0x9475 U+76C3 # <cjk>
+0x9476 U+724C # <cjk>
+0x9477 U+80CC # <cjk>
+0x9478 U+80BA # <cjk>
+0x9479 U+8F29 # <cjk>
+0x947A U+914D # <cjk>
+0x947B U+500D # <cjk>
+0x947C U+57F9 # <cjk>
+0x947D U+5A92 # <cjk>
+0x947E U+6885 # <cjk>
+0x9480 U+6973 # <cjk>
+0x9481 U+7164 # <cjk>
+0x9482 U+72FD # <cjk>
+0x9483 U+8CB7 # <cjk>
+0x9484 U+58F2 # <cjk>
+0x9485 U+8CE0 # <cjk>
+0x9486 U+966A # <cjk>
+0x9487 U+9019 # <cjk>
+0x9488 U+877F # <cjk>
+0x9489 U+79E4 # <cjk>
+0x948A U+77E7 # <cjk>
+0x948B U+8429 # <cjk>
+0x948C U+4F2F # <cjk>
+0x948D U+5265 # <cjk>
+0x948E U+535A # <cjk>
+0x948F U+62CD # <cjk>
+0x9490 U+67CF # <cjk>
+0x9491 U+6CCA # <cjk>
+0x9492 U+767D # <cjk>
+0x9493 U+7B94 # <cjk>
+0x9494 U+7C95 # <cjk>
+0x9495 U+8236 # <cjk>
+0x9496 U+8584 # <cjk>
+0x9497 U+8FEB # <cjk>
+0x9498 U+66DD # <cjk>
+0x9499 U+6F20 # <cjk>
+0x949A U+7206 # <cjk>
+0x949B U+7E1B # <cjk>
+0x949C U+83AB # <cjk>
+0x949D U+99C1 # <cjk>
+0x949E U+9EA6 # <cjk>
+0x949F U+51FD # <cjk>
+0x94A0 U+7BB1 # <cjk>
+0x94A1 U+7872 # <cjk>
+0x94A2 U+7BB8 # <cjk>
+0x94A3 U+8087 # <cjk>
+0x94A4 U+7B48 # <cjk>
+0x94A5 U+6AE8 # <cjk>
+0x94A6 U+5E61 # <cjk>
+0x94A7 U+808C # <cjk>
+0x94A8 U+7551 # <cjk>
+0x94A9 U+7560 # <cjk>
+0x94AA U+516B # <cjk>
+0x94AB U+9262 # <cjk>
+0x94AC U+6E8C # <cjk>
+0x94AD U+767A # <cjk>
+0x94AE U+9197 # <cjk>
+0x94AF U+9AEA # <cjk>
+0x94B0 U+4F10 # <cjk>
+0x94B1 U+7F70 # <cjk>
+0x94B2 U+629C # <cjk>
+0x94B3 U+7B4F # <cjk>
+0x94B4 U+95A5 # <cjk>
+0x94B5 U+9CE9 # <cjk>
+0x94B6 U+567A # <cjk>
+0x94B7 U+5859 # <cjk>
+0x94B8 U+86E4 # <cjk>
+0x94B9 U+96BC # <cjk>
+0x94BA U+4F34 # <cjk>
+0x94BB U+5224 # <cjk>
+0x94BC U+534A # <cjk>
+0x94BD U+53CD # <cjk>
+0x94BE U+53DB # <cjk>
+0x94BF U+5E06 # <cjk>
+0x94C0 U+642C # <cjk>
+0x94C1 U+6591 # <cjk>
+0x94C2 U+677F # <cjk>
+0x94C3 U+6C3E # <cjk>
+0x94C4 U+6C4E # <cjk>
+0x94C5 U+7248 # <cjk>
+0x94C6 U+72AF # <cjk>
+0x94C7 U+73ED # <cjk>
+0x94C8 U+7554 # <cjk>
+0x94C9 U+7E41 # <cjk>
+0x94CA U+822C # <cjk>
+0x94CB U+85E9 # <cjk>
+0x94CC U+8CA9 # <cjk>
+0x94CD U+7BC4 # <cjk>
+0x94CE U+91C6 # <cjk>
+0x94CF U+7169 # <cjk>
+0x94D0 U+9812 # <cjk>
+0x94D1 U+98EF # <cjk>
+0x94D2 U+633D # <cjk>
+0x94D3 U+6669 # <cjk>
+0x94D4 U+756A # <cjk>
+0x94D5 U+76E4 # <cjk>
+0x94D6 U+78D0 # <cjk>
+0x94D7 U+8543 # <cjk>
+0x94D8 U+86EE # <cjk>
+0x94D9 U+532A # <cjk>
+0x94DA U+5351 # <cjk>
+0x94DB U+5426 # <cjk>
+0x94DC U+5983 # <cjk>
+0x94DD U+5E87 # <cjk>
+0x94DE U+5F7C # <cjk>
+0x94DF U+60B2 # <cjk>
+0x94E0 U+6249 # <cjk>
+0x94E1 U+6279 # <cjk>
+0x94E2 U+62AB # <cjk>
+0x94E3 U+6590 # <cjk>
+0x94E4 U+6BD4 # <cjk>
+0x94E5 U+6CCC # <cjk>
+0x94E6 U+75B2 # <cjk>
+0x94E7 U+76AE # <cjk>
+0x94E8 U+7891 # <cjk>
+0x94E9 U+79D8 # <cjk>
+0x94EA U+7DCB # <cjk>
+0x94EB U+7F77 # <cjk>
+0x94EC U+80A5 # <cjk>
+0x94ED U+88AB # <cjk>
+0x94EE U+8AB9 # <cjk>
+0x94EF U+8CBB # <cjk>
+0x94F0 U+907F # <cjk>
+0x94F1 U+975E # <cjk>
+0x94F2 U+98DB # <cjk>
+0x94F3 U+6A0B # <cjk>
+0x94F4 U+7C38 # <cjk>
+0x94F5 U+5099 # <cjk>
+0x94F6 U+5C3E # <cjk>
+0x94F7 U+5FAE # <cjk>
+0x94F8 U+6787 # <cjk>
+0x94F9 U+6BD8 # <cjk>
+0x94FA U+7435 # <cjk>
+0x94FB U+7709 # <cjk>
+0x94FC U+7F8E # <cjk>
+0x9540 U+9F3B # <cjk>
+0x9541 U+67CA # <cjk>
+0x9542 U+7A17 # <cjk>
+0x9543 U+5339 # <cjk>
+0x9544 U+758B # <cjk>
+0x9545 U+9AED # <cjk>
+0x9546 U+5F66 # <cjk>
+0x9547 U+819D # <cjk>
+0x9548 U+83F1 # <cjk>
+0x9549 U+8098 # <cjk>
+0x954A U+5F3C # <cjk>
+0x954B U+5FC5 # <cjk>
+0x954C U+7562 # <cjk>
+0x954D U+7B46 # <cjk>
+0x954E U+903C # <cjk>
+0x954F U+6867 # <cjk>
+0x9550 U+59EB # <cjk>
+0x9551 U+5A9B # <cjk>
+0x9552 U+7D10 # <cjk>
+0x9553 U+767E # <cjk>
+0x9554 U+8B2C # <cjk>
+0x9555 U+4FF5 # <cjk>
+0x9556 U+5F6A # <cjk>
+0x9557 U+6A19 # <cjk>
+0x9558 U+6C37 # <cjk>
+0x9559 U+6F02 # <cjk>
+0x955A U+74E2 # <cjk>
+0x955B U+7968 # <cjk>
+0x955C U+8868 # <cjk>
+0x955D U+8A55 # <cjk>
+0x955E U+8C79 # <cjk>
+0x955F U+5EDF # <cjk>
+0x9560 U+63CF # <cjk>
+0x9561 U+75C5 # <cjk>
+0x9562 U+79D2 # <cjk>
+0x9563 U+82D7 # <cjk>
+0x9564 U+9328 # <cjk>
+0x9565 U+92F2 # <cjk>
+0x9566 U+849C # <cjk>
+0x9567 U+86ED # <cjk>
+0x9568 U+9C2D # <cjk>
+0x9569 U+54C1 # <cjk>
+0x956A U+5F6C # <cjk>
+0x956B U+658C # <cjk>
+0x956C U+6D5C # <cjk>
+0x956D U+7015 # <cjk>
+0x956E U+8CA7 # <cjk>
+0x956F U+8CD3 # <cjk>
+0x9570 U+983B # <cjk>
+0x9571 U+654F # <cjk>
+0x9572 U+74F6 # <cjk>
+0x9573 U+4E0D # <cjk>
+0x9574 U+4ED8 # <cjk>
+0x9575 U+57E0 # <cjk>
+0x9576 U+592B # <cjk>
+0x9577 U+5A66 # <cjk>
+0x9578 U+5BCC # <cjk>
+0x9579 U+51A8 # <cjk>
+0x957A U+5E03 # <cjk>
+0x957B U+5E9C # <cjk>
+0x957C U+6016 # <cjk>
+0x957D U+6276 # <cjk>
+0x957E U+6577 # <cjk>
+0x9580 U+65A7 # <cjk>
+0x9581 U+666E # <cjk>
+0x9582 U+6D6E # <cjk>
+0x9583 U+7236 # <cjk>
+0x9584 U+7B26 # <cjk>
+0x9585 U+8150 # <cjk>
+0x9586 U+819A # <cjk>
+0x9587 U+8299 # <cjk>
+0x9588 U+8B5C # <cjk>
+0x9589 U+8CA0 # <cjk>
+0x958A U+8CE6 # <cjk>
+0x958B U+8D74 # <cjk>
+0x958C U+961C # <cjk>
+0x958D U+9644 # <cjk>
+0x958E U+4FAE # <cjk>
+0x958F U+64AB # <cjk>
+0x9590 U+6B66 # <cjk>
+0x9591 U+821E # <cjk>
+0x9592 U+8461 # <cjk>
+0x9593 U+856A # <cjk>
+0x9594 U+90E8 # <cjk>
+0x9595 U+5C01 # <cjk>
+0x9596 U+6953 # <cjk>
+0x9597 U+98A8 # <cjk>
+0x9598 U+847A # <cjk>
+0x9599 U+8557 # <cjk>
+0x959A U+4F0F # <cjk>
+0x959B U+526F # <cjk>
+0x959C U+5FA9 # <cjk>
+0x959D U+5E45 # <cjk>
+0x959E U+670D # <cjk>
+0x959F U+798F # <cjk>
+0x95A0 U+8179 # <cjk>
+0x95A1 U+8907 # <cjk>
+0x95A2 U+8986 # <cjk>
+0x95A3 U+6DF5 # <cjk>
+0x95A4 U+5F17 # <cjk>
+0x95A5 U+6255 # <cjk>
+0x95A6 U+6CB8 # <cjk>
+0x95A7 U+4ECF # <cjk>
+0x95A8 U+7269 # <cjk>
+0x95A9 U+9B92 # <cjk>
+0x95AA U+5206 # <cjk>
+0x95AB U+543B # <cjk>
+0x95AC U+5674 # <cjk>
+0x95AD U+58B3 # <cjk>
+0x95AE U+61A4 # <cjk>
+0x95AF U+626E # <cjk>
+0x95B0 U+711A # <cjk>
+0x95B1 U+596E # <cjk>
+0x95B2 U+7C89 # <cjk>
+0x95B3 U+7CDE # <cjk>
+0x95B4 U+7D1B # <cjk>
+0x95B5 U+96F0 # <cjk>
+0x95B6 U+6587 # <cjk>
+0x95B7 U+805E # <cjk>
+0x95B8 U+4E19 # <cjk>
+0x95B9 U+4F75 # <cjk>
+0x95BA U+5175 # <cjk>
+0x95BB U+5840 # <cjk>
+0x95BC U+5E63 # <cjk>
+0x95BD U+5E73 # <cjk>
+0x95BE U+5F0A # <cjk>
+0x95BF U+67C4 # <cjk>
+0x95C0 U+4E26 # <cjk>
+0x95C1 U+853D # <cjk>
+0x95C2 U+9589 # <cjk>
+0x95C3 U+965B # <cjk>
+0x95C4 U+7C73 # <cjk>
+0x95C5 U+9801 # <cjk>
+0x95C6 U+50FB # <cjk>
+0x95C7 U+58C1 # <cjk>
+0x95C8 U+7656 # <cjk>
+0x95C9 U+78A7 # <cjk>
+0x95CA U+5225 # <cjk>
+0x95CB U+77A5 # <cjk>
+0x95CC U+8511 # <cjk>
+0x95CD U+7B86 # <cjk>
+0x95CE U+504F # <cjk>
+0x95CF U+5909 # <cjk>
+0x95D0 U+7247 # <cjk>
+0x95D1 U+7BC7 # <cjk>
+0x95D2 U+7DE8 # <cjk>
+0x95D3 U+8FBA # <cjk>
+0x95D4 U+8FD4 # <cjk>
+0x95D5 U+904D # <cjk>
+0x95D6 U+4FBF # <cjk>
+0x95D7 U+52C9 # <cjk>
+0x95D8 U+5A29 # <cjk>
+0x95D9 U+5F01 # <cjk>
+0x95DA U+97AD # <cjk>
+0x95DB U+4FDD # <cjk>
+0x95DC U+8217 # <cjk>
+0x95DD U+92EA # <cjk>
+0x95DE U+5703 # <cjk>
+0x95DF U+6355 # <cjk>
+0x95E0 U+6B69 # <cjk>
+0x95E1 U+752B # <cjk>
+0x95E2 U+88DC # <cjk>
+0x95E3 U+8F14 # <cjk>
+0x95E4 U+7A42 # <cjk>
+0x95E5 U+52DF # <cjk>
+0x95E6 U+5893 # <cjk>
+0x95E7 U+6155 # <cjk>
+0x95E8 U+620A # <cjk>
+0x95E9 U+66AE # <cjk>
+0x95EA U+6BCD # <cjk>
+0x95EB U+7C3F # <cjk>
+0x95EC U+83E9 # <cjk>
+0x95ED U+5023 # <cjk>
+0x95EE U+4FF8 # <cjk>
+0x95EF U+5305 # <cjk>
+0x95F0 U+5446 # <cjk>
+0x95F1 U+5831 # <cjk>
+0x95F2 U+5949 # <cjk>
+0x95F3 U+5B9D # <cjk>
+0x95F4 U+5CF0 # <cjk>
+0x95F5 U+5CEF # <cjk>
+0x95F6 U+5D29 # <cjk>
+0x95F7 U+5E96 # <cjk>
+0x95F8 U+62B1 # <cjk>
+0x95F9 U+6367 # <cjk>
+0x95FA U+653E # <cjk>
+0x95FB U+65B9 # <cjk>
+0x95FC U+670B # <cjk>
+0x9640 U+6CD5 # <cjk>
+0x9641 U+6CE1 # <cjk>
+0x9642 U+70F9 # <cjk>
+0x9643 U+7832 # <cjk>
+0x9644 U+7E2B # <cjk>
+0x9645 U+80DE # <cjk>
+0x9646 U+82B3 # <cjk>
+0x9647 U+840C # <cjk>
+0x9648 U+84EC # <cjk>
+0x9649 U+8702 # <cjk>
+0x964A U+8912 # <cjk>
+0x964B U+8A2A # <cjk>
+0x964C U+8C4A # <cjk>
+0x964D U+90A6 # <cjk>
+0x964E U+92D2 # <cjk>
+0x964F U+98FD # <cjk>
+0x9650 U+9CF3 # <cjk>
+0x9651 U+9D6C # <cjk>
+0x9652 U+4E4F # <cjk>
+0x9653 U+4EA1 # <cjk>
+0x9654 U+508D # <cjk>
+0x9655 U+5256 # <cjk>
+0x9656 U+574A # <cjk>
+0x9657 U+59A8 # <cjk>
+0x9658 U+5E3D # <cjk>
+0x9659 U+5FD8 # <cjk>
+0x965A U+5FD9 # <cjk>
+0x965B U+623F # <cjk>
+0x965C U+66B4 # <cjk>
+0x965D U+671B # <cjk>
+0x965E U+67D0 # <cjk>
+0x965F U+68D2 # <cjk>
+0x9660 U+5192 # <cjk>
+0x9661 U+7D21 # <cjk>
+0x9662 U+80AA # <cjk>
+0x9663 U+81A8 # <cjk>
+0x9664 U+8B00 # <cjk>
+0x9665 U+8C8C # <cjk>
+0x9666 U+8CBF # <cjk>
+0x9667 U+927E # <cjk>
+0x9668 U+9632 # <cjk>
+0x9669 U+5420 # <cjk>
+0x966A U+982C # <cjk>
+0x966B U+5317 # <cjk>
+0x966C U+50D5 # <cjk>
+0x966D U+535C # <cjk>
+0x966E U+58A8 # <cjk>
+0x966F U+64B2 # <cjk>
+0x9670 U+6734 # <cjk>
+0x9671 U+7267 # <cjk>
+0x9672 U+7766 # <cjk>
+0x9673 U+7A46 # <cjk>
+0x9674 U+91E6 # <cjk>
+0x9675 U+52C3 # <cjk>
+0x9676 U+6CA1 # <cjk>
+0x9677 U+6B86 # <cjk>
+0x9678 U+5800 # <cjk>
+0x9679 U+5E4C # <cjk>
+0x967A U+5954 # <cjk>
+0x967B U+672C # <cjk>
+0x967C U+7FFB # <cjk>
+0x967D U+51E1 # <cjk>
+0x967E U+76C6 # <cjk>
+0x9680 U+6469 # <cjk>
+0x9681 U+78E8 # <cjk>
+0x9682 U+9B54 # <cjk>
+0x9683 U+9EBB # <cjk>
+0x9684 U+57CB # <cjk>
+0x9685 U+59B9 # <cjk>
+0x9686 U+6627 # <cjk>
+0x9687 U+679A # <cjk>
+0x9688 U+6BCE # <cjk>
+0x9689 U+54E9 # <cjk>
+0x968A U+69D9 # <cjk>
+0x968B U+5E55 # <cjk>
+0x968C U+819C # <cjk>
+0x968D U+6795 # <cjk>
+0x968E U+9BAA # <cjk>
+0x968F U+67FE # <cjk>
+0x9690 U+9C52 # <cjk>
+0x9691 U+685D # <cjk>
+0x9692 U+4EA6 # <cjk>
+0x9693 U+4FE3 # <cjk>
+0x9694 U+53C8 # <cjk>
+0x9695 U+62B9 # <cjk>
+0x9696 U+672B # <cjk>
+0x9697 U+6CAB # <cjk>
+0x9698 U+8FC4 # <cjk>
+0x9699 U+4FAD # <cjk>
+0x969A U+7E6D # <cjk>
+0x969B U+9EBF # <cjk>
+0x969C U+4E07 # <cjk>
+0x969D U+6162 # <cjk>
+0x969E U+6E80 # <cjk>
+0x969F U+6F2B # <cjk>
+0x96A0 U+8513 # <cjk>
+0x96A1 U+5473 # <cjk>
+0x96A2 U+672A # <cjk>
+0x96A3 U+9B45 # <cjk>
+0x96A4 U+5DF3 # <cjk>
+0x96A5 U+7B95 # <cjk>
+0x96A6 U+5CAC # <cjk>
+0x96A7 U+5BC6 # <cjk>
+0x96A8 U+871C # <cjk>
+0x96A9 U+6E4A # <cjk>
+0x96AA U+84D1 # <cjk>
+0x96AB U+7A14 # <cjk>
+0x96AC U+8108 # <cjk>
+0x96AD U+5999 # <cjk>
+0x96AE U+7C8D # <cjk>
+0x96AF U+6C11 # <cjk>
+0x96B0 U+7720 # <cjk>
+0x96B1 U+52D9 # <cjk>
+0x96B2 U+5922 # <cjk>
+0x96B3 U+7121 # <cjk>
+0x96B4 U+725F # <cjk>
+0x96B5 U+77DB # <cjk>
+0x96B6 U+9727 # <cjk>
+0x96B7 U+9D61 # <cjk>
+0x96B8 U+690B # <cjk>
+0x96B9 U+5A7F # <cjk>
+0x96BA U+5A18 # <cjk>
+0x96BB U+51A5 # <cjk>
+0x96BC U+540D # <cjk>
+0x96BD U+547D # <cjk>
+0x96BE U+660E # <cjk>
+0x96BF U+76DF # <cjk>
+0x96C0 U+8FF7 # <cjk>
+0x96C1 U+9298 # <cjk>
+0x96C2 U+9CF4 # <cjk>
+0x96C3 U+59EA # <cjk>
+0x96C4 U+725D # <cjk>
+0x96C5 U+6EC5 # <cjk>
+0x96C6 U+514D # <cjk>
+0x96C7 U+68C9 # <cjk>
+0x96C8 U+7DBF # <cjk>
+0x96C9 U+7DEC # <cjk>
+0x96CA U+9762 # <cjk>
+0x96CB U+9EBA # <cjk>
+0x96CC U+6478 # <cjk>
+0x96CD U+6A21 # <cjk>
+0x96CE U+8302 # <cjk>
+0x96CF U+5984 # <cjk>
+0x96D0 U+5B5F # <cjk>
+0x96D1 U+6BDB # <cjk>
+0x96D2 U+731B # <cjk>
+0x96D3 U+76F2 # <cjk>
+0x96D4 U+7DB2 # <cjk>
+0x96D5 U+8017 # <cjk>
+0x96D6 U+8499 # <cjk>
+0x96D7 U+5132 # <cjk>
+0x96D8 U+6728 # <cjk>
+0x96D9 U+9ED9 # <cjk>
+0x96DA U+76EE # <cjk>
+0x96DB U+6762 # <cjk>
+0x96DC U+52FF # <cjk>
+0x96DD U+9905 # <cjk>
+0x96DE U+5C24 # <cjk>
+0x96DF U+623B # <cjk>
+0x96E0 U+7C7E # <cjk>
+0x96E1 U+8CB0 # <cjk>
+0x96E2 U+554F # <cjk>
+0x96E3 U+60B6 # <cjk>
+0x96E4 U+7D0B # <cjk>
+0x96E5 U+9580 # <cjk>
+0x96E6 U+5301 # <cjk>
+0x96E7 U+4E5F # <cjk>
+0x96E8 U+51B6 # <cjk>
+0x96E9 U+591C # <cjk>
+0x96EA U+723A # <cjk>
+0x96EB U+8036 # <cjk>
+0x96EC U+91CE # <cjk>
+0x96ED U+5F25 # <cjk>
+0x96EE U+77E2 # <cjk>
+0x96EF U+5384 # <cjk>
+0x96F0 U+5F79 # <cjk>
+0x96F1 U+7D04 # <cjk>
+0x96F2 U+85AC # <cjk>
+0x96F3 U+8A33 # <cjk>
+0x96F4 U+8E8D # <cjk>
+0x96F5 U+9756 # <cjk>
+0x96F6 U+67F3 # <cjk>
+0x96F7 U+85AE # <cjk>
+0x96F8 U+9453 # <cjk>
+0x96F9 U+6109 # <cjk>
+0x96FA U+6108 # <cjk>
+0x96FB U+6CB9 # <cjk>
+0x96FC U+7652 # <cjk>
+0x9740 U+8AED # <cjk>
+0x9741 U+8F38 # <cjk>
+0x9742 U+552F # <cjk>
+0x9743 U+4F51 # <cjk>
+0x9744 U+512A # <cjk>
+0x9745 U+52C7 # <cjk>
+0x9746 U+53CB # <cjk>
+0x9747 U+5BA5 # <cjk>
+0x9748 U+5E7D # <cjk>
+0x9749 U+60A0 # <cjk>
+0x974A U+6182 # <cjk>
+0x974B U+63D6 # <cjk>
+0x974C U+6709 # <cjk>
+0x974D U+67DA # <cjk>
+0x974E U+6E67 # <cjk>
+0x974F U+6D8C # <cjk>
+0x9750 U+7336 # <cjk>
+0x9751 U+7337 # <cjk>
+0x9752 U+7531 # <cjk>
+0x9753 U+7950 # <cjk>
+0x9754 U+88D5 # <cjk>
+0x9755 U+8A98 # <cjk>
+0x9756 U+904A # <cjk>
+0x9757 U+9091 # <cjk>
+0x9758 U+90F5 # <cjk>
+0x9759 U+96C4 # <cjk>
+0x975A U+878D # <cjk>
+0x975B U+5915 # <cjk>
+0x975C U+4E88 # <cjk>
+0x975D U+4F59 # <cjk>
+0x975E U+4E0E # <cjk>
+0x975F U+8A89 # <cjk>
+0x9760 U+8F3F # <cjk>
+0x9761 U+9810 # <cjk>
+0x9762 U+50AD # <cjk>
+0x9763 U+5E7C # <cjk>
+0x9764 U+5996 # <cjk>
+0x9765 U+5BB9 # <cjk>
+0x9766 U+5EB8 # <cjk>
+0x9767 U+63DA # <cjk>
+0x9768 U+63FA # <cjk>
+0x9769 U+64C1 # <cjk>
+0x976A U+66DC # <cjk>
+0x976B U+694A # <cjk>
+0x976C U+69D8 # <cjk>
+0x976D U+6D0B # <cjk>
+0x976E U+6EB6 # <cjk>
+0x976F U+7194 # <cjk>
+0x9770 U+7528 # <cjk>
+0x9771 U+7AAF # <cjk>
+0x9772 U+7F8A # <cjk>
+0x9773 U+8000 # <cjk>
+0x9774 U+8449 # <cjk>
+0x9775 U+84C9 # <cjk>
+0x9776 U+8981 # <cjk>
+0x9777 U+8B21 # <cjk>
+0x9778 U+8E0A # <cjk>
+0x9779 U+9065 # <cjk>
+0x977A U+967D # <cjk>
+0x977B U+990A # <cjk>
+0x977C U+617E # <cjk>
+0x977D U+6291 # <cjk>
+0x977E U+6B32 # <cjk>
+0x9780 U+6C83 # <cjk>
+0x9781 U+6D74 # <cjk>
+0x9782 U+7FCC # <cjk>
+0x9783 U+7FFC # <cjk>
+0x9784 U+6DC0 # <cjk>
+0x9785 U+7F85 # <cjk>
+0x9786 U+87BA # <cjk>
+0x9787 U+88F8 # <cjk>
+0x9788 U+6765 # <cjk>
+0x9789 U+83B1 # <cjk>
+0x978A U+983C # <cjk>
+0x978B U+96F7 # <cjk>
+0x978C U+6D1B # <cjk>
+0x978D U+7D61 # <cjk>
+0x978E U+843D # <cjk>
+0x978F U+916A # <cjk>
+0x9790 U+4E71 # <cjk>
+0x9791 U+5375 # <cjk>
+0x9792 U+5D50 # <cjk>
+0x9793 U+6B04 # <cjk>
+0x9794 U+6FEB # <cjk>
+0x9795 U+85CD # <cjk>
+0x9796 U+862D # <cjk>
+0x9797 U+89A7 # <cjk>
+0x9798 U+5229 # <cjk>
+0x9799 U+540F # <cjk>
+0x979A U+5C65 # <cjk>
+0x979B U+674E # <cjk>
+0x979C U+68A8 # <cjk>
+0x979D U+7406 # <cjk>
+0x979E U+7483 # <cjk>
+0x979F U+75E2 # <cjk>
+0x97A0 U+88CF # <cjk>
+0x97A1 U+88E1 # <cjk>
+0x97A2 U+91CC # <cjk>
+0x97A3 U+96E2 # <cjk>
+0x97A4 U+9678 # <cjk>
+0x97A5 U+5F8B # <cjk>
+0x97A6 U+7387 # <cjk>
+0x97A7 U+7ACB # <cjk>
+0x97A8 U+844E # <cjk>
+0x97A9 U+63A0 # <cjk>
+0x97AA U+7565 # <cjk>
+0x97AB U+5289 # <cjk>
+0x97AC U+6D41 # <cjk>
+0x97AD U+6E9C # <cjk>
+0x97AE U+7409 # <cjk>
+0x97AF U+7559 # <cjk>
+0x97B0 U+786B # <cjk>
+0x97B1 U+7C92 # <cjk>
+0x97B2 U+9686 # <cjk>
+0x97B3 U+7ADC # <cjk>
+0x97B4 U+9F8D # <cjk>
+0x97B5 U+4FB6 # <cjk>
+0x97B6 U+616E # <cjk>
+0x97B7 U+65C5 # <cjk>
+0x97B8 U+865C # <cjk>
+0x97B9 U+4E86 # <cjk>
+0x97BA U+4EAE # <cjk>
+0x97BB U+50DA # <cjk>
+0x97BC U+4E21 # <cjk>
+0x97BD U+51CC # <cjk>
+0x97BE U+5BEE # <cjk>
+0x97BF U+6599 # <cjk>
+0x97C0 U+6881 # <cjk>
+0x97C1 U+6DBC # <cjk>
+0x97C2 U+731F # <cjk>
+0x97C3 U+7642 # <cjk>
+0x97C4 U+77AD # <cjk>
+0x97C5 U+7A1C # <cjk>
+0x97C6 U+7CE7 # <cjk>
+0x97C7 U+826F # <cjk>
+0x97C8 U+8AD2 # <cjk>
+0x97C9 U+907C # <cjk>
+0x97CA U+91CF # <cjk>
+0x97CB U+9675 # <cjk>
+0x97CC U+9818 # <cjk>
+0x97CD U+529B # <cjk>
+0x97CE U+7DD1 # <cjk>
+0x97CF U+502B # <cjk>
+0x97D0 U+5398 # <cjk>
+0x97D1 U+6797 # <cjk>
+0x97D2 U+6DCB # <cjk>
+0x97D3 U+71D0 # <cjk>
+0x97D4 U+7433 # <cjk>
+0x97D5 U+81E8 # <cjk>
+0x97D6 U+8F2A # <cjk>
+0x97D7 U+96A3 # <cjk>
+0x97D8 U+9C57 # <cjk>
+0x97D9 U+9E9F # <cjk>
+0x97DA U+7460 # <cjk>
+0x97DB U+5841 # <cjk>
+0x97DC U+6D99 # <cjk>
+0x97DD U+7D2F # <cjk>
+0x97DE U+985E # <cjk>
+0x97DF U+4EE4 # <cjk>
+0x97E0 U+4F36 # <cjk>
+0x97E1 U+4F8B # <cjk>
+0x97E2 U+51B7 # <cjk>
+0x97E3 U+52B1 # <cjk>
+0x97E4 U+5DBA # <cjk>
+0x97E5 U+601C # <cjk>
+0x97E6 U+73B2 # <cjk>
+0x97E7 U+793C # <cjk>
+0x97E8 U+82D3 # <cjk>
+0x97E9 U+9234 # <cjk>
+0x97EA U+96B7 # <cjk>
+0x97EB U+96F6 # <cjk>
+0x97EC U+970A # <cjk>
+0x97ED U+9E97 # <cjk>
+0x97EE U+9F62 # <cjk>
+0x97EF U+66A6 # <cjk>
+0x97F0 U+6B74 # <cjk>
+0x97F1 U+5217 # <cjk>
+0x97F2 U+52A3 # <cjk>
+0x97F3 U+70C8 # <cjk>
+0x97F4 U+88C2 # <cjk>
+0x97F5 U+5EC9 # <cjk>
+0x97F6 U+604B # <cjk>
+0x97F7 U+6190 # <cjk>
+0x97F8 U+6F23 # <cjk>
+0x97F9 U+7149 # <cjk>
+0x97FA U+7C3E # <cjk>
+0x97FB U+7DF4 # <cjk>
+0x97FC U+806F # <cjk>
+0x9840 U+84EE # <cjk>
+0x9841 U+9023 # <cjk>
+0x9842 U+932C # <cjk>
+0x9843 U+5442 # <cjk>
+0x9844 U+9B6F # <cjk>
+0x9845 U+6AD3 # <cjk>
+0x9846 U+7089 # <cjk>
+0x9847 U+8CC2 # <cjk>
+0x9848 U+8DEF # <cjk>
+0x9849 U+9732 # <cjk>
+0x984A U+52B4 # <cjk>
+0x984B U+5A41 # <cjk>
+0x984C U+5ECA # <cjk>
+0x984D U+5F04 # <cjk>
+0x984E U+6717 # <cjk>
+0x984F U+697C # <cjk>
+0x9850 U+6994 # <cjk>
+0x9851 U+6D6A # <cjk>
+0x9852 U+6F0F # <cjk>
+0x9853 U+7262 # <cjk>
+0x9854 U+72FC # <cjk>
+0x9855 U+7BED # <cjk>
+0x9856 U+8001 # <cjk>
+0x9857 U+807E # <cjk>
+0x9858 U+874B # <cjk>
+0x9859 U+90CE # <cjk>
+0x985A U+516D # <cjk>
+0x985B U+9E93 # <cjk>
+0x985C U+7984 # <cjk>
+0x985D U+808B # <cjk>
+0x985E U+9332 # <cjk>
+0x985F U+8AD6 # <cjk>
+0x9860 U+502D # <cjk>
+0x9861 U+548C # <cjk>
+0x9862 U+8A71 # <cjk>
+0x9863 U+6B6A # <cjk>
+0x9864 U+8CC4 # <cjk>
+0x9865 U+8107 # <cjk>
+0x9866 U+60D1 # <cjk>
+0x9867 U+67A0 # <cjk>
+0x9868 U+9DF2 # <cjk>
+0x9869 U+4E99 # <cjk>
+0x986A U+4E98 # <cjk>
+0x986B U+9C10 # <cjk>
+0x986C U+8A6B # <cjk>
+0x986D U+85C1 # <cjk>
+0x986E U+8568 # <cjk>
+0x986F U+6900 # <cjk>
+0x9870 U+6E7E # <cjk>
+0x9871 U+7897 # <cjk>
+0x9872 U+8155 # <cjk>
+0x9873 U+20B9F # <cjk> [2004] [Unicode3.1]
+0x9874 U+5B41 # <cjk> [2000]
+0x9875 U+5B56 # <cjk> [2000]
+0x9876 U+5B7D # <cjk> [2000]
+0x9877 U+5B93 # <cjk> [2000]
+0x9878 U+5BD8 # <cjk> [2000]
+0x9879 U+5BEC # <cjk> [2000]
+0x987A U+5C12 # <cjk> [2000]
+0x987B U+5C1E # <cjk> [2000]
+0x987C U+5C23 # <cjk> [2000]
+0x987D U+5C2B # <cjk> [2000]
+0x987E U+378D # <cjk> [2000]
+0x9880 U+5C62 # <cjk> [2000]
+0x9881 U+FA3B # CJK COMPATIBILITY IDEOGRAPH-FA3B [2000] [Unicode3.2]
+0x9882 U+FA3C # CJK COMPATIBILITY IDEOGRAPH-FA3C [2000] [Unicode3.2]
+0x9883 U+216B4 # <cjk> [2000] [Unicode3.1]
+0x9884 U+5C7A # <cjk> [2000]
+0x9885 U+5C8F # <cjk> [2000]
+0x9886 U+5C9F # <cjk> [2000]
+0x9887 U+5CA3 # <cjk> [2000]
+0x9888 U+5CAA # <cjk> [2000]
+0x9889 U+5CBA # <cjk> [2000]
+0x988A U+5CCB # <cjk> [2000]
+0x988B U+5CD0 # <cjk> [2000]
+0x988C U+5CD2 # <cjk> [2000]
+0x988D U+5CF4 # <cjk> [2000]
+0x988E U+21E34 # <cjk> [2000] [Unicode3.1]
+0x988F U+37E2 # <cjk> [2000]
+0x9890 U+5D0D # <cjk> [2000]
+0x9891 U+5D27 # <cjk> [2000]
+0x9892 U+FA11 # CJK COMPATIBILITY IDEOGRAPH-FA11 [2000]
+0x9893 U+5D46 # <cjk> [2000]
+0x9894 U+5D47 # <cjk> [2000]
+0x9895 U+5D53 # <cjk> [2000]
+0x9896 U+5D4A # <cjk> [2000]
+0x9897 U+5D6D # <cjk> [2000]
+0x9898 U+5D81 # <cjk> [2000]
+0x9899 U+5DA0 # <cjk> [2000]
+0x989A U+5DA4 # <cjk> [2000]
+0x989B U+5DA7 # <cjk> [2000]
+0x989C U+5DB8 # <cjk> [2000]
+0x989D U+5DCB # <cjk> [2000]
+0x989E U+541E # <cjk> [2004]
+0x989F U+5F0C # <cjk>
+0x98A0 U+4E10 # <cjk>
+0x98A1 U+4E15 # <cjk>
+0x98A2 U+4E2A # <cjk>
+0x98A3 U+4E31 # <cjk>
+0x98A4 U+4E36 # <cjk>
+0x98A5 U+4E3C # <cjk>
+0x98A6 U+4E3F # <cjk>
+0x98A7 U+4E42 # <cjk>
+0x98A8 U+4E56 # <cjk>
+0x98A9 U+4E58 # <cjk>
+0x98AA U+4E82 # <cjk>
+0x98AB U+4E85 # <cjk>
+0x98AC U+8C6B # <cjk>
+0x98AD U+4E8A # <cjk>
+0x98AE U+8212 # <cjk>
+0x98AF U+5F0D # <cjk>
+0x98B0 U+4E8E # <cjk>
+0x98B1 U+4E9E # <cjk>
+0x98B2 U+4E9F # <cjk>
+0x98B3 U+4EA0 # <cjk>
+0x98B4 U+4EA2 # <cjk>
+0x98B5 U+4EB0 # <cjk>
+0x98B6 U+4EB3 # <cjk>
+0x98B7 U+4EB6 # <cjk>
+0x98B8 U+4ECE # <cjk>
+0x98B9 U+4ECD # <cjk>
+0x98BA U+4EC4 # <cjk>
+0x98BB U+4EC6 # <cjk>
+0x98BC U+4EC2 # <cjk>
+0x98BD U+4ED7 # <cjk>
+0x98BE U+4EDE # <cjk>
+0x98BF U+4EED # <cjk>
+0x98C0 U+4EDF # <cjk>
+0x98C1 U+4EF7 # <cjk>
+0x98C2 U+4F09 # <cjk>
+0x98C3 U+4F5A # <cjk>
+0x98C4 U+4F30 # <cjk>
+0x98C5 U+4F5B # <cjk>
+0x98C6 U+4F5D # <cjk>
+0x98C7 U+4F57 # <cjk>
+0x98C8 U+4F47 # <cjk>
+0x98C9 U+4F76 # <cjk>
+0x98CA U+4F88 # <cjk>
+0x98CB U+4F8F # <cjk>
+0x98CC U+4F98 # <cjk>
+0x98CD U+4F7B # <cjk>
+0x98CE U+4F69 # <cjk>
+0x98CF U+4F70 # <cjk>
+0x98D0 U+4F91 # <cjk>
+0x98D1 U+4F6F # <cjk>
+0x98D2 U+4F86 # <cjk>
+0x98D3 U+4F96 # <cjk>
+0x98D4 U+5118 # <cjk>
+0x98D5 U+4FD4 # <cjk>
+0x98D6 U+4FDF # <cjk>
+0x98D7 U+4FCE # <cjk>
+0x98D8 U+4FD8 # <cjk>
+0x98D9 U+4FDB # <cjk>
+0x98DA U+4FD1 # <cjk>
+0x98DB U+4FDA # <cjk>
+0x98DC U+4FD0 # <cjk>
+0x98DD U+4FE4 # <cjk>
+0x98DE U+4FE5 # <cjk>
+0x98DF U+501A # <cjk>
+0x98E0 U+5028 # <cjk>
+0x98E1 U+5014 # <cjk>
+0x98E2 U+502A # <cjk>
+0x98E3 U+5025 # <cjk>
+0x98E4 U+5005 # <cjk>
+0x98E5 U+4F1C # <cjk>
+0x98E6 U+4FF6 # <cjk>
+0x98E7 U+5021 # <cjk>
+0x98E8 U+5029 # <cjk>
+0x98E9 U+502C # <cjk>
+0x98EA U+4FFE # <cjk>
+0x98EB U+4FEF # <cjk>
+0x98EC U+5011 # <cjk>
+0x98ED U+5006 # <cjk>
+0x98EE U+5043 # <cjk>
+0x98EF U+5047 # <cjk>
+0x98F0 U+6703 # <cjk>
+0x98F1 U+5055 # <cjk>
+0x98F2 U+5050 # <cjk>
+0x98F3 U+5048 # <cjk>
+0x98F4 U+505A # <cjk>
+0x98F5 U+5056 # <cjk>
+0x98F6 U+506C # <cjk>
+0x98F7 U+5078 # <cjk>
+0x98F8 U+5080 # <cjk>
+0x98F9 U+509A # <cjk>
+0x98FA U+5085 # <cjk>
+0x98FB U+50B4 # <cjk>
+0x98FC U+50B2 # <cjk>
+0x9940 U+50C9 # <cjk>
+0x9941 U+50CA # <cjk>
+0x9942 U+50B3 # <cjk>
+0x9943 U+50C2 # <cjk>
+0x9944 U+50D6 # <cjk>
+0x9945 U+50DE # <cjk>
+0x9946 U+50E5 # <cjk>
+0x9947 U+50ED # <cjk>
+0x9948 U+50E3 # <cjk>
+0x9949 U+50EE # <cjk>
+0x994A U+50F9 # <cjk>
+0x994B U+50F5 # <cjk>
+0x994C U+5109 # <cjk>
+0x994D U+5101 # <cjk>
+0x994E U+5102 # <cjk>
+0x994F U+5116 # <cjk>
+0x9950 U+5115 # <cjk>
+0x9951 U+5114 # <cjk>
+0x9952 U+511A # <cjk>
+0x9953 U+5121 # <cjk>
+0x9954 U+513A # <cjk>
+0x9955 U+5137 # <cjk>
+0x9956 U+513C # <cjk>
+0x9957 U+513B # <cjk>
+0x9958 U+513F # <cjk>
+0x9959 U+5140 # <cjk>
+0x995A U+5152 # <cjk>
+0x995B U+514C # <cjk>
+0x995C U+5154 # <cjk>
+0x995D U+5162 # <cjk>
+0x995E U+7AF8 # <cjk>
+0x995F U+5169 # <cjk>
+0x9960 U+516A # <cjk>
+0x9961 U+516E # <cjk>
+0x9962 U+5180 # <cjk>
+0x9963 U+5182 # <cjk>
+0x9964 U+56D8 # <cjk>
+0x9965 U+518C # <cjk>
+0x9966 U+5189 # <cjk>
+0x9967 U+518F # <cjk>
+0x9968 U+5191 # <cjk>
+0x9969 U+5193 # <cjk>
+0x996A U+5195 # <cjk>
+0x996B U+5196 # <cjk>
+0x996C U+51A4 # <cjk>
+0x996D U+51A6 # <cjk>
+0x996E U+51A2 # <cjk>
+0x996F U+51A9 # <cjk>
+0x9970 U+51AA # <cjk>
+0x9971 U+51AB # <cjk>
+0x9972 U+51B3 # <cjk>
+0x9973 U+51B1 # <cjk>
+0x9974 U+51B2 # <cjk>
+0x9975 U+51B0 # <cjk>
+0x9976 U+51B5 # <cjk>
+0x9977 U+51BD # <cjk>
+0x9978 U+51C5 # <cjk>
+0x9979 U+51C9 # <cjk>
+0x997A U+51DB # <cjk>
+0x997B U+51E0 # <cjk>
+0x997C U+8655 # <cjk>
+0x997D U+51E9 # <cjk>
+0x997E U+51ED # <cjk>
+0x9980 U+51F0 # <cjk>
+0x9981 U+51F5 # <cjk>
+0x9982 U+51FE # <cjk>
+0x9983 U+5204 # <cjk>
+0x9984 U+520B # <cjk>
+0x9985 U+5214 # <cjk>
+0x9986 U+520E # <cjk>
+0x9987 U+5227 # <cjk>
+0x9988 U+522A # <cjk>
+0x9989 U+522E # <cjk>
+0x998A U+5233 # <cjk>
+0x998B U+5239 # <cjk>
+0x998C U+524F # <cjk>
+0x998D U+5244 # <cjk>
+0x998E U+524B # <cjk>
+0x998F U+524C # <cjk>
+0x9990 U+525E # <cjk>
+0x9991 U+5254 # <cjk>
+0x9992 U+526A # <cjk>
+0x9993 U+5274 # <cjk>
+0x9994 U+5269 # <cjk>
+0x9995 U+5273 # <cjk>
+0x9996 U+527F # <cjk>
+0x9997 U+527D # <cjk>
+0x9998 U+528D # <cjk>
+0x9999 U+5294 # <cjk>
+0x999A U+5292 # <cjk>
+0x999B U+5271 # <cjk>
+0x999C U+5288 # <cjk>
+0x999D U+5291 # <cjk>
+0x999E U+8FA8 # <cjk>
+0x999F U+8FA7 # <cjk>
+0x99A0 U+52AC # <cjk>
+0x99A1 U+52AD # <cjk>
+0x99A2 U+52BC # <cjk>
+0x99A3 U+52B5 # <cjk>
+0x99A4 U+52C1 # <cjk>
+0x99A5 U+52CD # <cjk>
+0x99A6 U+52D7 # <cjk>
+0x99A7 U+52DE # <cjk>
+0x99A8 U+52E3 # <cjk>
+0x99A9 U+52E6 # <cjk>
+0x99AA U+98ED # <cjk>
+0x99AB U+52E0 # <cjk>
+0x99AC U+52F3 # <cjk>
+0x99AD U+52F5 # <cjk>
+0x99AE U+52F8 # <cjk>
+0x99AF U+52F9 # <cjk>
+0x99B0 U+5306 # <cjk>
+0x99B1 U+5308 # <cjk>
+0x99B2 U+7538 # <cjk>
+0x99B3 U+530D # <cjk>
+0x99B4 U+5310 # <cjk>
+0x99B5 U+530F # <cjk>
+0x99B6 U+5315 # <cjk>
+0x99B7 U+531A # <cjk>
+0x99B8 U+5323 # <cjk>
+0x99B9 U+532F # <cjk>
+0x99BA U+5331 # <cjk>
+0x99BB U+5333 # <cjk>
+0x99BC U+5338 # <cjk>
+0x99BD U+5340 # <cjk>
+0x99BE U+5346 # <cjk>
+0x99BF U+5345 # <cjk>
+0x99C0 U+4E17 # <cjk>
+0x99C1 U+5349 # <cjk>
+0x99C2 U+534D # <cjk>
+0x99C3 U+51D6 # <cjk>
+0x99C4 U+535E # <cjk>
+0x99C5 U+5369 # <cjk>
+0x99C6 U+536E # <cjk>
+0x99C7 U+5918 # <cjk>
+0x99C8 U+537B # <cjk>
+0x99C9 U+5377 # <cjk>
+0x99CA U+5382 # <cjk>
+0x99CB U+5396 # <cjk>
+0x99CC U+53A0 # <cjk>
+0x99CD U+53A6 # <cjk>
+0x99CE U+53A5 # <cjk>
+0x99CF U+53AE # <cjk>
+0x99D0 U+53B0 # <cjk>
+0x99D1 U+53B6 # <cjk>
+0x99D2 U+53C3 # <cjk>
+0x99D3 U+7C12 # <cjk>
+0x99D4 U+96D9 # <cjk>
+0x99D5 U+53DF # <cjk>
+0x99D6 U+66FC # <cjk>
+0x99D7 U+71EE # <cjk>
+0x99D8 U+53EE # <cjk>
+0x99D9 U+53E8 # <cjk>
+0x99DA U+53ED # <cjk>
+0x99DB U+53FA # <cjk>
+0x99DC U+5401 # <cjk>
+0x99DD U+543D # <cjk>
+0x99DE U+5440 # <cjk>
+0x99DF U+542C # <cjk>
+0x99E0 U+542D # <cjk>
+0x99E1 U+543C # <cjk>
+0x99E2 U+542E # <cjk>
+0x99E3 U+5436 # <cjk>
+0x99E4 U+5429 # <cjk>
+0x99E5 U+541D # <cjk>
+0x99E6 U+544E # <cjk>
+0x99E7 U+548F # <cjk>
+0x99E8 U+5475 # <cjk>
+0x99E9 U+548E # <cjk>
+0x99EA U+545F # <cjk>
+0x99EB U+5471 # <cjk>
+0x99EC U+5477 # <cjk>
+0x99ED U+5470 # <cjk>
+0x99EE U+5492 # <cjk>
+0x99EF U+547B # <cjk>
+0x99F0 U+5480 # <cjk>
+0x99F1 U+5476 # <cjk>
+0x99F2 U+5484 # <cjk>
+0x99F3 U+5490 # <cjk>
+0x99F4 U+5486 # <cjk>
+0x99F5 U+54C7 # <cjk>
+0x99F6 U+54A2 # <cjk>
+0x99F7 U+54B8 # <cjk>
+0x99F8 U+54A5 # <cjk>
+0x99F9 U+54AC # <cjk>
+0x99FA U+54C4 # <cjk>
+0x99FB U+54C8 # <cjk>
+0x99FC U+54A8 # <cjk>
+0x9A40 U+54AB # <cjk>
+0x9A41 U+54C2 # <cjk>
+0x9A42 U+54A4 # <cjk>
+0x9A43 U+54BE # <cjk>
+0x9A44 U+54BC # <cjk>
+0x9A45 U+54D8 # <cjk>
+0x9A46 U+54E5 # <cjk>
+0x9A47 U+54E6 # <cjk>
+0x9A48 U+550F # <cjk>
+0x9A49 U+5514 # <cjk>
+0x9A4A U+54FD # <cjk>
+0x9A4B U+54EE # <cjk>
+0x9A4C U+54ED # <cjk>
+0x9A4D U+54FA # <cjk>
+0x9A4E U+54E2 # <cjk>
+0x9A4F U+5539 # <cjk>
+0x9A50 U+5540 # <cjk>
+0x9A51 U+5563 # <cjk>
+0x9A52 U+554C # <cjk>
+0x9A53 U+552E # <cjk>
+0x9A54 U+555C # <cjk>
+0x9A55 U+5545 # <cjk>
+0x9A56 U+5556 # <cjk>
+0x9A57 U+5557 # <cjk>
+0x9A58 U+5538 # <cjk>
+0x9A59 U+5533 # <cjk>
+0x9A5A U+555D # <cjk>
+0x9A5B U+5599 # <cjk>
+0x9A5C U+5580 # <cjk>
+0x9A5D U+54AF # <cjk>
+0x9A5E U+558A # <cjk>
+0x9A5F U+559F # <cjk>
+0x9A60 U+557B # <cjk>
+0x9A61 U+557E # <cjk>
+0x9A62 U+5598 # <cjk>
+0x9A63 U+559E # <cjk>
+0x9A64 U+55AE # <cjk>
+0x9A65 U+557C # <cjk>
+0x9A66 U+5583 # <cjk>
+0x9A67 U+55A9 # <cjk>
+0x9A68 U+5587 # <cjk>
+0x9A69 U+55A8 # <cjk>
+0x9A6A U+55DA # <cjk>
+0x9A6B U+55C5 # <cjk>
+0x9A6C U+55DF # <cjk>
+0x9A6D U+55C4 # <cjk>
+0x9A6E U+55DC # <cjk>
+0x9A6F U+55E4 # <cjk>
+0x9A70 U+55D4 # <cjk>
+0x9A71 U+5614 # <cjk>
+0x9A72 U+55F7 # <cjk>
+0x9A73 U+5616 # <cjk>
+0x9A74 U+55FE # <cjk>
+0x9A75 U+55FD # <cjk>
+0x9A76 U+561B # <cjk>
+0x9A77 U+55F9 # <cjk>
+0x9A78 U+564E # <cjk>
+0x9A79 U+5650 # <cjk>
+0x9A7A U+71DF # <cjk>
+0x9A7B U+5634 # <cjk>
+0x9A7C U+5636 # <cjk>
+0x9A7D U+5632 # <cjk>
+0x9A7E U+5638 # <cjk>
+0x9A80 U+566B # <cjk>
+0x9A81 U+5664 # <cjk>
+0x9A82 U+562F # <cjk>
+0x9A83 U+566C # <cjk>
+0x9A84 U+566A # <cjk>
+0x9A85 U+5686 # <cjk>
+0x9A86 U+5680 # <cjk>
+0x9A87 U+568A # <cjk>
+0x9A88 U+56A0 # <cjk>
+0x9A89 U+5694 # <cjk>
+0x9A8A U+568F # <cjk>
+0x9A8B U+56A5 # <cjk>
+0x9A8C U+56AE # <cjk>
+0x9A8D U+56B6 # <cjk>
+0x9A8E U+56B4 # <cjk>
+0x9A8F U+56C2 # <cjk>
+0x9A90 U+56BC # <cjk>
+0x9A91 U+56C1 # <cjk>
+0x9A92 U+56C3 # <cjk>
+0x9A93 U+56C0 # <cjk>
+0x9A94 U+56C8 # <cjk>
+0x9A95 U+56CE # <cjk>
+0x9A96 U+56D1 # <cjk>
+0x9A97 U+56D3 # <cjk>
+0x9A98 U+56D7 # <cjk>
+0x9A99 U+56EE # <cjk>
+0x9A9A U+56F9 # <cjk>
+0x9A9B U+5700 # <cjk>
+0x9A9C U+56FF # <cjk>
+0x9A9D U+5704 # <cjk>
+0x9A9E U+5709 # <cjk>
+0x9A9F U+5708 # <cjk>
+0x9AA0 U+570B # <cjk>
+0x9AA1 U+570D # <cjk>
+0x9AA2 U+5713 # <cjk>
+0x9AA3 U+5718 # <cjk>
+0x9AA4 U+5716 # <cjk>
+0x9AA5 U+55C7 # <cjk>
+0x9AA6 U+571C # <cjk>
+0x9AA7 U+5726 # <cjk>
+0x9AA8 U+5737 # <cjk>
+0x9AA9 U+5738 # <cjk>
+0x9AAA U+574E # <cjk>
+0x9AAB U+573B # <cjk>
+0x9AAC U+5740 # <cjk>
+0x9AAD U+574F # <cjk>
+0x9AAE U+5769 # <cjk>
+0x9AAF U+57C0 # <cjk>
+0x9AB0 U+5788 # <cjk>
+0x9AB1 U+5761 # <cjk>
+0x9AB2 U+577F # <cjk>
+0x9AB3 U+5789 # <cjk>
+0x9AB4 U+5793 # <cjk>
+0x9AB5 U+57A0 # <cjk>
+0x9AB6 U+57B3 # <cjk>
+0x9AB7 U+57A4 # <cjk>
+0x9AB8 U+57AA # <cjk>
+0x9AB9 U+57B0 # <cjk>
+0x9ABA U+57C3 # <cjk>
+0x9ABB U+57C6 # <cjk>
+0x9ABC U+57D4 # <cjk>
+0x9ABD U+57D2 # <cjk>
+0x9ABE U+57D3 # <cjk>
+0x9ABF U+580A # <cjk>
+0x9AC0 U+57D6 # <cjk>
+0x9AC1 U+57E3 # <cjk>
+0x9AC2 U+580B # <cjk>
+0x9AC3 U+5819 # <cjk>
+0x9AC4 U+581D # <cjk>
+0x9AC5 U+5872 # <cjk>
+0x9AC6 U+5821 # <cjk>
+0x9AC7 U+5862 # <cjk>
+0x9AC8 U+584B # <cjk>
+0x9AC9 U+5870 # <cjk>
+0x9ACA U+6BC0 # <cjk>
+0x9ACB U+5852 # <cjk>
+0x9ACC U+583D # <cjk>
+0x9ACD U+5879 # <cjk>
+0x9ACE U+5885 # <cjk>
+0x9ACF U+58B9 # <cjk>
+0x9AD0 U+589F # <cjk>
+0x9AD1 U+58AB # <cjk>
+0x9AD2 U+58BA # <cjk>
+0x9AD3 U+58DE # <cjk>
+0x9AD4 U+58BB # <cjk>
+0x9AD5 U+58B8 # <cjk>
+0x9AD6 U+58AE # <cjk>
+0x9AD7 U+58C5 # <cjk>
+0x9AD8 U+58D3 # <cjk>
+0x9AD9 U+58D1 # <cjk>
+0x9ADA U+58D7 # <cjk>
+0x9ADB U+58D9 # <cjk>
+0x9ADC U+58D8 # <cjk>
+0x9ADD U+58E5 # <cjk>
+0x9ADE U+58DC # <cjk>
+0x9ADF U+58E4 # <cjk>
+0x9AE0 U+58DF # <cjk>
+0x9AE1 U+58EF # <cjk>
+0x9AE2 U+58FA # <cjk>
+0x9AE3 U+58F9 # <cjk>
+0x9AE4 U+58FB # <cjk>
+0x9AE5 U+58FC # <cjk>
+0x9AE6 U+58FD # <cjk>
+0x9AE7 U+5902 # <cjk>
+0x9AE8 U+590A # <cjk>
+0x9AE9 U+5910 # <cjk>
+0x9AEA U+591B # <cjk>
+0x9AEB U+68A6 # <cjk>
+0x9AEC U+5925 # <cjk>
+0x9AED U+592C # <cjk>
+0x9AEE U+592D # <cjk>
+0x9AEF U+5932 # <cjk>
+0x9AF0 U+5938 # <cjk>
+0x9AF1 U+593E # <cjk>
+0x9AF2 U+7AD2 # <cjk>
+0x9AF3 U+5955 # <cjk>
+0x9AF4 U+5950 # <cjk>
+0x9AF5 U+594E # <cjk>
+0x9AF6 U+595A # <cjk>
+0x9AF7 U+5958 # <cjk>
+0x9AF8 U+5962 # <cjk>
+0x9AF9 U+5960 # <cjk>
+0x9AFA U+5967 # <cjk>
+0x9AFB U+596C # <cjk>
+0x9AFC U+5969 # <cjk>
+0x9B40 U+5978 # <cjk>
+0x9B41 U+5981 # <cjk>
+0x9B42 U+599D # <cjk>
+0x9B43 U+4F5E # <cjk>
+0x9B44 U+4FAB # <cjk>
+0x9B45 U+59A3 # <cjk>
+0x9B46 U+59B2 # <cjk>
+0x9B47 U+59C6 # <cjk>
+0x9B48 U+59E8 # <cjk>
+0x9B49 U+59DC # <cjk>
+0x9B4A U+598D # <cjk>
+0x9B4B U+59D9 # <cjk>
+0x9B4C U+59DA # <cjk>
+0x9B4D U+5A25 # <cjk>
+0x9B4E U+5A1F # <cjk>
+0x9B4F U+5A11 # <cjk>
+0x9B50 U+5A1C # <cjk>
+0x9B51 U+5A09 # <cjk>
+0x9B52 U+5A1A # <cjk>
+0x9B53 U+5A40 # <cjk>
+0x9B54 U+5A6C # <cjk>
+0x9B55 U+5A49 # <cjk>
+0x9B56 U+5A35 # <cjk>
+0x9B57 U+5A36 # <cjk>
+0x9B58 U+5A62 # <cjk>
+0x9B59 U+5A6A # <cjk>
+0x9B5A U+5A9A # <cjk>
+0x9B5B U+5ABC # <cjk>
+0x9B5C U+5ABE # <cjk>
+0x9B5D U+5ACB # <cjk>
+0x9B5E U+5AC2 # <cjk>
+0x9B5F U+5ABD # <cjk>
+0x9B60 U+5AE3 # <cjk>
+0x9B61 U+5AD7 # <cjk>
+0x9B62 U+5AE6 # <cjk>
+0x9B63 U+5AE9 # <cjk>
+0x9B64 U+5AD6 # <cjk>
+0x9B65 U+5AFA # <cjk>
+0x9B66 U+5AFB # <cjk>
+0x9B67 U+5B0C # <cjk>
+0x9B68 U+5B0B # <cjk>
+0x9B69 U+5B16 # <cjk>
+0x9B6A U+5B32 # <cjk>
+0x9B6B U+5AD0 # <cjk>
+0x9B6C U+5B2A # <cjk>
+0x9B6D U+5B36 # <cjk>
+0x9B6E U+5B3E # <cjk>
+0x9B6F U+5B43 # <cjk>
+0x9B70 U+5B45 # <cjk>
+0x9B71 U+5B40 # <cjk>
+0x9B72 U+5B51 # <cjk>
+0x9B73 U+5B55 # <cjk>
+0x9B74 U+5B5A # <cjk>
+0x9B75 U+5B5B # <cjk>
+0x9B76 U+5B65 # <cjk>
+0x9B77 U+5B69 # <cjk>
+0x9B78 U+5B70 # <cjk>
+0x9B79 U+5B73 # <cjk>
+0x9B7A U+5B75 # <cjk>
+0x9B7B U+5B78 # <cjk>
+0x9B7C U+6588 # <cjk>
+0x9B7D U+5B7A # <cjk>
+0x9B7E U+5B80 # <cjk>
+0x9B80 U+5B83 # <cjk>
+0x9B81 U+5BA6 # <cjk>
+0x9B82 U+5BB8 # <cjk>
+0x9B83 U+5BC3 # <cjk>
+0x9B84 U+5BC7 # <cjk>
+0x9B85 U+5BC9 # <cjk>
+0x9B86 U+5BD4 # <cjk>
+0x9B87 U+5BD0 # <cjk>
+0x9B88 U+5BE4 # <cjk>
+0x9B89 U+5BE6 # <cjk>
+0x9B8A U+5BE2 # <cjk>
+0x9B8B U+5BDE # <cjk>
+0x9B8C U+5BE5 # <cjk>
+0x9B8D U+5BEB # <cjk>
+0x9B8E U+5BF0 # <cjk>
+0x9B8F U+5BF6 # <cjk>
+0x9B90 U+5BF3 # <cjk>
+0x9B91 U+5C05 # <cjk>
+0x9B92 U+5C07 # <cjk>
+0x9B93 U+5C08 # <cjk>
+0x9B94 U+5C0D # <cjk>
+0x9B95 U+5C13 # <cjk>
+0x9B96 U+5C20 # <cjk>
+0x9B97 U+5C22 # <cjk>
+0x9B98 U+5C28 # <cjk>
+0x9B99 U+5C38 # <cjk>
+0x9B9A U+5C39 # <cjk>
+0x9B9B U+5C41 # <cjk>
+0x9B9C U+5C46 # <cjk>
+0x9B9D U+5C4E # <cjk>
+0x9B9E U+5C53 # <cjk>
+0x9B9F U+5C50 # <cjk>
+0x9BA0 U+5C4F # <cjk>
+0x9BA1 U+5B71 # <cjk>
+0x9BA2 U+5C6C # <cjk>
+0x9BA3 U+5C6E # <cjk>
+0x9BA4 U+4E62 # <cjk>
+0x9BA5 U+5C76 # <cjk>
+0x9BA6 U+5C79 # <cjk>
+0x9BA7 U+5C8C # <cjk>
+0x9BA8 U+5C91 # <cjk>
+0x9BA9 U+5C94 # <cjk>
+0x9BAA U+599B # <cjk>
+0x9BAB U+5CAB # <cjk>
+0x9BAC U+5CBB # <cjk>
+0x9BAD U+5CB6 # <cjk>
+0x9BAE U+5CBC # <cjk>
+0x9BAF U+5CB7 # <cjk>
+0x9BB0 U+5CC5 # <cjk>
+0x9BB1 U+5CBE # <cjk>
+0x9BB2 U+5CC7 # <cjk>
+0x9BB3 U+5CD9 # <cjk>
+0x9BB4 U+5CE9 # <cjk>
+0x9BB5 U+5CFD # <cjk>
+0x9BB6 U+5CFA # <cjk>
+0x9BB7 U+5CED # <cjk>
+0x9BB8 U+5D8C # <cjk>
+0x9BB9 U+5CEA # <cjk>
+0x9BBA U+5D0B # <cjk>
+0x9BBB U+5D15 # <cjk>
+0x9BBC U+5D17 # <cjk>
+0x9BBD U+5D5C # <cjk>
+0x9BBE U+5D1F # <cjk>
+0x9BBF U+5D1B # <cjk>
+0x9BC0 U+5D11 # <cjk>
+0x9BC1 U+5D14 # <cjk>
+0x9BC2 U+5D22 # <cjk>
+0x9BC3 U+5D1A # <cjk>
+0x9BC4 U+5D19 # <cjk>
+0x9BC5 U+5D18 # <cjk>
+0x9BC6 U+5D4C # <cjk>
+0x9BC7 U+5D52 # <cjk>
+0x9BC8 U+5D4E # <cjk>
+0x9BC9 U+5D4B # <cjk>
+0x9BCA U+5D6C # <cjk>
+0x9BCB U+5D73 # <cjk>
+0x9BCC U+5D76 # <cjk>
+0x9BCD U+5D87 # <cjk>
+0x9BCE U+5D84 # <cjk>
+0x9BCF U+5D82 # <cjk>
+0x9BD0 U+5DA2 # <cjk>
+0x9BD1 U+5D9D # <cjk>
+0x9BD2 U+5DAC # <cjk>
+0x9BD3 U+5DAE # <cjk>
+0x9BD4 U+5DBD # <cjk>
+0x9BD5 U+5D90 # <cjk>
+0x9BD6 U+5DB7 # <cjk>
+0x9BD7 U+5DBC # <cjk>
+0x9BD8 U+5DC9 # <cjk>
+0x9BD9 U+5DCD # <cjk>
+0x9BDA U+5DD3 # <cjk>
+0x9BDB U+5DD2 # <cjk>
+0x9BDC U+5DD6 # <cjk>
+0x9BDD U+5DDB # <cjk>
+0x9BDE U+5DEB # <cjk>
+0x9BDF U+5DF2 # <cjk>
+0x9BE0 U+5DF5 # <cjk>
+0x9BE1 U+5E0B # <cjk>
+0x9BE2 U+5E1A # <cjk>
+0x9BE3 U+5E19 # <cjk>
+0x9BE4 U+5E11 # <cjk>
+0x9BE5 U+5E1B # <cjk>
+0x9BE6 U+5E36 # <cjk>
+0x9BE7 U+5E37 # <cjk>
+0x9BE8 U+5E44 # <cjk>
+0x9BE9 U+5E43 # <cjk>
+0x9BEA U+5E40 # <cjk>
+0x9BEB U+5E4E # <cjk>
+0x9BEC U+5E57 # <cjk>
+0x9BED U+5E54 # <cjk>
+0x9BEE U+5E5F # <cjk>
+0x9BEF U+5E62 # <cjk>
+0x9BF0 U+5E64 # <cjk>
+0x9BF1 U+5E47 # <cjk>
+0x9BF2 U+5E75 # <cjk>
+0x9BF3 U+5E76 # <cjk>
+0x9BF4 U+5E7A # <cjk>
+0x9BF5 U+9EBC # <cjk>
+0x9BF6 U+5E7F # <cjk>
+0x9BF7 U+5EA0 # <cjk>
+0x9BF8 U+5EC1 # <cjk>
+0x9BF9 U+5EC2 # <cjk>
+0x9BFA U+5EC8 # <cjk>
+0x9BFB U+5ED0 # <cjk>
+0x9BFC U+5ECF # <cjk>
+0x9C40 U+5ED6 # <cjk>
+0x9C41 U+5EE3 # <cjk>
+0x9C42 U+5EDD # <cjk>
+0x9C43 U+5EDA # <cjk>
+0x9C44 U+5EDB # <cjk>
+0x9C45 U+5EE2 # <cjk>
+0x9C46 U+5EE1 # <cjk>
+0x9C47 U+5EE8 # <cjk>
+0x9C48 U+5EE9 # <cjk>
+0x9C49 U+5EEC # <cjk>
+0x9C4A U+5EF1 # <cjk>
+0x9C4B U+5EF3 # <cjk>
+0x9C4C U+5EF0 # <cjk>
+0x9C4D U+5EF4 # <cjk>
+0x9C4E U+5EF8 # <cjk>
+0x9C4F U+5EFE # <cjk>
+0x9C50 U+5F03 # <cjk>
+0x9C51 U+5F09 # <cjk>
+0x9C52 U+5F5D # <cjk>
+0x9C53 U+5F5C # <cjk>
+0x9C54 U+5F0B # <cjk>
+0x9C55 U+5F11 # <cjk>
+0x9C56 U+5F16 # <cjk>
+0x9C57 U+5F29 # <cjk>
+0x9C58 U+5F2D # <cjk>
+0x9C59 U+5F38 # <cjk>
+0x9C5A U+5F41 # <cjk>
+0x9C5B U+5F48 # <cjk>
+0x9C5C U+5F4C # <cjk>
+0x9C5D U+5F4E # <cjk>
+0x9C5E U+5F2F # <cjk>
+0x9C5F U+5F51 # <cjk>
+0x9C60 U+5F56 # <cjk>
+0x9C61 U+5F57 # <cjk>
+0x9C62 U+5F59 # <cjk>
+0x9C63 U+5F61 # <cjk>
+0x9C64 U+5F6D # <cjk>
+0x9C65 U+5F73 # <cjk>
+0x9C66 U+5F77 # <cjk>
+0x9C67 U+5F83 # <cjk>
+0x9C68 U+5F82 # <cjk>
+0x9C69 U+5F7F # <cjk>
+0x9C6A U+5F8A # <cjk>
+0x9C6B U+5F88 # <cjk>
+0x9C6C U+5F91 # <cjk>
+0x9C6D U+5F87 # <cjk>
+0x9C6E U+5F9E # <cjk>
+0x9C6F U+5F99 # <cjk>
+0x9C70 U+5F98 # <cjk>
+0x9C71 U+5FA0 # <cjk>
+0x9C72 U+5FA8 # <cjk>
+0x9C73 U+5FAD # <cjk>
+0x9C74 U+5FBC # <cjk>
+0x9C75 U+5FD6 # <cjk>
+0x9C76 U+5FFB # <cjk>
+0x9C77 U+5FE4 # <cjk>
+0x9C78 U+5FF8 # <cjk>
+0x9C79 U+5FF1 # <cjk>
+0x9C7A U+5FDD # <cjk>
+0x9C7B U+60B3 # <cjk>
+0x9C7C U+5FFF # <cjk>
+0x9C7D U+6021 # <cjk>
+0x9C7E U+6060 # <cjk>
+0x9C80 U+6019 # <cjk>
+0x9C81 U+6010 # <cjk>
+0x9C82 U+6029 # <cjk>
+0x9C83 U+600E # <cjk>
+0x9C84 U+6031 # <cjk>
+0x9C85 U+601B # <cjk>
+0x9C86 U+6015 # <cjk>
+0x9C87 U+602B # <cjk>
+0x9C88 U+6026 # <cjk>
+0x9C89 U+600F # <cjk>
+0x9C8A U+603A # <cjk>
+0x9C8B U+605A # <cjk>
+0x9C8C U+6041 # <cjk>
+0x9C8D U+606A # <cjk>
+0x9C8E U+6077 # <cjk>
+0x9C8F U+605F # <cjk>
+0x9C90 U+604A # <cjk>
+0x9C91 U+6046 # <cjk>
+0x9C92 U+604D # <cjk>
+0x9C93 U+6063 # <cjk>
+0x9C94 U+6043 # <cjk>
+0x9C95 U+6064 # <cjk>
+0x9C96 U+6042 # <cjk>
+0x9C97 U+606C # <cjk>
+0x9C98 U+606B # <cjk>
+0x9C99 U+6059 # <cjk>
+0x9C9A U+6081 # <cjk>
+0x9C9B U+608D # <cjk>
+0x9C9C U+60E7 # <cjk>
+0x9C9D U+6083 # <cjk>
+0x9C9E U+609A # <cjk>
+0x9C9F U+6084 # <cjk>
+0x9CA0 U+609B # <cjk>
+0x9CA1 U+6096 # <cjk>
+0x9CA2 U+6097 # <cjk>
+0x9CA3 U+6092 # <cjk>
+0x9CA4 U+60A7 # <cjk>
+0x9CA5 U+608B # <cjk>
+0x9CA6 U+60E1 # <cjk>
+0x9CA7 U+60B8 # <cjk>
+0x9CA8 U+60E0 # <cjk>
+0x9CA9 U+60D3 # <cjk>
+0x9CAA U+60B4 # <cjk>
+0x9CAB U+5FF0 # <cjk>
+0x9CAC U+60BD # <cjk>
+0x9CAD U+60C6 # <cjk>
+0x9CAE U+60B5 # <cjk>
+0x9CAF U+60D8 # <cjk>
+0x9CB0 U+614D # <cjk>
+0x9CB1 U+6115 # <cjk>
+0x9CB2 U+6106 # <cjk>
+0x9CB3 U+60F6 # <cjk>
+0x9CB4 U+60F7 # <cjk>
+0x9CB5 U+6100 # <cjk>
+0x9CB6 U+60F4 # <cjk>
+0x9CB7 U+60FA # <cjk>
+0x9CB8 U+6103 # <cjk>
+0x9CB9 U+6121 # <cjk>
+0x9CBA U+60FB # <cjk>
+0x9CBB U+60F1 # <cjk>
+0x9CBC U+610D # <cjk>
+0x9CBD U+610E # <cjk>
+0x9CBE U+6147 # <cjk>
+0x9CBF U+613E # <cjk>
+0x9CC0 U+6128 # <cjk>
+0x9CC1 U+6127 # <cjk>
+0x9CC2 U+614A # <cjk>
+0x9CC3 U+613F # <cjk>
+0x9CC4 U+613C # <cjk>
+0x9CC5 U+612C # <cjk>
+0x9CC6 U+6134 # <cjk>
+0x9CC7 U+613D # <cjk>
+0x9CC8 U+6142 # <cjk>
+0x9CC9 U+6144 # <cjk>
+0x9CCA U+6173 # <cjk>
+0x9CCB U+6177 # <cjk>
+0x9CCC U+6158 # <cjk>
+0x9CCD U+6159 # <cjk>
+0x9CCE U+615A # <cjk>
+0x9CCF U+616B # <cjk>
+0x9CD0 U+6174 # <cjk>
+0x9CD1 U+616F # <cjk>
+0x9CD2 U+6165 # <cjk>
+0x9CD3 U+6171 # <cjk>
+0x9CD4 U+615F # <cjk>
+0x9CD5 U+615D # <cjk>
+0x9CD6 U+6153 # <cjk>
+0x9CD7 U+6175 # <cjk>
+0x9CD8 U+6199 # <cjk>
+0x9CD9 U+6196 # <cjk>
+0x9CDA U+6187 # <cjk>
+0x9CDB U+61AC # <cjk>
+0x9CDC U+6194 # <cjk>
+0x9CDD U+619A # <cjk>
+0x9CDE U+618A # <cjk>
+0x9CDF U+6191 # <cjk>
+0x9CE0 U+61AB # <cjk>
+0x9CE1 U+61AE # <cjk>
+0x9CE2 U+61CC # <cjk>
+0x9CE3 U+61CA # <cjk>
+0x9CE4 U+61C9 # <cjk>
+0x9CE5 U+61F7 # <cjk>
+0x9CE6 U+61C8 # <cjk>
+0x9CE7 U+61C3 # <cjk>
+0x9CE8 U+61C6 # <cjk>
+0x9CE9 U+61BA # <cjk>
+0x9CEA U+61CB # <cjk>
+0x9CEB U+7F79 # <cjk>
+0x9CEC U+61CD # <cjk>
+0x9CED U+61E6 # <cjk>
+0x9CEE U+61E3 # <cjk>
+0x9CEF U+61F6 # <cjk>
+0x9CF0 U+61FA # <cjk>
+0x9CF1 U+61F4 # <cjk>
+0x9CF2 U+61FF # <cjk>
+0x9CF3 U+61FD # <cjk>
+0x9CF4 U+61FC # <cjk>
+0x9CF5 U+61FE # <cjk>
+0x9CF6 U+6200 # <cjk>
+0x9CF7 U+6208 # <cjk>
+0x9CF8 U+6209 # <cjk>
+0x9CF9 U+620D # <cjk>
+0x9CFA U+620C # <cjk>
+0x9CFB U+6214 # <cjk>
+0x9CFC U+621B # <cjk>
+0x9D40 U+621E # <cjk>
+0x9D41 U+6221 # <cjk>
+0x9D42 U+622A # <cjk>
+0x9D43 U+622E # <cjk>
+0x9D44 U+6230 # <cjk>
+0x9D45 U+6232 # <cjk>
+0x9D46 U+6233 # <cjk>
+0x9D47 U+6241 # <cjk>
+0x9D48 U+624E # <cjk>
+0x9D49 U+625E # <cjk>
+0x9D4A U+6263 # <cjk>
+0x9D4B U+625B # <cjk>
+0x9D4C U+6260 # <cjk>
+0x9D4D U+6268 # <cjk>
+0x9D4E U+627C # <cjk>
+0x9D4F U+6282 # <cjk>
+0x9D50 U+6289 # <cjk>
+0x9D51 U+627E # <cjk>
+0x9D52 U+6292 # <cjk>
+0x9D53 U+6293 # <cjk>
+0x9D54 U+6296 # <cjk>
+0x9D55 U+62D4 # <cjk>
+0x9D56 U+6283 # <cjk>
+0x9D57 U+6294 # <cjk>
+0x9D58 U+62D7 # <cjk>
+0x9D59 U+62D1 # <cjk>
+0x9D5A U+62BB # <cjk>
+0x9D5B U+62CF # <cjk>
+0x9D5C U+62FF # <cjk>
+0x9D5D U+62C6 # <cjk>
+0x9D5E U+64D4 # <cjk>
+0x9D5F U+62C8 # <cjk>
+0x9D60 U+62DC # <cjk>
+0x9D61 U+62CC # <cjk>
+0x9D62 U+62CA # <cjk>
+0x9D63 U+62C2 # <cjk>
+0x9D64 U+62C7 # <cjk>
+0x9D65 U+629B # <cjk>
+0x9D66 U+62C9 # <cjk>
+0x9D67 U+630C # <cjk>
+0x9D68 U+62EE # <cjk>
+0x9D69 U+62F1 # <cjk>
+0x9D6A U+6327 # <cjk>
+0x9D6B U+6302 # <cjk>
+0x9D6C U+6308 # <cjk>
+0x9D6D U+62EF # <cjk>
+0x9D6E U+62F5 # <cjk>
+0x9D6F U+6350 # <cjk>
+0x9D70 U+633E # <cjk>
+0x9D71 U+634D # <cjk>
+0x9D72 U+641C # <cjk>
+0x9D73 U+634F # <cjk>
+0x9D74 U+6396 # <cjk>
+0x9D75 U+638E # <cjk>
+0x9D76 U+6380 # <cjk>
+0x9D77 U+63AB # <cjk>
+0x9D78 U+6376 # <cjk>
+0x9D79 U+63A3 # <cjk>
+0x9D7A U+638F # <cjk>
+0x9D7B U+6389 # <cjk>
+0x9D7C U+639F # <cjk>
+0x9D7D U+63B5 # <cjk>
+0x9D7E U+636B # <cjk>
+0x9D80 U+6369 # <cjk>
+0x9D81 U+63BE # <cjk>
+0x9D82 U+63E9 # <cjk>
+0x9D83 U+63C0 # <cjk>
+0x9D84 U+63C6 # <cjk>
+0x9D85 U+63E3 # <cjk>
+0x9D86 U+63C9 # <cjk>
+0x9D87 U+63D2 # <cjk>
+0x9D88 U+63F6 # <cjk>
+0x9D89 U+63C4 # <cjk>
+0x9D8A U+6416 # <cjk>
+0x9D8B U+6434 # <cjk>
+0x9D8C U+6406 # <cjk>
+0x9D8D U+6413 # <cjk>
+0x9D8E U+6426 # <cjk>
+0x9D8F U+6436 # <cjk>
+0x9D90 U+651D # <cjk>
+0x9D91 U+6417 # <cjk>
+0x9D92 U+6428 # <cjk>
+0x9D93 U+640F # <cjk>
+0x9D94 U+6467 # <cjk>
+0x9D95 U+646F # <cjk>
+0x9D96 U+6476 # <cjk>
+0x9D97 U+644E # <cjk>
+0x9D98 U+652A # <cjk>
+0x9D99 U+6495 # <cjk>
+0x9D9A U+6493 # <cjk>
+0x9D9B U+64A5 # <cjk>
+0x9D9C U+64A9 # <cjk>
+0x9D9D U+6488 # <cjk>
+0x9D9E U+64BC # <cjk>
+0x9D9F U+64DA # <cjk>
+0x9DA0 U+64D2 # <cjk>
+0x9DA1 U+64C5 # <cjk>
+0x9DA2 U+64C7 # <cjk>
+0x9DA3 U+64BB # <cjk>
+0x9DA4 U+64D8 # <cjk>
+0x9DA5 U+64C2 # <cjk>
+0x9DA6 U+64F1 # <cjk>
+0x9DA7 U+64E7 # <cjk>
+0x9DA8 U+8209 # <cjk>
+0x9DA9 U+64E0 # <cjk>
+0x9DAA U+64E1 # <cjk>
+0x9DAB U+62AC # <cjk>
+0x9DAC U+64E3 # <cjk>
+0x9DAD U+64EF # <cjk>
+0x9DAE U+652C # <cjk>
+0x9DAF U+64F6 # <cjk>
+0x9DB0 U+64F4 # <cjk>
+0x9DB1 U+64F2 # <cjk>
+0x9DB2 U+64FA # <cjk>
+0x9DB3 U+6500 # <cjk>
+0x9DB4 U+64FD # <cjk>
+0x9DB5 U+6518 # <cjk>
+0x9DB6 U+651C # <cjk>
+0x9DB7 U+6505 # <cjk>
+0x9DB8 U+6524 # <cjk>
+0x9DB9 U+6523 # <cjk>
+0x9DBA U+652B # <cjk>
+0x9DBB U+6534 # <cjk>
+0x9DBC U+6535 # <cjk>
+0x9DBD U+6537 # <cjk>
+0x9DBE U+6536 # <cjk>
+0x9DBF U+6538 # <cjk>
+0x9DC0 U+754B # <cjk>
+0x9DC1 U+6548 # <cjk>
+0x9DC2 U+6556 # <cjk>
+0x9DC3 U+6555 # <cjk>
+0x9DC4 U+654D # <cjk>
+0x9DC5 U+6558 # <cjk>
+0x9DC6 U+655E # <cjk>
+0x9DC7 U+655D # <cjk>
+0x9DC8 U+6572 # <cjk>
+0x9DC9 U+6578 # <cjk>
+0x9DCA U+6582 # <cjk>
+0x9DCB U+6583 # <cjk>
+0x9DCC U+8B8A # <cjk>
+0x9DCD U+659B # <cjk>
+0x9DCE U+659F # <cjk>
+0x9DCF U+65AB # <cjk>
+0x9DD0 U+65B7 # <cjk>
+0x9DD1 U+65C3 # <cjk>
+0x9DD2 U+65C6 # <cjk>
+0x9DD3 U+65C1 # <cjk>
+0x9DD4 U+65C4 # <cjk>
+0x9DD5 U+65CC # <cjk>
+0x9DD6 U+65D2 # <cjk>
+0x9DD7 U+65DB # <cjk>
+0x9DD8 U+65D9 # <cjk>
+0x9DD9 U+65E0 # <cjk>
+0x9DDA U+65E1 # <cjk>
+0x9DDB U+65F1 # <cjk>
+0x9DDC U+6772 # <cjk>
+0x9DDD U+660A # <cjk>
+0x9DDE U+6603 # <cjk>
+0x9DDF U+65FB # <cjk>
+0x9DE0 U+6773 # <cjk>
+0x9DE1 U+6635 # <cjk>
+0x9DE2 U+6636 # <cjk>
+0x9DE3 U+6634 # <cjk>
+0x9DE4 U+661C # <cjk>
+0x9DE5 U+664F # <cjk>
+0x9DE6 U+6644 # <cjk>
+0x9DE7 U+6649 # <cjk>
+0x9DE8 U+6641 # <cjk>
+0x9DE9 U+665E # <cjk>
+0x9DEA U+665D # <cjk>
+0x9DEB U+6664 # <cjk>
+0x9DEC U+6667 # <cjk>
+0x9DED U+6668 # <cjk>
+0x9DEE U+665F # <cjk>
+0x9DEF U+6662 # <cjk>
+0x9DF0 U+6670 # <cjk>
+0x9DF1 U+6683 # <cjk>
+0x9DF2 U+6688 # <cjk>
+0x9DF3 U+668E # <cjk>
+0x9DF4 U+6689 # <cjk>
+0x9DF5 U+6684 # <cjk>
+0x9DF6 U+6698 # <cjk>
+0x9DF7 U+669D # <cjk>
+0x9DF8 U+66C1 # <cjk>
+0x9DF9 U+66B9 # <cjk>
+0x9DFA U+66C9 # <cjk>
+0x9DFB U+66BE # <cjk>
+0x9DFC U+66BC # <cjk>
+0x9E40 U+66C4 # <cjk>
+0x9E41 U+66B8 # <cjk>
+0x9E42 U+66D6 # <cjk>
+0x9E43 U+66DA # <cjk>
+0x9E44 U+66E0 # <cjk>
+0x9E45 U+663F # <cjk>
+0x9E46 U+66E6 # <cjk>
+0x9E47 U+66E9 # <cjk>
+0x9E48 U+66F0 # <cjk>
+0x9E49 U+66F5 # <cjk>
+0x9E4A U+66F7 # <cjk>
+0x9E4B U+670F # <cjk>
+0x9E4C U+6716 # <cjk>
+0x9E4D U+671E # <cjk>
+0x9E4E U+6726 # <cjk>
+0x9E4F U+6727 # <cjk>
+0x9E50 U+9738 # <cjk>
+0x9E51 U+672E # <cjk>
+0x9E52 U+673F # <cjk>
+0x9E53 U+6736 # <cjk>
+0x9E54 U+6741 # <cjk>
+0x9E55 U+6738 # <cjk>
+0x9E56 U+6737 # <cjk>
+0x9E57 U+6746 # <cjk>
+0x9E58 U+675E # <cjk>
+0x9E59 U+6760 # <cjk>
+0x9E5A U+6759 # <cjk>
+0x9E5B U+6763 # <cjk>
+0x9E5C U+6764 # <cjk>
+0x9E5D U+6789 # <cjk>
+0x9E5E U+6770 # <cjk>
+0x9E5F U+67A9 # <cjk>
+0x9E60 U+677C # <cjk>
+0x9E61 U+676A # <cjk>
+0x9E62 U+678C # <cjk>
+0x9E63 U+678B # <cjk>
+0x9E64 U+67A6 # <cjk>
+0x9E65 U+67A1 # <cjk>
+0x9E66 U+6785 # <cjk>
+0x9E67 U+67B7 # <cjk>
+0x9E68 U+67EF # <cjk>
+0x9E69 U+67B4 # <cjk>
+0x9E6A U+67EC # <cjk>
+0x9E6B U+67B3 # <cjk>
+0x9E6C U+67E9 # <cjk>
+0x9E6D U+67B8 # <cjk>
+0x9E6E U+67E4 # <cjk>
+0x9E6F U+67DE # <cjk>
+0x9E70 U+67DD # <cjk>
+0x9E71 U+67E2 # <cjk>
+0x9E72 U+67EE # <cjk>
+0x9E73 U+67B9 # <cjk>
+0x9E74 U+67CE # <cjk>
+0x9E75 U+67C6 # <cjk>
+0x9E76 U+67E7 # <cjk>
+0x9E77 U+6A9C # <cjk>
+0x9E78 U+681E # <cjk>
+0x9E79 U+6846 # <cjk>
+0x9E7A U+6829 # <cjk>
+0x9E7B U+6840 # <cjk>
+0x9E7C U+684D # <cjk>
+0x9E7D U+6832 # <cjk>
+0x9E7E U+684E # <cjk>
+0x9E80 U+68B3 # <cjk>
+0x9E81 U+682B # <cjk>
+0x9E82 U+6859 # <cjk>
+0x9E83 U+6863 # <cjk>
+0x9E84 U+6877 # <cjk>
+0x9E85 U+687F # <cjk>
+0x9E86 U+689F # <cjk>
+0x9E87 U+688F # <cjk>
+0x9E88 U+68AD # <cjk>
+0x9E89 U+6894 # <cjk>
+0x9E8A U+689D # <cjk>
+0x9E8B U+689B # <cjk>
+0x9E8C U+6883 # <cjk>
+0x9E8D U+6AAE # <cjk>
+0x9E8E U+68B9 # <cjk>
+0x9E8F U+6874 # <cjk>
+0x9E90 U+68B5 # <cjk>
+0x9E91 U+68A0 # <cjk>
+0x9E92 U+68BA # <cjk>
+0x9E93 U+690F # <cjk>
+0x9E94 U+688D # <cjk>
+0x9E95 U+687E # <cjk>
+0x9E96 U+6901 # <cjk>
+0x9E97 U+68CA # <cjk>
+0x9E98 U+6908 # <cjk>
+0x9E99 U+68D8 # <cjk>
+0x9E9A U+6922 # <cjk>
+0x9E9B U+6926 # <cjk>
+0x9E9C U+68E1 # <cjk>
+0x9E9D U+690C # <cjk>
+0x9E9E U+68CD # <cjk>
+0x9E9F U+68D4 # <cjk>
+0x9EA0 U+68E7 # <cjk>
+0x9EA1 U+68D5 # <cjk>
+0x9EA2 U+6936 # <cjk>
+0x9EA3 U+6912 # <cjk>
+0x9EA4 U+6904 # <cjk>
+0x9EA5 U+68D7 # <cjk>
+0x9EA6 U+68E3 # <cjk>
+0x9EA7 U+6925 # <cjk>
+0x9EA8 U+68F9 # <cjk>
+0x9EA9 U+68E0 # <cjk>
+0x9EAA U+68EF # <cjk>
+0x9EAB U+6928 # <cjk>
+0x9EAC U+692A # <cjk>
+0x9EAD U+691A # <cjk>
+0x9EAE U+6923 # <cjk>
+0x9EAF U+6921 # <cjk>
+0x9EB0 U+68C6 # <cjk>
+0x9EB1 U+6979 # <cjk>
+0x9EB2 U+6977 # <cjk>
+0x9EB3 U+695C # <cjk>
+0x9EB4 U+6978 # <cjk>
+0x9EB5 U+696B # <cjk>
+0x9EB6 U+6954 # <cjk>
+0x9EB7 U+697E # <cjk>
+0x9EB8 U+696E # <cjk>
+0x9EB9 U+6939 # <cjk>
+0x9EBA U+6974 # <cjk>
+0x9EBB U+693D # <cjk>
+0x9EBC U+6959 # <cjk>
+0x9EBD U+6930 # <cjk>
+0x9EBE U+6961 # <cjk>
+0x9EBF U+695E # <cjk>
+0x9EC0 U+695D # <cjk>
+0x9EC1 U+6981 # <cjk>
+0x9EC2 U+696A # <cjk>
+0x9EC3 U+69B2 # <cjk>
+0x9EC4 U+69AE # <cjk>
+0x9EC5 U+69D0 # <cjk>
+0x9EC6 U+69BF # <cjk>
+0x9EC7 U+69C1 # <cjk>
+0x9EC8 U+69D3 # <cjk>
+0x9EC9 U+69BE # <cjk>
+0x9ECA U+69CE # <cjk>
+0x9ECB U+5BE8 # <cjk>
+0x9ECC U+69CA # <cjk>
+0x9ECD U+69DD # <cjk>
+0x9ECE U+69BB # <cjk>
+0x9ECF U+69C3 # <cjk>
+0x9ED0 U+69A7 # <cjk>
+0x9ED1 U+6A2E # <cjk>
+0x9ED2 U+6991 # <cjk>
+0x9ED3 U+69A0 # <cjk>
+0x9ED4 U+699C # <cjk>
+0x9ED5 U+6995 # <cjk>
+0x9ED6 U+69B4 # <cjk>
+0x9ED7 U+69DE # <cjk>
+0x9ED8 U+69E8 # <cjk>
+0x9ED9 U+6A02 # <cjk>
+0x9EDA U+6A1B # <cjk>
+0x9EDB U+69FF # <cjk>
+0x9EDC U+6B0A # <cjk>
+0x9EDD U+69F9 # <cjk>
+0x9EDE U+69F2 # <cjk>
+0x9EDF U+69E7 # <cjk>
+0x9EE0 U+6A05 # <cjk>
+0x9EE1 U+69B1 # <cjk>
+0x9EE2 U+6A1E # <cjk>
+0x9EE3 U+69ED # <cjk>
+0x9EE4 U+6A14 # <cjk>
+0x9EE5 U+69EB # <cjk>
+0x9EE6 U+6A0A # <cjk>
+0x9EE7 U+6A12 # <cjk>
+0x9EE8 U+6AC1 # <cjk>
+0x9EE9 U+6A23 # <cjk>
+0x9EEA U+6A13 # <cjk>
+0x9EEB U+6A44 # <cjk>
+0x9EEC U+6A0C # <cjk>
+0x9EED U+6A72 # <cjk>
+0x9EEE U+6A36 # <cjk>
+0x9EEF U+6A78 # <cjk>
+0x9EF0 U+6A47 # <cjk>
+0x9EF1 U+6A62 # <cjk>
+0x9EF2 U+6A59 # <cjk>
+0x9EF3 U+6A66 # <cjk>
+0x9EF4 U+6A48 # <cjk>
+0x9EF5 U+6A38 # <cjk>
+0x9EF6 U+6A22 # <cjk>
+0x9EF7 U+6A90 # <cjk>
+0x9EF8 U+6A8D # <cjk>
+0x9EF9 U+6AA0 # <cjk>
+0x9EFA U+6A84 # <cjk>
+0x9EFB U+6AA2 # <cjk>
+0x9EFC U+6AA3 # <cjk>
+0x9F40 U+6A97 # <cjk>
+0x9F41 U+8617 # <cjk>
+0x9F42 U+6ABB # <cjk>
+0x9F43 U+6AC3 # <cjk>
+0x9F44 U+6AC2 # <cjk>
+0x9F45 U+6AB8 # <cjk>
+0x9F46 U+6AB3 # <cjk>
+0x9F47 U+6AAC # <cjk>
+0x9F48 U+6ADE # <cjk>
+0x9F49 U+6AD1 # <cjk>
+0x9F4A U+6ADF # <cjk>
+0x9F4B U+6AAA # <cjk>
+0x9F4C U+6ADA # <cjk>
+0x9F4D U+6AEA # <cjk>
+0x9F4E U+6AFB # <cjk>
+0x9F4F U+6B05 # <cjk>
+0x9F50 U+8616 # <cjk>
+0x9F51 U+6AFA # <cjk>
+0x9F52 U+6B12 # <cjk>
+0x9F53 U+6B16 # <cjk>
+0x9F54 U+9B31 # <cjk>
+0x9F55 U+6B1F # <cjk>
+0x9F56 U+6B38 # <cjk>
+0x9F57 U+6B37 # <cjk>
+0x9F58 U+76DC # <cjk>
+0x9F59 U+6B39 # <cjk>
+0x9F5A U+98EE # <cjk>
+0x9F5B U+6B47 # <cjk>
+0x9F5C U+6B43 # <cjk>
+0x9F5D U+6B49 # <cjk>
+0x9F5E U+6B50 # <cjk>
+0x9F5F U+6B59 # <cjk>
+0x9F60 U+6B54 # <cjk>
+0x9F61 U+6B5B # <cjk>
+0x9F62 U+6B5F # <cjk>
+0x9F63 U+6B61 # <cjk>
+0x9F64 U+6B78 # <cjk>
+0x9F65 U+6B79 # <cjk>
+0x9F66 U+6B7F # <cjk>
+0x9F67 U+6B80 # <cjk>
+0x9F68 U+6B84 # <cjk>
+0x9F69 U+6B83 # <cjk>
+0x9F6A U+6B8D # <cjk>
+0x9F6B U+6B98 # <cjk>
+0x9F6C U+6B95 # <cjk>
+0x9F6D U+6B9E # <cjk>
+0x9F6E U+6BA4 # <cjk>
+0x9F6F U+6BAA # <cjk>
+0x9F70 U+6BAB # <cjk>
+0x9F71 U+6BAF # <cjk>
+0x9F72 U+6BB2 # <cjk>
+0x9F73 U+6BB1 # <cjk>
+0x9F74 U+6BB3 # <cjk>
+0x9F75 U+6BB7 # <cjk>
+0x9F76 U+6BBC # <cjk>
+0x9F77 U+6BC6 # <cjk>
+0x9F78 U+6BCB # <cjk>
+0x9F79 U+6BD3 # <cjk>
+0x9F7A U+6BDF # <cjk>
+0x9F7B U+6BEC # <cjk>
+0x9F7C U+6BEB # <cjk>
+0x9F7D U+6BF3 # <cjk>
+0x9F7E U+6BEF # <cjk>
+0x9F80 U+9EBE # <cjk>
+0x9F81 U+6C08 # <cjk>
+0x9F82 U+6C13 # <cjk>
+0x9F83 U+6C14 # <cjk>
+0x9F84 U+6C1B # <cjk>
+0x9F85 U+6C24 # <cjk>
+0x9F86 U+6C23 # <cjk>
+0x9F87 U+6C5E # <cjk>
+0x9F88 U+6C55 # <cjk>
+0x9F89 U+6C62 # <cjk>
+0x9F8A U+6C6A # <cjk>
+0x9F8B U+6C82 # <cjk>
+0x9F8C U+6C8D # <cjk>
+0x9F8D U+6C9A # <cjk>
+0x9F8E U+6C81 # <cjk>
+0x9F8F U+6C9B # <cjk>
+0x9F90 U+6C7E # <cjk>
+0x9F91 U+6C68 # <cjk>
+0x9F92 U+6C73 # <cjk>
+0x9F93 U+6C92 # <cjk>
+0x9F94 U+6C90 # <cjk>
+0x9F95 U+6CC4 # <cjk>
+0x9F96 U+6CF1 # <cjk>
+0x9F97 U+6CD3 # <cjk>
+0x9F98 U+6CBD # <cjk>
+0x9F99 U+6CD7 # <cjk>
+0x9F9A U+6CC5 # <cjk>
+0x9F9B U+6CDD # <cjk>
+0x9F9C U+6CAE # <cjk>
+0x9F9D U+6CB1 # <cjk>
+0x9F9E U+6CBE # <cjk>
+0x9F9F U+6CBA # <cjk>
+0x9FA0 U+6CDB # <cjk>
+0x9FA1 U+6CEF # <cjk>
+0x9FA2 U+6CD9 # <cjk>
+0x9FA3 U+6CEA # <cjk>
+0x9FA4 U+6D1F # <cjk>
+0x9FA5 U+884D # <cjk>
+0x9FA6 U+6D36 # <cjk>
+0x9FA7 U+6D2B # <cjk>
+0x9FA8 U+6D3D # <cjk>
+0x9FA9 U+6D38 # <cjk>
+0x9FAA U+6D19 # <cjk>
+0x9FAB U+6D35 # <cjk>
+0x9FAC U+6D33 # <cjk>
+0x9FAD U+6D12 # <cjk>
+0x9FAE U+6D0C # <cjk>
+0x9FAF U+6D63 # <cjk>
+0x9FB0 U+6D93 # <cjk>
+0x9FB1 U+6D64 # <cjk>
+0x9FB2 U+6D5A # <cjk>
+0x9FB3 U+6D79 # <cjk>
+0x9FB4 U+6D59 # <cjk>
+0x9FB5 U+6D8E # <cjk>
+0x9FB6 U+6D95 # <cjk>
+0x9FB7 U+6FE4 # <cjk>
+0x9FB8 U+6D85 # <cjk>
+0x9FB9 U+6DF9 # <cjk>
+0x9FBA U+6E15 # <cjk>
+0x9FBB U+6E0A # <cjk>
+0x9FBC U+6DB5 # <cjk>
+0x9FBD U+6DC7 # <cjk>
+0x9FBE U+6DE6 # <cjk>
+0x9FBF U+6DB8 # <cjk>
+0x9FC0 U+6DC6 # <cjk>
+0x9FC1 U+6DEC # <cjk>
+0x9FC2 U+6DDE # <cjk>
+0x9FC3 U+6DCC # <cjk>
+0x9FC4 U+6DE8 # <cjk>
+0x9FC5 U+6DD2 # <cjk>
+0x9FC6 U+6DC5 # <cjk>
+0x9FC7 U+6DFA # <cjk>
+0x9FC8 U+6DD9 # <cjk>
+0x9FC9 U+6DE4 # <cjk>
+0x9FCA U+6DD5 # <cjk>
+0x9FCB U+6DEA # <cjk>
+0x9FCC U+6DEE # <cjk>
+0x9FCD U+6E2D # <cjk>
+0x9FCE U+6E6E # <cjk>
+0x9FCF U+6E2E # <cjk>
+0x9FD0 U+6E19 # <cjk>
+0x9FD1 U+6E72 # <cjk>
+0x9FD2 U+6E5F # <cjk>
+0x9FD3 U+6E3E # <cjk>
+0x9FD4 U+6E23 # <cjk>
+0x9FD5 U+6E6B # <cjk>
+0x9FD6 U+6E2B # <cjk>
+0x9FD7 U+6E76 # <cjk>
+0x9FD8 U+6E4D # <cjk>
+0x9FD9 U+6E1F # <cjk>
+0x9FDA U+6E43 # <cjk>
+0x9FDB U+6E3A # <cjk>
+0x9FDC U+6E4E # <cjk>
+0x9FDD U+6E24 # <cjk>
+0x9FDE U+6EFF # <cjk>
+0x9FDF U+6E1D # <cjk>
+0x9FE0 U+6E38 # <cjk>
+0x9FE1 U+6E82 # <cjk>
+0x9FE2 U+6EAA # <cjk>
+0x9FE3 U+6E98 # <cjk>
+0x9FE4 U+6EC9 # <cjk>
+0x9FE5 U+6EB7 # <cjk>
+0x9FE6 U+6ED3 # <cjk>
+0x9FE7 U+6EBD # <cjk>
+0x9FE8 U+6EAF # <cjk>
+0x9FE9 U+6EC4 # <cjk>
+0x9FEA U+6EB2 # <cjk>
+0x9FEB U+6ED4 # <cjk>
+0x9FEC U+6ED5 # <cjk>
+0x9FED U+6E8F # <cjk>
+0x9FEE U+6EA5 # <cjk>
+0x9FEF U+6EC2 # <cjk>
+0x9FF0 U+6E9F # <cjk>
+0x9FF1 U+6F41 # <cjk>
+0x9FF2 U+6F11 # <cjk>
+0x9FF3 U+704C # <cjk>
+0x9FF4 U+6EEC # <cjk>
+0x9FF5 U+6EF8 # <cjk>
+0x9FF6 U+6EFE # <cjk>
+0x9FF7 U+6F3F # <cjk>
+0x9FF8 U+6EF2 # <cjk>
+0x9FF9 U+6F31 # <cjk>
+0x9FFA U+6EEF # <cjk>
+0x9FFB U+6F32 # <cjk>
+0x9FFC U+6ECC # <cjk>
+0xE040 U+6F3E # <cjk>
+0xE041 U+6F13 # <cjk>
+0xE042 U+6EF7 # <cjk>
+0xE043 U+6F86 # <cjk>
+0xE044 U+6F7A # <cjk>
+0xE045 U+6F78 # <cjk>
+0xE046 U+6F81 # <cjk>
+0xE047 U+6F80 # <cjk>
+0xE048 U+6F6F # <cjk>
+0xE049 U+6F5B # <cjk>
+0xE04A U+6FF3 # <cjk>
+0xE04B U+6F6D # <cjk>
+0xE04C U+6F82 # <cjk>
+0xE04D U+6F7C # <cjk>
+0xE04E U+6F58 # <cjk>
+0xE04F U+6F8E # <cjk>
+0xE050 U+6F91 # <cjk>
+0xE051 U+6FC2 # <cjk>
+0xE052 U+6F66 # <cjk>
+0xE053 U+6FB3 # <cjk>
+0xE054 U+6FA3 # <cjk>
+0xE055 U+6FA1 # <cjk>
+0xE056 U+6FA4 # <cjk>
+0xE057 U+6FB9 # <cjk>
+0xE058 U+6FC6 # <cjk>
+0xE059 U+6FAA # <cjk>
+0xE05A U+6FDF # <cjk>
+0xE05B U+6FD5 # <cjk>
+0xE05C U+6FEC # <cjk>
+0xE05D U+6FD4 # <cjk>
+0xE05E U+6FD8 # <cjk>
+0xE05F U+6FF1 # <cjk>
+0xE060 U+6FEE # <cjk>
+0xE061 U+6FDB # <cjk>
+0xE062 U+7009 # <cjk>
+0xE063 U+700B # <cjk>
+0xE064 U+6FFA # <cjk>
+0xE065 U+7011 # <cjk>
+0xE066 U+7001 # <cjk>
+0xE067 U+700F # <cjk>
+0xE068 U+6FFE # <cjk>
+0xE069 U+701B # <cjk>
+0xE06A U+701A # <cjk>
+0xE06B U+6F74 # <cjk>
+0xE06C U+701D # <cjk>
+0xE06D U+7018 # <cjk>
+0xE06E U+701F # <cjk>
+0xE06F U+7030 # <cjk>
+0xE070 U+703E # <cjk>
+0xE071 U+7032 # <cjk>
+0xE072 U+7051 # <cjk>
+0xE073 U+7063 # <cjk>
+0xE074 U+7099 # <cjk>
+0xE075 U+7092 # <cjk>
+0xE076 U+70AF # <cjk>
+0xE077 U+70F1 # <cjk>
+0xE078 U+70AC # <cjk>
+0xE079 U+70B8 # <cjk>
+0xE07A U+70B3 # <cjk>
+0xE07B U+70AE # <cjk>
+0xE07C U+70DF # <cjk>
+0xE07D U+70CB # <cjk>
+0xE07E U+70DD # <cjk>
+0xE080 U+70D9 # <cjk>
+0xE081 U+7109 # <cjk>
+0xE082 U+70FD # <cjk>
+0xE083 U+711C # <cjk>
+0xE084 U+7119 # <cjk>
+0xE085 U+7165 # <cjk>
+0xE086 U+7155 # <cjk>
+0xE087 U+7188 # <cjk>
+0xE088 U+7166 # <cjk>
+0xE089 U+7162 # <cjk>
+0xE08A U+714C # <cjk>
+0xE08B U+7156 # <cjk>
+0xE08C U+716C # <cjk>
+0xE08D U+718F # <cjk>
+0xE08E U+71FB # <cjk>
+0xE08F U+7184 # <cjk>
+0xE090 U+7195 # <cjk>
+0xE091 U+71A8 # <cjk>
+0xE092 U+71AC # <cjk>
+0xE093 U+71D7 # <cjk>
+0xE094 U+71B9 # <cjk>
+0xE095 U+71BE # <cjk>
+0xE096 U+71D2 # <cjk>
+0xE097 U+71C9 # <cjk>
+0xE098 U+71D4 # <cjk>
+0xE099 U+71CE # <cjk>
+0xE09A U+71E0 # <cjk>
+0xE09B U+71EC # <cjk>
+0xE09C U+71E7 # <cjk>
+0xE09D U+71F5 # <cjk>
+0xE09E U+71FC # <cjk>
+0xE09F U+71F9 # <cjk>
+0xE0A0 U+71FF # <cjk>
+0xE0A1 U+720D # <cjk>
+0xE0A2 U+7210 # <cjk>
+0xE0A3 U+721B # <cjk>
+0xE0A4 U+7228 # <cjk>
+0xE0A5 U+722D # <cjk>
+0xE0A6 U+722C # <cjk>
+0xE0A7 U+7230 # <cjk>
+0xE0A8 U+7232 # <cjk>
+0xE0A9 U+723B # <cjk>
+0xE0AA U+723C # <cjk>
+0xE0AB U+723F # <cjk>
+0xE0AC U+7240 # <cjk>
+0xE0AD U+7246 # <cjk>
+0xE0AE U+724B # <cjk>
+0xE0AF U+7258 # <cjk>
+0xE0B0 U+7274 # <cjk>
+0xE0B1 U+727E # <cjk>
+0xE0B2 U+7282 # <cjk>
+0xE0B3 U+7281 # <cjk>
+0xE0B4 U+7287 # <cjk>
+0xE0B5 U+7292 # <cjk>
+0xE0B6 U+7296 # <cjk>
+0xE0B7 U+72A2 # <cjk>
+0xE0B8 U+72A7 # <cjk>
+0xE0B9 U+72B9 # <cjk>
+0xE0BA U+72B2 # <cjk>
+0xE0BB U+72C3 # <cjk>
+0xE0BC U+72C6 # <cjk>
+0xE0BD U+72C4 # <cjk>
+0xE0BE U+72CE # <cjk>
+0xE0BF U+72D2 # <cjk>
+0xE0C0 U+72E2 # <cjk>
+0xE0C1 U+72E0 # <cjk>
+0xE0C2 U+72E1 # <cjk>
+0xE0C3 U+72F9 # <cjk>
+0xE0C4 U+72F7 # <cjk>
+0xE0C5 U+500F # <cjk>
+0xE0C6 U+7317 # <cjk>
+0xE0C7 U+730A # <cjk>
+0xE0C8 U+731C # <cjk>
+0xE0C9 U+7316 # <cjk>
+0xE0CA U+731D # <cjk>
+0xE0CB U+7334 # <cjk>
+0xE0CC U+732F # <cjk>
+0xE0CD U+7329 # <cjk>
+0xE0CE U+7325 # <cjk>
+0xE0CF U+733E # <cjk>
+0xE0D0 U+734E # <cjk>
+0xE0D1 U+734F # <cjk>
+0xE0D2 U+9ED8 # <cjk>
+0xE0D3 U+7357 # <cjk>
+0xE0D4 U+736A # <cjk>
+0xE0D5 U+7368 # <cjk>
+0xE0D6 U+7370 # <cjk>
+0xE0D7 U+7378 # <cjk>
+0xE0D8 U+7375 # <cjk>
+0xE0D9 U+737B # <cjk>
+0xE0DA U+737A # <cjk>
+0xE0DB U+73C8 # <cjk>
+0xE0DC U+73B3 # <cjk>
+0xE0DD U+73CE # <cjk>
+0xE0DE U+73BB # <cjk>
+0xE0DF U+73C0 # <cjk>
+0xE0E0 U+73E5 # <cjk>
+0xE0E1 U+73EE # <cjk>
+0xE0E2 U+73DE # <cjk>
+0xE0E3 U+74A2 # <cjk>
+0xE0E4 U+7405 # <cjk>
+0xE0E5 U+746F # <cjk>
+0xE0E6 U+7425 # <cjk>
+0xE0E7 U+73F8 # <cjk>
+0xE0E8 U+7432 # <cjk>
+0xE0E9 U+743A # <cjk>
+0xE0EA U+7455 # <cjk>
+0xE0EB U+743F # <cjk>
+0xE0EC U+745F # <cjk>
+0xE0ED U+7459 # <cjk>
+0xE0EE U+7441 # <cjk>
+0xE0EF U+745C # <cjk>
+0xE0F0 U+7469 # <cjk>
+0xE0F1 U+7470 # <cjk>
+0xE0F2 U+7463 # <cjk>
+0xE0F3 U+746A # <cjk>
+0xE0F4 U+7476 # <cjk>
+0xE0F5 U+747E # <cjk>
+0xE0F6 U+748B # <cjk>
+0xE0F7 U+749E # <cjk>
+0xE0F8 U+74A7 # <cjk>
+0xE0F9 U+74CA # <cjk>
+0xE0FA U+74CF # <cjk>
+0xE0FB U+74D4 # <cjk>
+0xE0FC U+73F1 # <cjk>
+0xE140 U+74E0 # <cjk>
+0xE141 U+74E3 # <cjk>
+0xE142 U+74E7 # <cjk>
+0xE143 U+74E9 # <cjk>
+0xE144 U+74EE # <cjk>
+0xE145 U+74F2 # <cjk>
+0xE146 U+74F0 # <cjk>
+0xE147 U+74F1 # <cjk>
+0xE148 U+74F8 # <cjk>
+0xE149 U+74F7 # <cjk>
+0xE14A U+7504 # <cjk>
+0xE14B U+7503 # <cjk>
+0xE14C U+7505 # <cjk>
+0xE14D U+750C # <cjk>
+0xE14E U+750E # <cjk>
+0xE14F U+750D # <cjk>
+0xE150 U+7515 # <cjk>
+0xE151 U+7513 # <cjk>
+0xE152 U+751E # <cjk>
+0xE153 U+7526 # <cjk>
+0xE154 U+752C # <cjk>
+0xE155 U+753C # <cjk>
+0xE156 U+7544 # <cjk>
+0xE157 U+754D # <cjk>
+0xE158 U+754A # <cjk>
+0xE159 U+7549 # <cjk>
+0xE15A U+755B # <cjk>
+0xE15B U+7546 # <cjk>
+0xE15C U+755A # <cjk>
+0xE15D U+7569 # <cjk>
+0xE15E U+7564 # <cjk>
+0xE15F U+7567 # <cjk>
+0xE160 U+756B # <cjk>
+0xE161 U+756D # <cjk>
+0xE162 U+7578 # <cjk>
+0xE163 U+7576 # <cjk>
+0xE164 U+7586 # <cjk>
+0xE165 U+7587 # <cjk>
+0xE166 U+7574 # <cjk>
+0xE167 U+758A # <cjk>
+0xE168 U+7589 # <cjk>
+0xE169 U+7582 # <cjk>
+0xE16A U+7594 # <cjk>
+0xE16B U+759A # <cjk>
+0xE16C U+759D # <cjk>
+0xE16D U+75A5 # <cjk>
+0xE16E U+75A3 # <cjk>
+0xE16F U+75C2 # <cjk>
+0xE170 U+75B3 # <cjk>
+0xE171 U+75C3 # <cjk>
+0xE172 U+75B5 # <cjk>
+0xE173 U+75BD # <cjk>
+0xE174 U+75B8 # <cjk>
+0xE175 U+75BC # <cjk>
+0xE176 U+75B1 # <cjk>
+0xE177 U+75CD # <cjk>
+0xE178 U+75CA # <cjk>
+0xE179 U+75D2 # <cjk>
+0xE17A U+75D9 # <cjk>
+0xE17B U+75E3 # <cjk>
+0xE17C U+75DE # <cjk>
+0xE17D U+75FE # <cjk>
+0xE17E U+75FF # <cjk>
+0xE180 U+75FC # <cjk>
+0xE181 U+7601 # <cjk>
+0xE182 U+75F0 # <cjk>
+0xE183 U+75FA # <cjk>
+0xE184 U+75F2 # <cjk>
+0xE185 U+75F3 # <cjk>
+0xE186 U+760B # <cjk>
+0xE187 U+760D # <cjk>
+0xE188 U+7609 # <cjk>
+0xE189 U+761F # <cjk>
+0xE18A U+7627 # <cjk>
+0xE18B U+7620 # <cjk>
+0xE18C U+7621 # <cjk>
+0xE18D U+7622 # <cjk>
+0xE18E U+7624 # <cjk>
+0xE18F U+7634 # <cjk>
+0xE190 U+7630 # <cjk>
+0xE191 U+763B # <cjk>
+0xE192 U+7647 # <cjk>
+0xE193 U+7648 # <cjk>
+0xE194 U+7646 # <cjk>
+0xE195 U+765C # <cjk>
+0xE196 U+7658 # <cjk>
+0xE197 U+7661 # <cjk>
+0xE198 U+7662 # <cjk>
+0xE199 U+7668 # <cjk>
+0xE19A U+7669 # <cjk>
+0xE19B U+766A # <cjk>
+0xE19C U+7667 # <cjk>
+0xE19D U+766C # <cjk>
+0xE19E U+7670 # <cjk>
+0xE19F U+7672 # <cjk>
+0xE1A0 U+7676 # <cjk>
+0xE1A1 U+7678 # <cjk>
+0xE1A2 U+767C # <cjk>
+0xE1A3 U+7680 # <cjk>
+0xE1A4 U+7683 # <cjk>
+0xE1A5 U+7688 # <cjk>
+0xE1A6 U+768B # <cjk>
+0xE1A7 U+768E # <cjk>
+0xE1A8 U+7696 # <cjk>
+0xE1A9 U+7693 # <cjk>
+0xE1AA U+7699 # <cjk>
+0xE1AB U+769A # <cjk>
+0xE1AC U+76B0 # <cjk>
+0xE1AD U+76B4 # <cjk>
+0xE1AE U+76B8 # <cjk>
+0xE1AF U+76B9 # <cjk>
+0xE1B0 U+76BA # <cjk>
+0xE1B1 U+76C2 # <cjk>
+0xE1B2 U+76CD # <cjk>
+0xE1B3 U+76D6 # <cjk>
+0xE1B4 U+76D2 # <cjk>
+0xE1B5 U+76DE # <cjk>
+0xE1B6 U+76E1 # <cjk>
+0xE1B7 U+76E5 # <cjk>
+0xE1B8 U+76E7 # <cjk>
+0xE1B9 U+76EA # <cjk>
+0xE1BA U+862F # <cjk>
+0xE1BB U+76FB # <cjk>
+0xE1BC U+7708 # <cjk>
+0xE1BD U+7707 # <cjk>
+0xE1BE U+7704 # <cjk>
+0xE1BF U+7729 # <cjk>
+0xE1C0 U+7724 # <cjk>
+0xE1C1 U+771E # <cjk>
+0xE1C2 U+7725 # <cjk>
+0xE1C3 U+7726 # <cjk>
+0xE1C4 U+771B # <cjk>
+0xE1C5 U+7737 # <cjk>
+0xE1C6 U+7738 # <cjk>
+0xE1C7 U+7747 # <cjk>
+0xE1C8 U+775A # <cjk>
+0xE1C9 U+7768 # <cjk>
+0xE1CA U+776B # <cjk>
+0xE1CB U+775B # <cjk>
+0xE1CC U+7765 # <cjk>
+0xE1CD U+777F # <cjk>
+0xE1CE U+777E # <cjk>
+0xE1CF U+7779 # <cjk>
+0xE1D0 U+778E # <cjk>
+0xE1D1 U+778B # <cjk>
+0xE1D2 U+7791 # <cjk>
+0xE1D3 U+77A0 # <cjk>
+0xE1D4 U+779E # <cjk>
+0xE1D5 U+77B0 # <cjk>
+0xE1D6 U+77B6 # <cjk>
+0xE1D7 U+77B9 # <cjk>
+0xE1D8 U+77BF # <cjk>
+0xE1D9 U+77BC # <cjk>
+0xE1DA U+77BD # <cjk>
+0xE1DB U+77BB # <cjk>
+0xE1DC U+77C7 # <cjk>
+0xE1DD U+77CD # <cjk>
+0xE1DE U+77D7 # <cjk>
+0xE1DF U+77DA # <cjk>
+0xE1E0 U+77DC # <cjk>
+0xE1E1 U+77E3 # <cjk>
+0xE1E2 U+77EE # <cjk>
+0xE1E3 U+77FC # <cjk>
+0xE1E4 U+780C # <cjk>
+0xE1E5 U+7812 # <cjk>
+0xE1E6 U+7926 # <cjk>
+0xE1E7 U+7820 # <cjk>
+0xE1E8 U+792A # <cjk>
+0xE1E9 U+7845 # <cjk>
+0xE1EA U+788E # <cjk>
+0xE1EB U+7874 # <cjk>
+0xE1EC U+7886 # <cjk>
+0xE1ED U+787C # <cjk>
+0xE1EE U+789A # <cjk>
+0xE1EF U+788C # <cjk>
+0xE1F0 U+78A3 # <cjk>
+0xE1F1 U+78B5 # <cjk>
+0xE1F2 U+78AA # <cjk>
+0xE1F3 U+78AF # <cjk>
+0xE1F4 U+78D1 # <cjk>
+0xE1F5 U+78C6 # <cjk>
+0xE1F6 U+78CB # <cjk>
+0xE1F7 U+78D4 # <cjk>
+0xE1F8 U+78BE # <cjk>
+0xE1F9 U+78BC # <cjk>
+0xE1FA U+78C5 # <cjk>
+0xE1FB U+78CA # <cjk>
+0xE1FC U+78EC # <cjk>
+0xE240 U+78E7 # <cjk>
+0xE241 U+78DA # <cjk>
+0xE242 U+78FD # <cjk>
+0xE243 U+78F4 # <cjk>
+0xE244 U+7907 # <cjk>
+0xE245 U+7912 # <cjk>
+0xE246 U+7911 # <cjk>
+0xE247 U+7919 # <cjk>
+0xE248 U+792C # <cjk>
+0xE249 U+792B # <cjk>
+0xE24A U+7940 # <cjk>
+0xE24B U+7960 # <cjk>
+0xE24C U+7957 # <cjk>
+0xE24D U+795F # <cjk>
+0xE24E U+795A # <cjk>
+0xE24F U+7955 # <cjk>
+0xE250 U+7953 # <cjk>
+0xE251 U+797A # <cjk>
+0xE252 U+797F # <cjk>
+0xE253 U+798A # <cjk>
+0xE254 U+799D # <cjk>
+0xE255 U+79A7 # <cjk>
+0xE256 U+9F4B # <cjk>
+0xE257 U+79AA # <cjk>
+0xE258 U+79AE # <cjk>
+0xE259 U+79B3 # <cjk>
+0xE25A U+79B9 # <cjk>
+0xE25B U+79BA # <cjk>
+0xE25C U+79C9 # <cjk>
+0xE25D U+79D5 # <cjk>
+0xE25E U+79E7 # <cjk>
+0xE25F U+79EC # <cjk>
+0xE260 U+79E1 # <cjk>
+0xE261 U+79E3 # <cjk>
+0xE262 U+7A08 # <cjk>
+0xE263 U+7A0D # <cjk>
+0xE264 U+7A18 # <cjk>
+0xE265 U+7A19 # <cjk>
+0xE266 U+7A20 # <cjk>
+0xE267 U+7A1F # <cjk>
+0xE268 U+7980 # <cjk>
+0xE269 U+7A31 # <cjk>
+0xE26A U+7A3B # <cjk>
+0xE26B U+7A3E # <cjk>
+0xE26C U+7A37 # <cjk>
+0xE26D U+7A43 # <cjk>
+0xE26E U+7A57 # <cjk>
+0xE26F U+7A49 # <cjk>
+0xE270 U+7A61 # <cjk>
+0xE271 U+7A62 # <cjk>
+0xE272 U+7A69 # <cjk>
+0xE273 U+9F9D # <cjk>
+0xE274 U+7A70 # <cjk>
+0xE275 U+7A79 # <cjk>
+0xE276 U+7A7D # <cjk>
+0xE277 U+7A88 # <cjk>
+0xE278 U+7A97 # <cjk>
+0xE279 U+7A95 # <cjk>
+0xE27A U+7A98 # <cjk>
+0xE27B U+7A96 # <cjk>
+0xE27C U+7AA9 # <cjk>
+0xE27D U+7AC8 # <cjk>
+0xE27E U+7AB0 # <cjk>
+0xE280 U+7AB6 # <cjk>
+0xE281 U+7AC5 # <cjk>
+0xE282 U+7AC4 # <cjk>
+0xE283 U+7ABF # <cjk>
+0xE284 U+9083 # <cjk>
+0xE285 U+7AC7 # <cjk>
+0xE286 U+7ACA # <cjk>
+0xE287 U+7ACD # <cjk>
+0xE288 U+7ACF # <cjk>
+0xE289 U+7AD5 # <cjk>
+0xE28A U+7AD3 # <cjk>
+0xE28B U+7AD9 # <cjk>
+0xE28C U+7ADA # <cjk>
+0xE28D U+7ADD # <cjk>
+0xE28E U+7AE1 # <cjk>
+0xE28F U+7AE2 # <cjk>
+0xE290 U+7AE6 # <cjk>
+0xE291 U+7AED # <cjk>
+0xE292 U+7AF0 # <cjk>
+0xE293 U+7B02 # <cjk>
+0xE294 U+7B0F # <cjk>
+0xE295 U+7B0A # <cjk>
+0xE296 U+7B06 # <cjk>
+0xE297 U+7B33 # <cjk>
+0xE298 U+7B18 # <cjk>
+0xE299 U+7B19 # <cjk>
+0xE29A U+7B1E # <cjk>
+0xE29B U+7B35 # <cjk>
+0xE29C U+7B28 # <cjk>
+0xE29D U+7B36 # <cjk>
+0xE29E U+7B50 # <cjk>
+0xE29F U+7B7A # <cjk>
+0xE2A0 U+7B04 # <cjk>
+0xE2A1 U+7B4D # <cjk>
+0xE2A2 U+7B0B # <cjk>
+0xE2A3 U+7B4C # <cjk>
+0xE2A4 U+7B45 # <cjk>
+0xE2A5 U+7B75 # <cjk>
+0xE2A6 U+7B65 # <cjk>
+0xE2A7 U+7B74 # <cjk>
+0xE2A8 U+7B67 # <cjk>
+0xE2A9 U+7B70 # <cjk>
+0xE2AA U+7B71 # <cjk>
+0xE2AB U+7B6C # <cjk>
+0xE2AC U+7B6E # <cjk>
+0xE2AD U+7B9D # <cjk>
+0xE2AE U+7B98 # <cjk>
+0xE2AF U+7B9F # <cjk>
+0xE2B0 U+7B8D # <cjk>
+0xE2B1 U+7B9C # <cjk>
+0xE2B2 U+7B9A # <cjk>
+0xE2B3 U+7B8B # <cjk>
+0xE2B4 U+7B92 # <cjk>
+0xE2B5 U+7B8F # <cjk>
+0xE2B6 U+7B5D # <cjk>
+0xE2B7 U+7B99 # <cjk>
+0xE2B8 U+7BCB # <cjk>
+0xE2B9 U+7BC1 # <cjk>
+0xE2BA U+7BCC # <cjk>
+0xE2BB U+7BCF # <cjk>
+0xE2BC U+7BB4 # <cjk>
+0xE2BD U+7BC6 # <cjk>
+0xE2BE U+7BDD # <cjk>
+0xE2BF U+7BE9 # <cjk>
+0xE2C0 U+7C11 # <cjk>
+0xE2C1 U+7C14 # <cjk>
+0xE2C2 U+7BE6 # <cjk>
+0xE2C3 U+7BE5 # <cjk>
+0xE2C4 U+7C60 # <cjk>
+0xE2C5 U+7C00 # <cjk>
+0xE2C6 U+7C07 # <cjk>
+0xE2C7 U+7C13 # <cjk>
+0xE2C8 U+7BF3 # <cjk>
+0xE2C9 U+7BF7 # <cjk>
+0xE2CA U+7C17 # <cjk>
+0xE2CB U+7C0D # <cjk>
+0xE2CC U+7BF6 # <cjk>
+0xE2CD U+7C23 # <cjk>
+0xE2CE U+7C27 # <cjk>
+0xE2CF U+7C2A # <cjk>
+0xE2D0 U+7C1F # <cjk>
+0xE2D1 U+7C37 # <cjk>
+0xE2D2 U+7C2B # <cjk>
+0xE2D3 U+7C3D # <cjk>
+0xE2D4 U+7C4C # <cjk>
+0xE2D5 U+7C43 # <cjk>
+0xE2D6 U+7C54 # <cjk>
+0xE2D7 U+7C4F # <cjk>
+0xE2D8 U+7C40 # <cjk>
+0xE2D9 U+7C50 # <cjk>
+0xE2DA U+7C58 # <cjk>
+0xE2DB U+7C5F # <cjk>
+0xE2DC U+7C64 # <cjk>
+0xE2DD U+7C56 # <cjk>
+0xE2DE U+7C65 # <cjk>
+0xE2DF U+7C6C # <cjk>
+0xE2E0 U+7C75 # <cjk>
+0xE2E1 U+7C83 # <cjk>
+0xE2E2 U+7C90 # <cjk>
+0xE2E3 U+7CA4 # <cjk>
+0xE2E4 U+7CAD # <cjk>
+0xE2E5 U+7CA2 # <cjk>
+0xE2E6 U+7CAB # <cjk>
+0xE2E7 U+7CA1 # <cjk>
+0xE2E8 U+7CA8 # <cjk>
+0xE2E9 U+7CB3 # <cjk>
+0xE2EA U+7CB2 # <cjk>
+0xE2EB U+7CB1 # <cjk>
+0xE2EC U+7CAE # <cjk>
+0xE2ED U+7CB9 # <cjk>
+0xE2EE U+7CBD # <cjk>
+0xE2EF U+7CC0 # <cjk>
+0xE2F0 U+7CC5 # <cjk>
+0xE2F1 U+7CC2 # <cjk>
+0xE2F2 U+7CD8 # <cjk>
+0xE2F3 U+7CD2 # <cjk>
+0xE2F4 U+7CDC # <cjk>
+0xE2F5 U+7CE2 # <cjk>
+0xE2F6 U+9B3B # <cjk>
+0xE2F7 U+7CEF # <cjk>
+0xE2F8 U+7CF2 # <cjk>
+0xE2F9 U+7CF4 # <cjk>
+0xE2FA U+7CF6 # <cjk>
+0xE2FB U+7CFA # <cjk>
+0xE2FC U+7D06 # <cjk>
+0xE340 U+7D02 # <cjk>
+0xE341 U+7D1C # <cjk>
+0xE342 U+7D15 # <cjk>
+0xE343 U+7D0A # <cjk>
+0xE344 U+7D45 # <cjk>
+0xE345 U+7D4B # <cjk>
+0xE346 U+7D2E # <cjk>
+0xE347 U+7D32 # <cjk>
+0xE348 U+7D3F # <cjk>
+0xE349 U+7D35 # <cjk>
+0xE34A U+7D46 # <cjk>
+0xE34B U+7D73 # <cjk>
+0xE34C U+7D56 # <cjk>
+0xE34D U+7D4E # <cjk>
+0xE34E U+7D72 # <cjk>
+0xE34F U+7D68 # <cjk>
+0xE350 U+7D6E # <cjk>
+0xE351 U+7D4F # <cjk>
+0xE352 U+7D63 # <cjk>
+0xE353 U+7D93 # <cjk>
+0xE354 U+7D89 # <cjk>
+0xE355 U+7D5B # <cjk>
+0xE356 U+7D8F # <cjk>
+0xE357 U+7D7D # <cjk>
+0xE358 U+7D9B # <cjk>
+0xE359 U+7DBA # <cjk>
+0xE35A U+7DAE # <cjk>
+0xE35B U+7DA3 # <cjk>
+0xE35C U+7DB5 # <cjk>
+0xE35D U+7DC7 # <cjk>
+0xE35E U+7DBD # <cjk>
+0xE35F U+7DAB # <cjk>
+0xE360 U+7E3D # <cjk>
+0xE361 U+7DA2 # <cjk>
+0xE362 U+7DAF # <cjk>
+0xE363 U+7DDC # <cjk>
+0xE364 U+7DB8 # <cjk>
+0xE365 U+7D9F # <cjk>
+0xE366 U+7DB0 # <cjk>
+0xE367 U+7DD8 # <cjk>
+0xE368 U+7DDD # <cjk>
+0xE369 U+7DE4 # <cjk>
+0xE36A U+7DDE # <cjk>
+0xE36B U+7DFB # <cjk>
+0xE36C U+7DF2 # <cjk>
+0xE36D U+7DE1 # <cjk>
+0xE36E U+7E05 # <cjk>
+0xE36F U+7E0A # <cjk>
+0xE370 U+7E23 # <cjk>
+0xE371 U+7E21 # <cjk>
+0xE372 U+7E12 # <cjk>
+0xE373 U+7E31 # <cjk>
+0xE374 U+7E1F # <cjk>
+0xE375 U+7E09 # <cjk>
+0xE376 U+7E0B # <cjk>
+0xE377 U+7E22 # <cjk>
+0xE378 U+7E46 # <cjk>
+0xE379 U+7E66 # <cjk>
+0xE37A U+7E3B # <cjk>
+0xE37B U+7E35 # <cjk>
+0xE37C U+7E39 # <cjk>
+0xE37D U+7E43 # <cjk>
+0xE37E U+7E37 # <cjk>
+0xE380 U+7E32 # <cjk>
+0xE381 U+7E3A # <cjk>
+0xE382 U+7E67 # <cjk>
+0xE383 U+7E5D # <cjk>
+0xE384 U+7E56 # <cjk>
+0xE385 U+7E5E # <cjk>
+0xE386 U+7E59 # <cjk>
+0xE387 U+7E5A # <cjk>
+0xE388 U+7E79 # <cjk>
+0xE389 U+7E6A # <cjk>
+0xE38A U+7E69 # <cjk>
+0xE38B U+7E7C # <cjk>
+0xE38C U+7E7B # <cjk>
+0xE38D U+7E83 # <cjk>
+0xE38E U+7DD5 # <cjk>
+0xE38F U+7E7D # <cjk>
+0xE390 U+8FAE # <cjk>
+0xE391 U+7E7F # <cjk>
+0xE392 U+7E88 # <cjk>
+0xE393 U+7E89 # <cjk>
+0xE394 U+7E8C # <cjk>
+0xE395 U+7E92 # <cjk>
+0xE396 U+7E90 # <cjk>
+0xE397 U+7E93 # <cjk>
+0xE398 U+7E94 # <cjk>
+0xE399 U+7E96 # <cjk>
+0xE39A U+7E8E # <cjk>
+0xE39B U+7E9B # <cjk>
+0xE39C U+7E9C # <cjk>
+0xE39D U+7F38 # <cjk>
+0xE39E U+7F3A # <cjk>
+0xE39F U+7F45 # <cjk>
+0xE3A0 U+7F4C # <cjk>
+0xE3A1 U+7F4D # <cjk>
+0xE3A2 U+7F4E # <cjk>
+0xE3A3 U+7F50 # <cjk>
+0xE3A4 U+7F51 # <cjk>
+0xE3A5 U+7F55 # <cjk>
+0xE3A6 U+7F54 # <cjk>
+0xE3A7 U+7F58 # <cjk>
+0xE3A8 U+7F5F # <cjk>
+0xE3A9 U+7F60 # <cjk>
+0xE3AA U+7F68 # <cjk>
+0xE3AB U+7F69 # <cjk>
+0xE3AC U+7F67 # <cjk>
+0xE3AD U+7F78 # <cjk>
+0xE3AE U+7F82 # <cjk>
+0xE3AF U+7F86 # <cjk>
+0xE3B0 U+7F83 # <cjk>
+0xE3B1 U+7F88 # <cjk>
+0xE3B2 U+7F87 # <cjk>
+0xE3B3 U+7F8C # <cjk>
+0xE3B4 U+7F94 # <cjk>
+0xE3B5 U+7F9E # <cjk>
+0xE3B6 U+7F9D # <cjk>
+0xE3B7 U+7F9A # <cjk>
+0xE3B8 U+7FA3 # <cjk>
+0xE3B9 U+7FAF # <cjk>
+0xE3BA U+7FB2 # <cjk>
+0xE3BB U+7FB9 # <cjk>
+0xE3BC U+7FAE # <cjk>
+0xE3BD U+7FB6 # <cjk>
+0xE3BE U+7FB8 # <cjk>
+0xE3BF U+8B71 # <cjk>
+0xE3C0 U+7FC5 # <cjk>
+0xE3C1 U+7FC6 # <cjk>
+0xE3C2 U+7FCA # <cjk>
+0xE3C3 U+7FD5 # <cjk>
+0xE3C4 U+7FD4 # <cjk>
+0xE3C5 U+7FE1 # <cjk>
+0xE3C6 U+7FE6 # <cjk>
+0xE3C7 U+7FE9 # <cjk>
+0xE3C8 U+7FF3 # <cjk>
+0xE3C9 U+7FF9 # <cjk>
+0xE3CA U+98DC # <cjk>
+0xE3CB U+8006 # <cjk>
+0xE3CC U+8004 # <cjk>
+0xE3CD U+800B # <cjk>
+0xE3CE U+8012 # <cjk>
+0xE3CF U+8018 # <cjk>
+0xE3D0 U+8019 # <cjk>
+0xE3D1 U+801C # <cjk>
+0xE3D2 U+8021 # <cjk>
+0xE3D3 U+8028 # <cjk>
+0xE3D4 U+803F # <cjk>
+0xE3D5 U+803B # <cjk>
+0xE3D6 U+804A # <cjk>
+0xE3D7 U+8046 # <cjk>
+0xE3D8 U+8052 # <cjk>
+0xE3D9 U+8058 # <cjk>
+0xE3DA U+805A # <cjk>
+0xE3DB U+805F # <cjk>
+0xE3DC U+8062 # <cjk>
+0xE3DD U+8068 # <cjk>
+0xE3DE U+8073 # <cjk>
+0xE3DF U+8072 # <cjk>
+0xE3E0 U+8070 # <cjk>
+0xE3E1 U+8076 # <cjk>
+0xE3E2 U+8079 # <cjk>
+0xE3E3 U+807D # <cjk>
+0xE3E4 U+807F # <cjk>
+0xE3E5 U+8084 # <cjk>
+0xE3E6 U+8086 # <cjk>
+0xE3E7 U+8085 # <cjk>
+0xE3E8 U+809B # <cjk>
+0xE3E9 U+8093 # <cjk>
+0xE3EA U+809A # <cjk>
+0xE3EB U+80AD # <cjk>
+0xE3EC U+5190 # <cjk>
+0xE3ED U+80AC # <cjk>
+0xE3EE U+80DB # <cjk>
+0xE3EF U+80E5 # <cjk>
+0xE3F0 U+80D9 # <cjk>
+0xE3F1 U+80DD # <cjk>
+0xE3F2 U+80C4 # <cjk>
+0xE3F3 U+80DA # <cjk>
+0xE3F4 U+80D6 # <cjk>
+0xE3F5 U+8109 # <cjk>
+0xE3F6 U+80EF # <cjk>
+0xE3F7 U+80F1 # <cjk>
+0xE3F8 U+811B # <cjk>
+0xE3F9 U+8129 # <cjk>
+0xE3FA U+8123 # <cjk>
+0xE3FB U+812F # <cjk>
+0xE3FC U+814B # <cjk>
+0xE440 U+968B # <cjk>
+0xE441 U+8146 # <cjk>
+0xE442 U+813E # <cjk>
+0xE443 U+8153 # <cjk>
+0xE444 U+8151 # <cjk>
+0xE445 U+80FC # <cjk>
+0xE446 U+8171 # <cjk>
+0xE447 U+816E # <cjk>
+0xE448 U+8165 # <cjk>
+0xE449 U+8166 # <cjk>
+0xE44A U+8174 # <cjk>
+0xE44B U+8183 # <cjk>
+0xE44C U+8188 # <cjk>
+0xE44D U+818A # <cjk>
+0xE44E U+8180 # <cjk>
+0xE44F U+8182 # <cjk>
+0xE450 U+81A0 # <cjk>
+0xE451 U+8195 # <cjk>
+0xE452 U+81A4 # <cjk>
+0xE453 U+81A3 # <cjk>
+0xE454 U+815F # <cjk>
+0xE455 U+8193 # <cjk>
+0xE456 U+81A9 # <cjk>
+0xE457 U+81B0 # <cjk>
+0xE458 U+81B5 # <cjk>
+0xE459 U+81BE # <cjk>
+0xE45A U+81B8 # <cjk>
+0xE45B U+81BD # <cjk>
+0xE45C U+81C0 # <cjk>
+0xE45D U+81C2 # <cjk>
+0xE45E U+81BA # <cjk>
+0xE45F U+81C9 # <cjk>
+0xE460 U+81CD # <cjk>
+0xE461 U+81D1 # <cjk>
+0xE462 U+81D9 # <cjk>
+0xE463 U+81D8 # <cjk>
+0xE464 U+81C8 # <cjk>
+0xE465 U+81DA # <cjk>
+0xE466 U+81DF # <cjk>
+0xE467 U+81E0 # <cjk>
+0xE468 U+81E7 # <cjk>
+0xE469 U+81FA # <cjk>
+0xE46A U+81FB # <cjk>
+0xE46B U+81FE # <cjk>
+0xE46C U+8201 # <cjk>
+0xE46D U+8202 # <cjk>
+0xE46E U+8205 # <cjk>
+0xE46F U+8207 # <cjk>
+0xE470 U+820A # <cjk>
+0xE471 U+820D # <cjk>
+0xE472 U+8210 # <cjk>
+0xE473 U+8216 # <cjk>
+0xE474 U+8229 # <cjk>
+0xE475 U+822B # <cjk>
+0xE476 U+8238 # <cjk>
+0xE477 U+8233 # <cjk>
+0xE478 U+8240 # <cjk>
+0xE479 U+8259 # <cjk>
+0xE47A U+8258 # <cjk>
+0xE47B U+825D # <cjk>
+0xE47C U+825A # <cjk>
+0xE47D U+825F # <cjk>
+0xE47E U+8264 # <cjk>
+0xE480 U+8262 # <cjk>
+0xE481 U+8268 # <cjk>
+0xE482 U+826A # <cjk>
+0xE483 U+826B # <cjk>
+0xE484 U+822E # <cjk>
+0xE485 U+8271 # <cjk>
+0xE486 U+8277 # <cjk>
+0xE487 U+8278 # <cjk>
+0xE488 U+827E # <cjk>
+0xE489 U+828D # <cjk>
+0xE48A U+8292 # <cjk>
+0xE48B U+82AB # <cjk>
+0xE48C U+829F # <cjk>
+0xE48D U+82BB # <cjk>
+0xE48E U+82AC # <cjk>
+0xE48F U+82E1 # <cjk>
+0xE490 U+82E3 # <cjk>
+0xE491 U+82DF # <cjk>
+0xE492 U+82D2 # <cjk>
+0xE493 U+82F4 # <cjk>
+0xE494 U+82F3 # <cjk>
+0xE495 U+82FA # <cjk>
+0xE496 U+8393 # <cjk>
+0xE497 U+8303 # <cjk>
+0xE498 U+82FB # <cjk>
+0xE499 U+82F9 # <cjk>
+0xE49A U+82DE # <cjk>
+0xE49B U+8306 # <cjk>
+0xE49C U+82DC # <cjk>
+0xE49D U+8309 # <cjk>
+0xE49E U+82D9 # <cjk>
+0xE49F U+8335 # <cjk>
+0xE4A0 U+8334 # <cjk>
+0xE4A1 U+8316 # <cjk>
+0xE4A2 U+8332 # <cjk>
+0xE4A3 U+8331 # <cjk>
+0xE4A4 U+8340 # <cjk>
+0xE4A5 U+8339 # <cjk>
+0xE4A6 U+8350 # <cjk>
+0xE4A7 U+8345 # <cjk>
+0xE4A8 U+832F # <cjk>
+0xE4A9 U+832B # <cjk>
+0xE4AA U+8317 # <cjk>
+0xE4AB U+8318 # <cjk>
+0xE4AC U+8385 # <cjk>
+0xE4AD U+839A # <cjk>
+0xE4AE U+83AA # <cjk>
+0xE4AF U+839F # <cjk>
+0xE4B0 U+83A2 # <cjk>
+0xE4B1 U+8396 # <cjk>
+0xE4B2 U+8323 # <cjk>
+0xE4B3 U+838E # <cjk>
+0xE4B4 U+8387 # <cjk>
+0xE4B5 U+838A # <cjk>
+0xE4B6 U+837C # <cjk>
+0xE4B7 U+83B5 # <cjk>
+0xE4B8 U+8373 # <cjk>
+0xE4B9 U+8375 # <cjk>
+0xE4BA U+83A0 # <cjk>
+0xE4BB U+8389 # <cjk>
+0xE4BC U+83A8 # <cjk>
+0xE4BD U+83F4 # <cjk>
+0xE4BE U+8413 # <cjk>
+0xE4BF U+83EB # <cjk>
+0xE4C0 U+83CE # <cjk>
+0xE4C1 U+83FD # <cjk>
+0xE4C2 U+8403 # <cjk>
+0xE4C3 U+83D8 # <cjk>
+0xE4C4 U+840B # <cjk>
+0xE4C5 U+83C1 # <cjk>
+0xE4C6 U+83F7 # <cjk>
+0xE4C7 U+8407 # <cjk>
+0xE4C8 U+83E0 # <cjk>
+0xE4C9 U+83F2 # <cjk>
+0xE4CA U+840D # <cjk>
+0xE4CB U+8422 # <cjk>
+0xE4CC U+8420 # <cjk>
+0xE4CD U+83BD # <cjk>
+0xE4CE U+8438 # <cjk>
+0xE4CF U+8506 # <cjk>
+0xE4D0 U+83FB # <cjk>
+0xE4D1 U+846D # <cjk>
+0xE4D2 U+842A # <cjk>
+0xE4D3 U+843C # <cjk>
+0xE4D4 U+855A # <cjk>
+0xE4D5 U+8484 # <cjk>
+0xE4D6 U+8477 # <cjk>
+0xE4D7 U+846B # <cjk>
+0xE4D8 U+84AD # <cjk>
+0xE4D9 U+846E # <cjk>
+0xE4DA U+8482 # <cjk>
+0xE4DB U+8469 # <cjk>
+0xE4DC U+8446 # <cjk>
+0xE4DD U+842C # <cjk>
+0xE4DE U+846F # <cjk>
+0xE4DF U+8479 # <cjk>
+0xE4E0 U+8435 # <cjk>
+0xE4E1 U+84CA # <cjk>
+0xE4E2 U+8462 # <cjk>
+0xE4E3 U+84B9 # <cjk>
+0xE4E4 U+84BF # <cjk>
+0xE4E5 U+849F # <cjk>
+0xE4E6 U+84D9 # <cjk>
+0xE4E7 U+84CD # <cjk>
+0xE4E8 U+84BB # <cjk>
+0xE4E9 U+84DA # <cjk>
+0xE4EA U+84D0 # <cjk>
+0xE4EB U+84C1 # <cjk>
+0xE4EC U+84C6 # <cjk>
+0xE4ED U+84D6 # <cjk>
+0xE4EE U+84A1 # <cjk>
+0xE4EF U+8521 # <cjk>
+0xE4F0 U+84FF # <cjk>
+0xE4F1 U+84F4 # <cjk>
+0xE4F2 U+8517 # <cjk>
+0xE4F3 U+8518 # <cjk>
+0xE4F4 U+852C # <cjk>
+0xE4F5 U+851F # <cjk>
+0xE4F6 U+8515 # <cjk>
+0xE4F7 U+8514 # <cjk>
+0xE4F8 U+84FC # <cjk>
+0xE4F9 U+8540 # <cjk>
+0xE4FA U+8563 # <cjk>
+0xE4FB U+8558 # <cjk>
+0xE4FC U+8548 # <cjk>
+0xE540 U+8541 # <cjk>
+0xE541 U+8602 # <cjk>
+0xE542 U+854B # <cjk>
+0xE543 U+8555 # <cjk>
+0xE544 U+8580 # <cjk>
+0xE545 U+85A4 # <cjk>
+0xE546 U+8588 # <cjk>
+0xE547 U+8591 # <cjk>
+0xE548 U+858A # <cjk>
+0xE549 U+85A8 # <cjk>
+0xE54A U+856D # <cjk>
+0xE54B U+8594 # <cjk>
+0xE54C U+859B # <cjk>
+0xE54D U+85EA # <cjk>
+0xE54E U+8587 # <cjk>
+0xE54F U+859C # <cjk>
+0xE550 U+8577 # <cjk>
+0xE551 U+857E # <cjk>
+0xE552 U+8590 # <cjk>
+0xE553 U+85C9 # <cjk>
+0xE554 U+85BA # <cjk>
+0xE555 U+85CF # <cjk>
+0xE556 U+85B9 # <cjk>
+0xE557 U+85D0 # <cjk>
+0xE558 U+85D5 # <cjk>
+0xE559 U+85DD # <cjk>
+0xE55A U+85E5 # <cjk>
+0xE55B U+85DC # <cjk>
+0xE55C U+85F9 # <cjk>
+0xE55D U+860A # <cjk>
+0xE55E U+8613 # <cjk>
+0xE55F U+860B # <cjk>
+0xE560 U+85FE # <cjk>
+0xE561 U+85FA # <cjk>
+0xE562 U+8606 # <cjk>
+0xE563 U+8622 # <cjk>
+0xE564 U+861A # <cjk>
+0xE565 U+8630 # <cjk>
+0xE566 U+863F # <cjk>
+0xE567 U+864D # <cjk>
+0xE568 U+4E55 # <cjk>
+0xE569 U+8654 # <cjk>
+0xE56A U+865F # <cjk>
+0xE56B U+8667 # <cjk>
+0xE56C U+8671 # <cjk>
+0xE56D U+8693 # <cjk>
+0xE56E U+86A3 # <cjk>
+0xE56F U+86A9 # <cjk>
+0xE570 U+86AA # <cjk>
+0xE571 U+868B # <cjk>
+0xE572 U+868C # <cjk>
+0xE573 U+86B6 # <cjk>
+0xE574 U+86AF # <cjk>
+0xE575 U+86C4 # <cjk>
+0xE576 U+86C6 # <cjk>
+0xE577 U+86B0 # <cjk>
+0xE578 U+86C9 # <cjk>
+0xE579 U+8823 # <cjk>
+0xE57A U+86AB # <cjk>
+0xE57B U+86D4 # <cjk>
+0xE57C U+86DE # <cjk>
+0xE57D U+86E9 # <cjk>
+0xE57E U+86EC # <cjk>
+0xE580 U+86DF # <cjk>
+0xE581 U+86DB # <cjk>
+0xE582 U+86EF # <cjk>
+0xE583 U+8712 # <cjk>
+0xE584 U+8706 # <cjk>
+0xE585 U+8708 # <cjk>
+0xE586 U+8700 # <cjk>
+0xE587 U+8703 # <cjk>
+0xE588 U+86FB # <cjk>
+0xE589 U+8711 # <cjk>
+0xE58A U+8709 # <cjk>
+0xE58B U+870D # <cjk>
+0xE58C U+86F9 # <cjk>
+0xE58D U+870A # <cjk>
+0xE58E U+8734 # <cjk>
+0xE58F U+873F # <cjk>
+0xE590 U+8737 # <cjk>
+0xE591 U+873B # <cjk>
+0xE592 U+8725 # <cjk>
+0xE593 U+8729 # <cjk>
+0xE594 U+871A # <cjk>
+0xE595 U+8760 # <cjk>
+0xE596 U+875F # <cjk>
+0xE597 U+8778 # <cjk>
+0xE598 U+874C # <cjk>
+0xE599 U+874E # <cjk>
+0xE59A U+8774 # <cjk>
+0xE59B U+8757 # <cjk>
+0xE59C U+8768 # <cjk>
+0xE59D U+876E # <cjk>
+0xE59E U+8759 # <cjk>
+0xE59F U+8753 # <cjk>
+0xE5A0 U+8763 # <cjk>
+0xE5A1 U+876A # <cjk>
+0xE5A2 U+8805 # <cjk>
+0xE5A3 U+87A2 # <cjk>
+0xE5A4 U+879F # <cjk>
+0xE5A5 U+8782 # <cjk>
+0xE5A6 U+87AF # <cjk>
+0xE5A7 U+87CB # <cjk>
+0xE5A8 U+87BD # <cjk>
+0xE5A9 U+87C0 # <cjk>
+0xE5AA U+87D0 # <cjk>
+0xE5AB U+96D6 # <cjk>
+0xE5AC U+87AB # <cjk>
+0xE5AD U+87C4 # <cjk>
+0xE5AE U+87B3 # <cjk>
+0xE5AF U+87C7 # <cjk>
+0xE5B0 U+87C6 # <cjk>
+0xE5B1 U+87BB # <cjk>
+0xE5B2 U+87EF # <cjk>
+0xE5B3 U+87F2 # <cjk>
+0xE5B4 U+87E0 # <cjk>
+0xE5B5 U+880F # <cjk>
+0xE5B6 U+880D # <cjk>
+0xE5B7 U+87FE # <cjk>
+0xE5B8 U+87F6 # <cjk>
+0xE5B9 U+87F7 # <cjk>
+0xE5BA U+880E # <cjk>
+0xE5BB U+87D2 # <cjk>
+0xE5BC U+8811 # <cjk>
+0xE5BD U+8816 # <cjk>
+0xE5BE U+8815 # <cjk>
+0xE5BF U+8822 # <cjk>
+0xE5C0 U+8821 # <cjk>
+0xE5C1 U+8831 # <cjk>
+0xE5C2 U+8836 # <cjk>
+0xE5C3 U+8839 # <cjk>
+0xE5C4 U+8827 # <cjk>
+0xE5C5 U+883B # <cjk>
+0xE5C6 U+8844 # <cjk>
+0xE5C7 U+8842 # <cjk>
+0xE5C8 U+8852 # <cjk>
+0xE5C9 U+8859 # <cjk>
+0xE5CA U+885E # <cjk>
+0xE5CB U+8862 # <cjk>
+0xE5CC U+886B # <cjk>
+0xE5CD U+8881 # <cjk>
+0xE5CE U+887E # <cjk>
+0xE5CF U+889E # <cjk>
+0xE5D0 U+8875 # <cjk>
+0xE5D1 U+887D # <cjk>
+0xE5D2 U+88B5 # <cjk>
+0xE5D3 U+8872 # <cjk>
+0xE5D4 U+8882 # <cjk>
+0xE5D5 U+8897 # <cjk>
+0xE5D6 U+8892 # <cjk>
+0xE5D7 U+88AE # <cjk>
+0xE5D8 U+8899 # <cjk>
+0xE5D9 U+88A2 # <cjk>
+0xE5DA U+888D # <cjk>
+0xE5DB U+88A4 # <cjk>
+0xE5DC U+88B0 # <cjk>
+0xE5DD U+88BF # <cjk>
+0xE5DE U+88B1 # <cjk>
+0xE5DF U+88C3 # <cjk>
+0xE5E0 U+88C4 # <cjk>
+0xE5E1 U+88D4 # <cjk>
+0xE5E2 U+88D8 # <cjk>
+0xE5E3 U+88D9 # <cjk>
+0xE5E4 U+88DD # <cjk>
+0xE5E5 U+88F9 # <cjk>
+0xE5E6 U+8902 # <cjk>
+0xE5E7 U+88FC # <cjk>
+0xE5E8 U+88F4 # <cjk>
+0xE5E9 U+88E8 # <cjk>
+0xE5EA U+88F2 # <cjk>
+0xE5EB U+8904 # <cjk>
+0xE5EC U+890C # <cjk>
+0xE5ED U+890A # <cjk>
+0xE5EE U+8913 # <cjk>
+0xE5EF U+8943 # <cjk>
+0xE5F0 U+891E # <cjk>
+0xE5F1 U+8925 # <cjk>
+0xE5F2 U+892A # <cjk>
+0xE5F3 U+892B # <cjk>
+0xE5F4 U+8941 # <cjk>
+0xE5F5 U+8944 # <cjk>
+0xE5F6 U+893B # <cjk>
+0xE5F7 U+8936 # <cjk>
+0xE5F8 U+8938 # <cjk>
+0xE5F9 U+894C # <cjk>
+0xE5FA U+891D # <cjk>
+0xE5FB U+8960 # <cjk>
+0xE5FC U+895E # <cjk>
+0xE640 U+8966 # <cjk>
+0xE641 U+8964 # <cjk>
+0xE642 U+896D # <cjk>
+0xE643 U+896A # <cjk>
+0xE644 U+896F # <cjk>
+0xE645 U+8974 # <cjk>
+0xE646 U+8977 # <cjk>
+0xE647 U+897E # <cjk>
+0xE648 U+8983 # <cjk>
+0xE649 U+8988 # <cjk>
+0xE64A U+898A # <cjk>
+0xE64B U+8993 # <cjk>
+0xE64C U+8998 # <cjk>
+0xE64D U+89A1 # <cjk>
+0xE64E U+89A9 # <cjk>
+0xE64F U+89A6 # <cjk>
+0xE650 U+89AC # <cjk>
+0xE651 U+89AF # <cjk>
+0xE652 U+89B2 # <cjk>
+0xE653 U+89BA # <cjk>
+0xE654 U+89BD # <cjk>
+0xE655 U+89BF # <cjk>
+0xE656 U+89C0 # <cjk>
+0xE657 U+89DA # <cjk>
+0xE658 U+89DC # <cjk>
+0xE659 U+89DD # <cjk>
+0xE65A U+89E7 # <cjk>
+0xE65B U+89F4 # <cjk>
+0xE65C U+89F8 # <cjk>
+0xE65D U+8A03 # <cjk>
+0xE65E U+8A16 # <cjk>
+0xE65F U+8A10 # <cjk>
+0xE660 U+8A0C # <cjk>
+0xE661 U+8A1B # <cjk>
+0xE662 U+8A1D # <cjk>
+0xE663 U+8A25 # <cjk>
+0xE664 U+8A36 # <cjk>
+0xE665 U+8A41 # <cjk>
+0xE666 U+8A5B # <cjk>
+0xE667 U+8A52 # <cjk>
+0xE668 U+8A46 # <cjk>
+0xE669 U+8A48 # <cjk>
+0xE66A U+8A7C # <cjk>
+0xE66B U+8A6D # <cjk>
+0xE66C U+8A6C # <cjk>
+0xE66D U+8A62 # <cjk>
+0xE66E U+8A85 # <cjk>
+0xE66F U+8A82 # <cjk>
+0xE670 U+8A84 # <cjk>
+0xE671 U+8AA8 # <cjk>
+0xE672 U+8AA1 # <cjk>
+0xE673 U+8A91 # <cjk>
+0xE674 U+8AA5 # <cjk>
+0xE675 U+8AA6 # <cjk>
+0xE676 U+8A9A # <cjk>
+0xE677 U+8AA3 # <cjk>
+0xE678 U+8AC4 # <cjk>
+0xE679 U+8ACD # <cjk>
+0xE67A U+8AC2 # <cjk>
+0xE67B U+8ADA # <cjk>
+0xE67C U+8AEB # <cjk>
+0xE67D U+8AF3 # <cjk>
+0xE67E U+8AE7 # <cjk>
+0xE680 U+8AE4 # <cjk>
+0xE681 U+8AF1 # <cjk>
+0xE682 U+8B14 # <cjk>
+0xE683 U+8AE0 # <cjk>
+0xE684 U+8AE2 # <cjk>
+0xE685 U+8AF7 # <cjk>
+0xE686 U+8ADE # <cjk>
+0xE687 U+8ADB # <cjk>
+0xE688 U+8B0C # <cjk>
+0xE689 U+8B07 # <cjk>
+0xE68A U+8B1A # <cjk>
+0xE68B U+8AE1 # <cjk>
+0xE68C U+8B16 # <cjk>
+0xE68D U+8B10 # <cjk>
+0xE68E U+8B17 # <cjk>
+0xE68F U+8B20 # <cjk>
+0xE690 U+8B33 # <cjk>
+0xE691 U+97AB # <cjk>
+0xE692 U+8B26 # <cjk>
+0xE693 U+8B2B # <cjk>
+0xE694 U+8B3E # <cjk>
+0xE695 U+8B28 # <cjk>
+0xE696 U+8B41 # <cjk>
+0xE697 U+8B4C # <cjk>
+0xE698 U+8B4F # <cjk>
+0xE699 U+8B4E # <cjk>
+0xE69A U+8B49 # <cjk>
+0xE69B U+8B56 # <cjk>
+0xE69C U+8B5B # <cjk>
+0xE69D U+8B5A # <cjk>
+0xE69E U+8B6B # <cjk>
+0xE69F U+8B5F # <cjk>
+0xE6A0 U+8B6C # <cjk>
+0xE6A1 U+8B6F # <cjk>
+0xE6A2 U+8B74 # <cjk>
+0xE6A3 U+8B7D # <cjk>
+0xE6A4 U+8B80 # <cjk>
+0xE6A5 U+8B8C # <cjk>
+0xE6A6 U+8B8E # <cjk>
+0xE6A7 U+8B92 # <cjk>
+0xE6A8 U+8B93 # <cjk>
+0xE6A9 U+8B96 # <cjk>
+0xE6AA U+8B99 # <cjk>
+0xE6AB U+8B9A # <cjk>
+0xE6AC U+8C3A # <cjk>
+0xE6AD U+8C41 # <cjk>
+0xE6AE U+8C3F # <cjk>
+0xE6AF U+8C48 # <cjk>
+0xE6B0 U+8C4C # <cjk>
+0xE6B1 U+8C4E # <cjk>
+0xE6B2 U+8C50 # <cjk>
+0xE6B3 U+8C55 # <cjk>
+0xE6B4 U+8C62 # <cjk>
+0xE6B5 U+8C6C # <cjk>
+0xE6B6 U+8C78 # <cjk>
+0xE6B7 U+8C7A # <cjk>
+0xE6B8 U+8C82 # <cjk>
+0xE6B9 U+8C89 # <cjk>
+0xE6BA U+8C85 # <cjk>
+0xE6BB U+8C8A # <cjk>
+0xE6BC U+8C8D # <cjk>
+0xE6BD U+8C8E # <cjk>
+0xE6BE U+8C94 # <cjk>
+0xE6BF U+8C7C # <cjk>
+0xE6C0 U+8C98 # <cjk>
+0xE6C1 U+621D # <cjk>
+0xE6C2 U+8CAD # <cjk>
+0xE6C3 U+8CAA # <cjk>
+0xE6C4 U+8CBD # <cjk>
+0xE6C5 U+8CB2 # <cjk>
+0xE6C6 U+8CB3 # <cjk>
+0xE6C7 U+8CAE # <cjk>
+0xE6C8 U+8CB6 # <cjk>
+0xE6C9 U+8CC8 # <cjk>
+0xE6CA U+8CC1 # <cjk>
+0xE6CB U+8CE4 # <cjk>
+0xE6CC U+8CE3 # <cjk>
+0xE6CD U+8CDA # <cjk>
+0xE6CE U+8CFD # <cjk>
+0xE6CF U+8CFA # <cjk>
+0xE6D0 U+8CFB # <cjk>
+0xE6D1 U+8D04 # <cjk>
+0xE6D2 U+8D05 # <cjk>
+0xE6D3 U+8D0A # <cjk>
+0xE6D4 U+8D07 # <cjk>
+0xE6D5 U+8D0F # <cjk>
+0xE6D6 U+8D0D # <cjk>
+0xE6D7 U+8D10 # <cjk>
+0xE6D8 U+9F4E # <cjk>
+0xE6D9 U+8D13 # <cjk>
+0xE6DA U+8CCD # <cjk>
+0xE6DB U+8D14 # <cjk>
+0xE6DC U+8D16 # <cjk>
+0xE6DD U+8D67 # <cjk>
+0xE6DE U+8D6D # <cjk>
+0xE6DF U+8D71 # <cjk>
+0xE6E0 U+8D73 # <cjk>
+0xE6E1 U+8D81 # <cjk>
+0xE6E2 U+8D99 # <cjk>
+0xE6E3 U+8DC2 # <cjk>
+0xE6E4 U+8DBE # <cjk>
+0xE6E5 U+8DBA # <cjk>
+0xE6E6 U+8DCF # <cjk>
+0xE6E7 U+8DDA # <cjk>
+0xE6E8 U+8DD6 # <cjk>
+0xE6E9 U+8DCC # <cjk>
+0xE6EA U+8DDB # <cjk>
+0xE6EB U+8DCB # <cjk>
+0xE6EC U+8DEA # <cjk>
+0xE6ED U+8DEB # <cjk>
+0xE6EE U+8DDF # <cjk>
+0xE6EF U+8DE3 # <cjk>
+0xE6F0 U+8DFC # <cjk>
+0xE6F1 U+8E08 # <cjk>
+0xE6F2 U+8E09 # <cjk>
+0xE6F3 U+8DFF # <cjk>
+0xE6F4 U+8E1D # <cjk>
+0xE6F5 U+8E1E # <cjk>
+0xE6F6 U+8E10 # <cjk>
+0xE6F7 U+8E1F # <cjk>
+0xE6F8 U+8E42 # <cjk>
+0xE6F9 U+8E35 # <cjk>
+0xE6FA U+8E30 # <cjk>
+0xE6FB U+8E34 # <cjk>
+0xE6FC U+8E4A # <cjk>
+0xE740 U+8E47 # <cjk>
+0xE741 U+8E49 # <cjk>
+0xE742 U+8E4C # <cjk>
+0xE743 U+8E50 # <cjk>
+0xE744 U+8E48 # <cjk>
+0xE745 U+8E59 # <cjk>
+0xE746 U+8E64 # <cjk>
+0xE747 U+8E60 # <cjk>
+0xE748 U+8E2A # <cjk>
+0xE749 U+8E63 # <cjk>
+0xE74A U+8E55 # <cjk>
+0xE74B U+8E76 # <cjk>
+0xE74C U+8E72 # <cjk>
+0xE74D U+8E7C # <cjk>
+0xE74E U+8E81 # <cjk>
+0xE74F U+8E87 # <cjk>
+0xE750 U+8E85 # <cjk>
+0xE751 U+8E84 # <cjk>
+0xE752 U+8E8B # <cjk>
+0xE753 U+8E8A # <cjk>
+0xE754 U+8E93 # <cjk>
+0xE755 U+8E91 # <cjk>
+0xE756 U+8E94 # <cjk>
+0xE757 U+8E99 # <cjk>
+0xE758 U+8EAA # <cjk>
+0xE759 U+8EA1 # <cjk>
+0xE75A U+8EAC # <cjk>
+0xE75B U+8EB0 # <cjk>
+0xE75C U+8EC6 # <cjk>
+0xE75D U+8EB1 # <cjk>
+0xE75E U+8EBE # <cjk>
+0xE75F U+8EC5 # <cjk>
+0xE760 U+8EC8 # <cjk>
+0xE761 U+8ECB # <cjk>
+0xE762 U+8EDB # <cjk>
+0xE763 U+8EE3 # <cjk>
+0xE764 U+8EFC # <cjk>
+0xE765 U+8EFB # <cjk>
+0xE766 U+8EEB # <cjk>
+0xE767 U+8EFE # <cjk>
+0xE768 U+8F0A # <cjk>
+0xE769 U+8F05 # <cjk>
+0xE76A U+8F15 # <cjk>
+0xE76B U+8F12 # <cjk>
+0xE76C U+8F19 # <cjk>
+0xE76D U+8F13 # <cjk>
+0xE76E U+8F1C # <cjk>
+0xE76F U+8F1F # <cjk>
+0xE770 U+8F1B # <cjk>
+0xE771 U+8F0C # <cjk>
+0xE772 U+8F26 # <cjk>
+0xE773 U+8F33 # <cjk>
+0xE774 U+8F3B # <cjk>
+0xE775 U+8F39 # <cjk>
+0xE776 U+8F45 # <cjk>
+0xE777 U+8F42 # <cjk>
+0xE778 U+8F3E # <cjk>
+0xE779 U+8F4C # <cjk>
+0xE77A U+8F49 # <cjk>
+0xE77B U+8F46 # <cjk>
+0xE77C U+8F4E # <cjk>
+0xE77D U+8F57 # <cjk>
+0xE77E U+8F5C # <cjk>
+0xE780 U+8F62 # <cjk>
+0xE781 U+8F63 # <cjk>
+0xE782 U+8F64 # <cjk>
+0xE783 U+8F9C # <cjk>
+0xE784 U+8F9F # <cjk>
+0xE785 U+8FA3 # <cjk>
+0xE786 U+8FAD # <cjk>
+0xE787 U+8FAF # <cjk>
+0xE788 U+8FB7 # <cjk>
+0xE789 U+8FDA # <cjk>
+0xE78A U+8FE5 # <cjk>
+0xE78B U+8FE2 # <cjk>
+0xE78C U+8FEA # <cjk>
+0xE78D U+8FEF # <cjk>
+0xE78E U+9087 # <cjk>
+0xE78F U+8FF4 # <cjk>
+0xE790 U+9005 # <cjk>
+0xE791 U+8FF9 # <cjk>
+0xE792 U+8FFA # <cjk>
+0xE793 U+9011 # <cjk>
+0xE794 U+9015 # <cjk>
+0xE795 U+9021 # <cjk>
+0xE796 U+900D # <cjk>
+0xE797 U+901E # <cjk>
+0xE798 U+9016 # <cjk>
+0xE799 U+900B # <cjk>
+0xE79A U+9027 # <cjk>
+0xE79B U+9036 # <cjk>
+0xE79C U+9035 # <cjk>
+0xE79D U+9039 # <cjk>
+0xE79E U+8FF8 # <cjk>
+0xE79F U+904F # <cjk>
+0xE7A0 U+9050 # <cjk>
+0xE7A1 U+9051 # <cjk>
+0xE7A2 U+9052 # <cjk>
+0xE7A3 U+900E # <cjk>
+0xE7A4 U+9049 # <cjk>
+0xE7A5 U+903E # <cjk>
+0xE7A6 U+9056 # <cjk>
+0xE7A7 U+9058 # <cjk>
+0xE7A8 U+905E # <cjk>
+0xE7A9 U+9068 # <cjk>
+0xE7AA U+906F # <cjk>
+0xE7AB U+9076 # <cjk>
+0xE7AC U+96A8 # <cjk>
+0xE7AD U+9072 # <cjk>
+0xE7AE U+9082 # <cjk>
+0xE7AF U+907D # <cjk>
+0xE7B0 U+9081 # <cjk>
+0xE7B1 U+9080 # <cjk>
+0xE7B2 U+908A # <cjk>
+0xE7B3 U+9089 # <cjk>
+0xE7B4 U+908F # <cjk>
+0xE7B5 U+90A8 # <cjk>
+0xE7B6 U+90AF # <cjk>
+0xE7B7 U+90B1 # <cjk>
+0xE7B8 U+90B5 # <cjk>
+0xE7B9 U+90E2 # <cjk>
+0xE7BA U+90E4 # <cjk>
+0xE7BB U+6248 # <cjk>
+0xE7BC U+90DB # <cjk>
+0xE7BD U+9102 # <cjk>
+0xE7BE U+9112 # <cjk>
+0xE7BF U+9119 # <cjk>
+0xE7C0 U+9132 # <cjk>
+0xE7C1 U+9130 # <cjk>
+0xE7C2 U+914A # <cjk>
+0xE7C3 U+9156 # <cjk>
+0xE7C4 U+9158 # <cjk>
+0xE7C5 U+9163 # <cjk>
+0xE7C6 U+9165 # <cjk>
+0xE7C7 U+9169 # <cjk>
+0xE7C8 U+9173 # <cjk>
+0xE7C9 U+9172 # <cjk>
+0xE7CA U+918B # <cjk>
+0xE7CB U+9189 # <cjk>
+0xE7CC U+9182 # <cjk>
+0xE7CD U+91A2 # <cjk>
+0xE7CE U+91AB # <cjk>
+0xE7CF U+91AF # <cjk>
+0xE7D0 U+91AA # <cjk>
+0xE7D1 U+91B5 # <cjk>
+0xE7D2 U+91B4 # <cjk>
+0xE7D3 U+91BA # <cjk>
+0xE7D4 U+91C0 # <cjk>
+0xE7D5 U+91C1 # <cjk>
+0xE7D6 U+91C9 # <cjk>
+0xE7D7 U+91CB # <cjk>
+0xE7D8 U+91D0 # <cjk>
+0xE7D9 U+91D6 # <cjk>
+0xE7DA U+91DF # <cjk>
+0xE7DB U+91E1 # <cjk>
+0xE7DC U+91DB # <cjk>
+0xE7DD U+91FC # <cjk>
+0xE7DE U+91F5 # <cjk>
+0xE7DF U+91F6 # <cjk>
+0xE7E0 U+921E # <cjk>
+0xE7E1 U+91FF # <cjk>
+0xE7E2 U+9214 # <cjk>
+0xE7E3 U+922C # <cjk>
+0xE7E4 U+9215 # <cjk>
+0xE7E5 U+9211 # <cjk>
+0xE7E6 U+925E # <cjk>
+0xE7E7 U+9257 # <cjk>
+0xE7E8 U+9245 # <cjk>
+0xE7E9 U+9249 # <cjk>
+0xE7EA U+9264 # <cjk>
+0xE7EB U+9248 # <cjk>
+0xE7EC U+9295 # <cjk>
+0xE7ED U+923F # <cjk>
+0xE7EE U+924B # <cjk>
+0xE7EF U+9250 # <cjk>
+0xE7F0 U+929C # <cjk>
+0xE7F1 U+9296 # <cjk>
+0xE7F2 U+9293 # <cjk>
+0xE7F3 U+929B # <cjk>
+0xE7F4 U+925A # <cjk>
+0xE7F5 U+92CF # <cjk>
+0xE7F6 U+92B9 # <cjk>
+0xE7F7 U+92B7 # <cjk>
+0xE7F8 U+92E9 # <cjk>
+0xE7F9 U+930F # <cjk>
+0xE7FA U+92FA # <cjk>
+0xE7FB U+9344 # <cjk>
+0xE7FC U+932E # <cjk>
+0xE840 U+9319 # <cjk>
+0xE841 U+9322 # <cjk>
+0xE842 U+931A # <cjk>
+0xE843 U+9323 # <cjk>
+0xE844 U+933A # <cjk>
+0xE845 U+9335 # <cjk>
+0xE846 U+933B # <cjk>
+0xE847 U+935C # <cjk>
+0xE848 U+9360 # <cjk>
+0xE849 U+937C # <cjk>
+0xE84A U+936E # <cjk>
+0xE84B U+9356 # <cjk>
+0xE84C U+93B0 # <cjk>
+0xE84D U+93AC # <cjk>
+0xE84E U+93AD # <cjk>
+0xE84F U+9394 # <cjk>
+0xE850 U+93B9 # <cjk>
+0xE851 U+93D6 # <cjk>
+0xE852 U+93D7 # <cjk>
+0xE853 U+93E8 # <cjk>
+0xE854 U+93E5 # <cjk>
+0xE855 U+93D8 # <cjk>
+0xE856 U+93C3 # <cjk>
+0xE857 U+93DD # <cjk>
+0xE858 U+93D0 # <cjk>
+0xE859 U+93C8 # <cjk>
+0xE85A U+93E4 # <cjk>
+0xE85B U+941A # <cjk>
+0xE85C U+9414 # <cjk>
+0xE85D U+9413 # <cjk>
+0xE85E U+9403 # <cjk>
+0xE85F U+9407 # <cjk>
+0xE860 U+9410 # <cjk>
+0xE861 U+9436 # <cjk>
+0xE862 U+942B # <cjk>
+0xE863 U+9435 # <cjk>
+0xE864 U+9421 # <cjk>
+0xE865 U+943A # <cjk>
+0xE866 U+9441 # <cjk>
+0xE867 U+9452 # <cjk>
+0xE868 U+9444 # <cjk>
+0xE869 U+945B # <cjk>
+0xE86A U+9460 # <cjk>
+0xE86B U+9462 # <cjk>
+0xE86C U+945E # <cjk>
+0xE86D U+946A # <cjk>
+0xE86E U+9229 # <cjk>
+0xE86F U+9470 # <cjk>
+0xE870 U+9475 # <cjk>
+0xE871 U+9477 # <cjk>
+0xE872 U+947D # <cjk>
+0xE873 U+945A # <cjk>
+0xE874 U+947C # <cjk>
+0xE875 U+947E # <cjk>
+0xE876 U+9481 # <cjk>
+0xE877 U+947F # <cjk>
+0xE878 U+9582 # <cjk>
+0xE879 U+9587 # <cjk>
+0xE87A U+958A # <cjk>
+0xE87B U+9594 # <cjk>
+0xE87C U+9596 # <cjk>
+0xE87D U+9598 # <cjk>
+0xE87E U+9599 # <cjk>
+0xE880 U+95A0 # <cjk>
+0xE881 U+95A8 # <cjk>
+0xE882 U+95A7 # <cjk>
+0xE883 U+95AD # <cjk>
+0xE884 U+95BC # <cjk>
+0xE885 U+95BB # <cjk>
+0xE886 U+95B9 # <cjk>
+0xE887 U+95BE # <cjk>
+0xE888 U+95CA # <cjk>
+0xE889 U+6FF6 # <cjk>
+0xE88A U+95C3 # <cjk>
+0xE88B U+95CD # <cjk>
+0xE88C U+95CC # <cjk>
+0xE88D U+95D5 # <cjk>
+0xE88E U+95D4 # <cjk>
+0xE88F U+95D6 # <cjk>
+0xE890 U+95DC # <cjk>
+0xE891 U+95E1 # <cjk>
+0xE892 U+95E5 # <cjk>
+0xE893 U+95E2 # <cjk>
+0xE894 U+9621 # <cjk>
+0xE895 U+9628 # <cjk>
+0xE896 U+962E # <cjk>
+0xE897 U+962F # <cjk>
+0xE898 U+9642 # <cjk>
+0xE899 U+964C # <cjk>
+0xE89A U+964F # <cjk>
+0xE89B U+964B # <cjk>
+0xE89C U+9677 # <cjk>
+0xE89D U+965C # <cjk>
+0xE89E U+965E # <cjk>
+0xE89F U+965D # <cjk>
+0xE8A0 U+965F # <cjk>
+0xE8A1 U+9666 # <cjk>
+0xE8A2 U+9672 # <cjk>
+0xE8A3 U+966C # <cjk>
+0xE8A4 U+968D # <cjk>
+0xE8A5 U+9698 # <cjk>
+0xE8A6 U+9695 # <cjk>
+0xE8A7 U+9697 # <cjk>
+0xE8A8 U+96AA # <cjk>
+0xE8A9 U+96A7 # <cjk>
+0xE8AA U+96B1 # <cjk>
+0xE8AB U+96B2 # <cjk>
+0xE8AC U+96B0 # <cjk>
+0xE8AD U+96B4 # <cjk>
+0xE8AE U+96B6 # <cjk>
+0xE8AF U+96B8 # <cjk>
+0xE8B0 U+96B9 # <cjk>
+0xE8B1 U+96CE # <cjk>
+0xE8B2 U+96CB # <cjk>
+0xE8B3 U+96C9 # <cjk>
+0xE8B4 U+96CD # <cjk>
+0xE8B5 U+894D # <cjk>
+0xE8B6 U+96DC # <cjk>
+0xE8B7 U+970D # <cjk>
+0xE8B8 U+96D5 # <cjk>
+0xE8B9 U+96F9 # <cjk>
+0xE8BA U+9704 # <cjk>
+0xE8BB U+9706 # <cjk>
+0xE8BC U+9708 # <cjk>
+0xE8BD U+9713 # <cjk>
+0xE8BE U+970E # <cjk>
+0xE8BF U+9711 # <cjk>
+0xE8C0 U+970F # <cjk>
+0xE8C1 U+9716 # <cjk>
+0xE8C2 U+9719 # <cjk>
+0xE8C3 U+9724 # <cjk>
+0xE8C4 U+972A # <cjk>
+0xE8C5 U+9730 # <cjk>
+0xE8C6 U+9739 # <cjk>
+0xE8C7 U+973D # <cjk>
+0xE8C8 U+973E # <cjk>
+0xE8C9 U+9744 # <cjk>
+0xE8CA U+9746 # <cjk>
+0xE8CB U+9748 # <cjk>
+0xE8CC U+9742 # <cjk>
+0xE8CD U+9749 # <cjk>
+0xE8CE U+975C # <cjk>
+0xE8CF U+9760 # <cjk>
+0xE8D0 U+9764 # <cjk>
+0xE8D1 U+9766 # <cjk>
+0xE8D2 U+9768 # <cjk>
+0xE8D3 U+52D2 # <cjk>
+0xE8D4 U+976B # <cjk>
+0xE8D5 U+9771 # <cjk>
+0xE8D6 U+9779 # <cjk>
+0xE8D7 U+9785 # <cjk>
+0xE8D8 U+977C # <cjk>
+0xE8D9 U+9781 # <cjk>
+0xE8DA U+977A # <cjk>
+0xE8DB U+9786 # <cjk>
+0xE8DC U+978B # <cjk>
+0xE8DD U+978F # <cjk>
+0xE8DE U+9790 # <cjk>
+0xE8DF U+979C # <cjk>
+0xE8E0 U+97A8 # <cjk>
+0xE8E1 U+97A6 # <cjk>
+0xE8E2 U+97A3 # <cjk>
+0xE8E3 U+97B3 # <cjk>
+0xE8E4 U+97B4 # <cjk>
+0xE8E5 U+97C3 # <cjk>
+0xE8E6 U+97C6 # <cjk>
+0xE8E7 U+97C8 # <cjk>
+0xE8E8 U+97CB # <cjk>
+0xE8E9 U+97DC # <cjk>
+0xE8EA U+97ED # <cjk>
+0xE8EB U+9F4F # <cjk>
+0xE8EC U+97F2 # <cjk>
+0xE8ED U+7ADF # <cjk>
+0xE8EE U+97F6 # <cjk>
+0xE8EF U+97F5 # <cjk>
+0xE8F0 U+980F # <cjk>
+0xE8F1 U+980C # <cjk>
+0xE8F2 U+9838 # <cjk>
+0xE8F3 U+9824 # <cjk>
+0xE8F4 U+9821 # <cjk>
+0xE8F5 U+9837 # <cjk>
+0xE8F6 U+983D # <cjk>
+0xE8F7 U+9846 # <cjk>
+0xE8F8 U+984F # <cjk>
+0xE8F9 U+984B # <cjk>
+0xE8FA U+986B # <cjk>
+0xE8FB U+986F # <cjk>
+0xE8FC U+9870 # <cjk>
+0xE940 U+9871 # <cjk>
+0xE941 U+9874 # <cjk>
+0xE942 U+9873 # <cjk>
+0xE943 U+98AA # <cjk>
+0xE944 U+98AF # <cjk>
+0xE945 U+98B1 # <cjk>
+0xE946 U+98B6 # <cjk>
+0xE947 U+98C4 # <cjk>
+0xE948 U+98C3 # <cjk>
+0xE949 U+98C6 # <cjk>
+0xE94A U+98E9 # <cjk>
+0xE94B U+98EB # <cjk>
+0xE94C U+9903 # <cjk>
+0xE94D U+9909 # <cjk>
+0xE94E U+9912 # <cjk>
+0xE94F U+9914 # <cjk>
+0xE950 U+9918 # <cjk>
+0xE951 U+9921 # <cjk>
+0xE952 U+991D # <cjk>
+0xE953 U+991E # <cjk>
+0xE954 U+9924 # <cjk>
+0xE955 U+9920 # <cjk>
+0xE956 U+992C # <cjk>
+0xE957 U+992E # <cjk>
+0xE958 U+993D # <cjk>
+0xE959 U+993E # <cjk>
+0xE95A U+9942 # <cjk>
+0xE95B U+9949 # <cjk>
+0xE95C U+9945 # <cjk>
+0xE95D U+9950 # <cjk>
+0xE95E U+994B # <cjk>
+0xE95F U+9951 # <cjk>
+0xE960 U+9952 # <cjk>
+0xE961 U+994C # <cjk>
+0xE962 U+9955 # <cjk>
+0xE963 U+9997 # <cjk>
+0xE964 U+9998 # <cjk>
+0xE965 U+99A5 # <cjk>
+0xE966 U+99AD # <cjk>
+0xE967 U+99AE # <cjk>
+0xE968 U+99BC # <cjk>
+0xE969 U+99DF # <cjk>
+0xE96A U+99DB # <cjk>
+0xE96B U+99DD # <cjk>
+0xE96C U+99D8 # <cjk>
+0xE96D U+99D1 # <cjk>
+0xE96E U+99ED # <cjk>
+0xE96F U+99EE # <cjk>
+0xE970 U+99F1 # <cjk>
+0xE971 U+99F2 # <cjk>
+0xE972 U+99FB # <cjk>
+0xE973 U+99F8 # <cjk>
+0xE974 U+9A01 # <cjk>
+0xE975 U+9A0F # <cjk>
+0xE976 U+9A05 # <cjk>
+0xE977 U+99E2 # <cjk>
+0xE978 U+9A19 # <cjk>
+0xE979 U+9A2B # <cjk>
+0xE97A U+9A37 # <cjk>
+0xE97B U+9A45 # <cjk>
+0xE97C U+9A42 # <cjk>
+0xE97D U+9A40 # <cjk>
+0xE97E U+9A43 # <cjk>
+0xE980 U+9A3E # <cjk>
+0xE981 U+9A55 # <cjk>
+0xE982 U+9A4D # <cjk>
+0xE983 U+9A5B # <cjk>
+0xE984 U+9A57 # <cjk>
+0xE985 U+9A5F # <cjk>
+0xE986 U+9A62 # <cjk>
+0xE987 U+9A65 # <cjk>
+0xE988 U+9A64 # <cjk>
+0xE989 U+9A69 # <cjk>
+0xE98A U+9A6B # <cjk>
+0xE98B U+9A6A # <cjk>
+0xE98C U+9AAD # <cjk>
+0xE98D U+9AB0 # <cjk>
+0xE98E U+9ABC # <cjk>
+0xE98F U+9AC0 # <cjk>
+0xE990 U+9ACF # <cjk>
+0xE991 U+9AD1 # <cjk>
+0xE992 U+9AD3 # <cjk>
+0xE993 U+9AD4 # <cjk>
+0xE994 U+9ADE # <cjk>
+0xE995 U+9ADF # <cjk>
+0xE996 U+9AE2 # <cjk>
+0xE997 U+9AE3 # <cjk>
+0xE998 U+9AE6 # <cjk>
+0xE999 U+9AEF # <cjk>
+0xE99A U+9AEB # <cjk>
+0xE99B U+9AEE # <cjk>
+0xE99C U+9AF4 # <cjk>
+0xE99D U+9AF1 # <cjk>
+0xE99E U+9AF7 # <cjk>
+0xE99F U+9AFB # <cjk>
+0xE9A0 U+9B06 # <cjk>
+0xE9A1 U+9B18 # <cjk>
+0xE9A2 U+9B1A # <cjk>
+0xE9A3 U+9B1F # <cjk>
+0xE9A4 U+9B22 # <cjk>
+0xE9A5 U+9B23 # <cjk>
+0xE9A6 U+9B25 # <cjk>
+0xE9A7 U+9B27 # <cjk>
+0xE9A8 U+9B28 # <cjk>
+0xE9A9 U+9B29 # <cjk>
+0xE9AA U+9B2A # <cjk>
+0xE9AB U+9B2E # <cjk>
+0xE9AC U+9B2F # <cjk>
+0xE9AD U+9B32 # <cjk>
+0xE9AE U+9B44 # <cjk>
+0xE9AF U+9B43 # <cjk>
+0xE9B0 U+9B4F # <cjk>
+0xE9B1 U+9B4D # <cjk>
+0xE9B2 U+9B4E # <cjk>
+0xE9B3 U+9B51 # <cjk>
+0xE9B4 U+9B58 # <cjk>
+0xE9B5 U+9B74 # <cjk>
+0xE9B6 U+9B93 # <cjk>
+0xE9B7 U+9B83 # <cjk>
+0xE9B8 U+9B91 # <cjk>
+0xE9B9 U+9B96 # <cjk>
+0xE9BA U+9B97 # <cjk>
+0xE9BB U+9B9F # <cjk>
+0xE9BC U+9BA0 # <cjk>
+0xE9BD U+9BA8 # <cjk>
+0xE9BE U+9BB4 # <cjk>
+0xE9BF U+9BC0 # <cjk>
+0xE9C0 U+9BCA # <cjk>
+0xE9C1 U+9BB9 # <cjk>
+0xE9C2 U+9BC6 # <cjk>
+0xE9C3 U+9BCF # <cjk>
+0xE9C4 U+9BD1 # <cjk>
+0xE9C5 U+9BD2 # <cjk>
+0xE9C6 U+9BE3 # <cjk>
+0xE9C7 U+9BE2 # <cjk>
+0xE9C8 U+9BE4 # <cjk>
+0xE9C9 U+9BD4 # <cjk>
+0xE9CA U+9BE1 # <cjk>
+0xE9CB U+9C3A # <cjk>
+0xE9CC U+9BF2 # <cjk>
+0xE9CD U+9BF1 # <cjk>
+0xE9CE U+9BF0 # <cjk>
+0xE9CF U+9C15 # <cjk>
+0xE9D0 U+9C14 # <cjk>
+0xE9D1 U+9C09 # <cjk>
+0xE9D2 U+9C13 # <cjk>
+0xE9D3 U+9C0C # <cjk>
+0xE9D4 U+9C06 # <cjk>
+0xE9D5 U+9C08 # <cjk>
+0xE9D6 U+9C12 # <cjk>
+0xE9D7 U+9C0A # <cjk>
+0xE9D8 U+9C04 # <cjk>
+0xE9D9 U+9C2E # <cjk>
+0xE9DA U+9C1B # <cjk>
+0xE9DB U+9C25 # <cjk>
+0xE9DC U+9C24 # <cjk>
+0xE9DD U+9C21 # <cjk>
+0xE9DE U+9C30 # <cjk>
+0xE9DF U+9C47 # <cjk>
+0xE9E0 U+9C32 # <cjk>
+0xE9E1 U+9C46 # <cjk>
+0xE9E2 U+9C3E # <cjk>
+0xE9E3 U+9C5A # <cjk>
+0xE9E4 U+9C60 # <cjk>
+0xE9E5 U+9C67 # <cjk>
+0xE9E6 U+9C76 # <cjk>
+0xE9E7 U+9C78 # <cjk>
+0xE9E8 U+9CE7 # <cjk>
+0xE9E9 U+9CEC # <cjk>
+0xE9EA U+9CF0 # <cjk>
+0xE9EB U+9D09 # <cjk>
+0xE9EC U+9D08 # <cjk>
+0xE9ED U+9CEB # <cjk>
+0xE9EE U+9D03 # <cjk>
+0xE9EF U+9D06 # <cjk>
+0xE9F0 U+9D2A # <cjk>
+0xE9F1 U+9D26 # <cjk>
+0xE9F2 U+9DAF # <cjk>
+0xE9F3 U+9D23 # <cjk>
+0xE9F4 U+9D1F # <cjk>
+0xE9F5 U+9D44 # <cjk>
+0xE9F6 U+9D15 # <cjk>
+0xE9F7 U+9D12 # <cjk>
+0xE9F8 U+9D41 # <cjk>
+0xE9F9 U+9D3F # <cjk>
+0xE9FA U+9D3E # <cjk>
+0xE9FB U+9D46 # <cjk>
+0xE9FC U+9D48 # <cjk>
+0xEA40 U+9D5D # <cjk>
+0xEA41 U+9D5E # <cjk>
+0xEA42 U+9D64 # <cjk>
+0xEA43 U+9D51 # <cjk>
+0xEA44 U+9D50 # <cjk>
+0xEA45 U+9D59 # <cjk>
+0xEA46 U+9D72 # <cjk>
+0xEA47 U+9D89 # <cjk>
+0xEA48 U+9D87 # <cjk>
+0xEA49 U+9DAB # <cjk>
+0xEA4A U+9D6F # <cjk>
+0xEA4B U+9D7A # <cjk>
+0xEA4C U+9D9A # <cjk>
+0xEA4D U+9DA4 # <cjk>
+0xEA4E U+9DA9 # <cjk>
+0xEA4F U+9DB2 # <cjk>
+0xEA50 U+9DC4 # <cjk>
+0xEA51 U+9DC1 # <cjk>
+0xEA52 U+9DBB # <cjk>
+0xEA53 U+9DB8 # <cjk>
+0xEA54 U+9DBA # <cjk>
+0xEA55 U+9DC6 # <cjk>
+0xEA56 U+9DCF # <cjk>
+0xEA57 U+9DC2 # <cjk>
+0xEA58 U+9DD9 # <cjk>
+0xEA59 U+9DD3 # <cjk>
+0xEA5A U+9DF8 # <cjk>
+0xEA5B U+9DE6 # <cjk>
+0xEA5C U+9DED # <cjk>
+0xEA5D U+9DEF # <cjk>
+0xEA5E U+9DFD # <cjk>
+0xEA5F U+9E1A # <cjk>
+0xEA60 U+9E1B # <cjk>
+0xEA61 U+9E1E # <cjk>
+0xEA62 U+9E75 # <cjk>
+0xEA63 U+9E79 # <cjk>
+0xEA64 U+9E7D # <cjk>
+0xEA65 U+9E81 # <cjk>
+0xEA66 U+9E88 # <cjk>
+0xEA67 U+9E8B # <cjk>
+0xEA68 U+9E8C # <cjk>
+0xEA69 U+9E92 # <cjk>
+0xEA6A U+9E95 # <cjk>
+0xEA6B U+9E91 # <cjk>
+0xEA6C U+9E9D # <cjk>
+0xEA6D U+9EA5 # <cjk>
+0xEA6E U+9EA9 # <cjk>
+0xEA6F U+9EB8 # <cjk>
+0xEA70 U+9EAA # <cjk>
+0xEA71 U+9EAD # <cjk>
+0xEA72 U+9761 # <cjk>
+0xEA73 U+9ECC # <cjk>
+0xEA74 U+9ECE # <cjk>
+0xEA75 U+9ECF # <cjk>
+0xEA76 U+9ED0 # <cjk>
+0xEA77 U+9ED4 # <cjk>
+0xEA78 U+9EDC # <cjk>
+0xEA79 U+9EDE # <cjk>
+0xEA7A U+9EDD # <cjk>
+0xEA7B U+9EE0 # <cjk>
+0xEA7C U+9EE5 # <cjk>
+0xEA7D U+9EE8 # <cjk>
+0xEA7E U+9EEF # <cjk>
+0xEA80 U+9EF4 # <cjk>
+0xEA81 U+9EF6 # <cjk>
+0xEA82 U+9EF7 # <cjk>
+0xEA83 U+9EF9 # <cjk>
+0xEA84 U+9EFB # <cjk>
+0xEA85 U+9EFC # <cjk>
+0xEA86 U+9EFD # <cjk>
+0xEA87 U+9F07 # <cjk>
+0xEA88 U+9F08 # <cjk>
+0xEA89 U+76B7 # <cjk>
+0xEA8A U+9F15 # <cjk>
+0xEA8B U+9F21 # <cjk>
+0xEA8C U+9F2C # <cjk>
+0xEA8D U+9F3E # <cjk>
+0xEA8E U+9F4A # <cjk>
+0xEA8F U+9F52 # <cjk>
+0xEA90 U+9F54 # <cjk>
+0xEA91 U+9F63 # <cjk>
+0xEA92 U+9F5F # <cjk>
+0xEA93 U+9F60 # <cjk>
+0xEA94 U+9F61 # <cjk>
+0xEA95 U+9F66 # <cjk>
+0xEA96 U+9F67 # <cjk>
+0xEA97 U+9F6C # <cjk>
+0xEA98 U+9F6A # <cjk>
+0xEA99 U+9F77 # <cjk>
+0xEA9A U+9F72 # <cjk>
+0xEA9B U+9F76 # <cjk>
+0xEA9C U+9F95 # <cjk>
+0xEA9D U+9F9C # <cjk>
+0xEA9E U+9FA0 # <cjk>
+0xEA9F U+582F # <cjk> [1983]
+0xEAA0 U+69C7 # <cjk> [1983]
+0xEAA1 U+9059 # <cjk> [1983]
+0xEAA2 U+7464 # <cjk> [1983]
+0xEAA3 U+51DC # <cjk> [1990]
+0xEAA4 U+7199 # <cjk> [1990]
+0xEAA5 U+5653 # <cjk> [2004]
+0xEAA6 U+5DE2 # <cjk> [2000]
+0xEAA7 U+5E14 # <cjk> [2000]
+0xEAA8 U+5E18 # <cjk> [2000]
+0xEAA9 U+5E58 # <cjk> [2000]
+0xEAAA U+5E5E # <cjk> [2000]
+0xEAAB U+5EBE # <cjk> [2000]
+0xEAAC U+F928 # CJK COMPATIBILITY IDEOGRAPH-F928 [2000]
+0xEAAD U+5ECB # <cjk> [2000]
+0xEAAE U+5EF9 # <cjk> [2000]
+0xEAAF U+5F00 # <cjk> [2000]
+0xEAB0 U+5F02 # <cjk> [2000]
+0xEAB1 U+5F07 # <cjk> [2000]
+0xEAB2 U+5F1D # <cjk> [2000]
+0xEAB3 U+5F23 # <cjk> [2000]
+0xEAB4 U+5F34 # <cjk> [2000]
+0xEAB5 U+5F36 # <cjk> [2000]
+0xEAB6 U+5F3D # <cjk> [2000]
+0xEAB7 U+5F40 # <cjk> [2000]
+0xEAB8 U+5F45 # <cjk> [2000]
+0xEAB9 U+5F54 # <cjk> [2000]
+0xEABA U+5F58 # <cjk> [2000]
+0xEABB U+5F64 # <cjk> [2000]
+0xEABC U+5F67 # <cjk> [2000]
+0xEABD U+5F7D # <cjk> [2000]
+0xEABE U+5F89 # <cjk> [2000]
+0xEABF U+5F9C # <cjk> [2000]
+0xEAC0 U+5FA7 # <cjk> [2000]
+0xEAC1 U+5FAF # <cjk> [2000]
+0xEAC2 U+5FB5 # <cjk> [2000]
+0xEAC3 U+5FB7 # <cjk> [2000]
+0xEAC4 U+5FC9 # <cjk> [2000]
+0xEAC5 U+5FDE # <cjk> [2000]
+0xEAC6 U+5FE1 # <cjk> [2000]
+0xEAC7 U+5FE9 # <cjk> [2000]
+0xEAC8 U+600D # <cjk> [2000]
+0xEAC9 U+6014 # <cjk> [2000]
+0xEACA U+6018 # <cjk> [2000]
+0xEACB U+6033 # <cjk> [2000]
+0xEACC U+6035 # <cjk> [2000]
+0xEACD U+6047 # <cjk> [2000]
+0xEACE U+FA3D # CJK COMPATIBILITY IDEOGRAPH-FA3D [2000] [Unicode3.2]
+0xEACF U+609D # <cjk> [2000]
+0xEAD0 U+609E # <cjk> [2000]
+0xEAD1 U+60CB # <cjk> [2000]
+0xEAD2 U+60D4 # <cjk> [2000]
+0xEAD3 U+60D5 # <cjk> [2000]
+0xEAD4 U+60DD # <cjk> [2000]
+0xEAD5 U+60F8 # <cjk> [2000]
+0xEAD6 U+611C # <cjk> [2000]
+0xEAD7 U+612B # <cjk> [2000]
+0xEAD8 U+6130 # <cjk> [2000]
+0xEAD9 U+6137 # <cjk> [2000]
+0xEADA U+FA3E # CJK COMPATIBILITY IDEOGRAPH-FA3E [2000] [Unicode3.2]
+0xEADB U+618D # <cjk> [2000]
+0xEADC U+FA3F # CJK COMPATIBILITY IDEOGRAPH-FA3F [2000] [Unicode3.2]
+0xEADD U+61BC # <cjk> [2000]
+0xEADE U+61B9 # <cjk> [2000]
+0xEADF U+FA40 # CJK COMPATIBILITY IDEOGRAPH-FA40 [2000] [Unicode3.2]
+0xEAE0 U+6222 # <cjk> [2000]
+0xEAE1 U+623E # <cjk> [2000]
+0xEAE2 U+6243 # <cjk> [2000]
+0xEAE3 U+6256 # <cjk> [2000]
+0xEAE4 U+625A # <cjk> [2000]
+0xEAE5 U+626F # <cjk> [2000]
+0xEAE6 U+6285 # <cjk> [2000]
+0xEAE7 U+62C4 # <cjk> [2000]
+0xEAE8 U+62D6 # <cjk> [2000]
+0xEAE9 U+62FC # <cjk> [2000]
+0xEAEA U+630A # <cjk> [2000]
+0xEAEB U+6318 # <cjk> [2000]
+0xEAEC U+6339 # <cjk> [2000]
+0xEAED U+6343 # <cjk> [2000]
+0xEAEE U+6365 # <cjk> [2000]
+0xEAEF U+637C # <cjk> [2000]
+0xEAF0 U+63E5 # <cjk> [2000]
+0xEAF1 U+63ED # <cjk> [2000]
+0xEAF2 U+63F5 # <cjk> [2000]
+0xEAF3 U+6410 # <cjk> [2000]
+0xEAF4 U+6414 # <cjk> [2000]
+0xEAF5 U+6422 # <cjk> [2000]
+0xEAF6 U+6479 # <cjk> [2000]
+0xEAF7 U+6451 # <cjk> [2000]
+0xEAF8 U+6460 # <cjk> [2000]
+0xEAF9 U+646D # <cjk> [2000]
+0xEAFA U+64CE # <cjk> [2000]
+0xEAFB U+64BE # <cjk> [2000]
+0xEAFC U+64BF # <cjk> [2000]
+0xEB40 U+64C4 # <cjk> [2000]
+0xEB41 U+64CA # <cjk> [2000]
+0xEB42 U+64D0 # <cjk> [2000]
+0xEB43 U+64F7 # <cjk> [2000]
+0xEB44 U+64FB # <cjk> [2000]
+0xEB45 U+6522 # <cjk> [2000]
+0xEB46 U+6529 # <cjk> [2000]
+0xEB47 U+FA41 # CJK COMPATIBILITY IDEOGRAPH-FA41 [2000] [Unicode3.2]
+0xEB48 U+6567 # <cjk> [2000]
+0xEB49 U+659D # <cjk> [2000]
+0xEB4A U+FA42 # CJK COMPATIBILITY IDEOGRAPH-FA42 [2000] [Unicode3.2]
+0xEB4B U+6600 # <cjk> [2000]
+0xEB4C U+6609 # <cjk> [2000]
+0xEB4D U+6615 # <cjk> [2000]
+0xEB4E U+661E # <cjk> [2000]
+0xEB4F U+663A # <cjk> [2000]
+0xEB50 U+6622 # <cjk> [2000]
+0xEB51 U+6624 # <cjk> [2000]
+0xEB52 U+662B # <cjk> [2000]
+0xEB53 U+6630 # <cjk> [2000]
+0xEB54 U+6631 # <cjk> [2000]
+0xEB55 U+6633 # <cjk> [2000]
+0xEB56 U+66FB # <cjk> [2000]
+0xEB57 U+6648 # <cjk> [2000]
+0xEB58 U+664C # <cjk> [2000]
+0xEB59 U+231C4 # <cjk> [2000] [Unicode3.1]
+0xEB5A U+6659 # <cjk> [2000]
+0xEB5B U+665A # <cjk> [2000]
+0xEB5C U+6661 # <cjk> [2000]
+0xEB5D U+6665 # <cjk> [2000]
+0xEB5E U+6673 # <cjk> [2000]
+0xEB5F U+6677 # <cjk> [2000]
+0xEB60 U+6678 # <cjk> [2000]
+0xEB61 U+668D # <cjk> [2000]
+0xEB62 U+FA43 # CJK COMPATIBILITY IDEOGRAPH-FA43 [2000] [Unicode3.2]
+0xEB63 U+66A0 # <cjk> [2000]
+0xEB64 U+66B2 # <cjk> [2000]
+0xEB65 U+66BB # <cjk> [2000]
+0xEB66 U+66C6 # <cjk> [2000]
+0xEB67 U+66C8 # <cjk> [2000]
+0xEB68 U+3B22 # <cjk> [2000]
+0xEB69 U+66DB # <cjk> [2000]
+0xEB6A U+66E8 # <cjk> [2000]
+0xEB6B U+66FA # <cjk> [2000]
+0xEB6C U+6713 # <cjk> [2000]
+0xEB6D U+F929 # CJK COMPATIBILITY IDEOGRAPH-F929 [2000]
+0xEB6E U+6733 # <cjk> [2000]
+0xEB6F U+6766 # <cjk> [2000]
+0xEB70 U+6747 # <cjk> [2000]
+0xEB71 U+6748 # <cjk> [2000]
+0xEB72 U+677B # <cjk> [2000]
+0xEB73 U+6781 # <cjk> [2000]
+0xEB74 U+6793 # <cjk> [2000]
+0xEB75 U+6798 # <cjk> [2000]
+0xEB76 U+679B # <cjk> [2000]
+0xEB77 U+67BB # <cjk> [2000]
+0xEB78 U+67F9 # <cjk> [2000]
+0xEB79 U+67C0 # <cjk> [2000]
+0xEB7A U+67D7 # <cjk> [2000]
+0xEB7B U+67FC # <cjk> [2000]
+0xEB7C U+6801 # <cjk> [2000]
+0xEB7D U+6852 # <cjk> [2000]
+0xEB7E U+681D # <cjk> [2000]
+0xEB80 U+682C # <cjk> [2000]
+0xEB81 U+6831 # <cjk> [2000]
+0xEB82 U+685B # <cjk> [2000]
+0xEB83 U+6872 # <cjk> [2000]
+0xEB84 U+6875 # <cjk> [2000]
+0xEB85 U+FA44 # CJK COMPATIBILITY IDEOGRAPH-FA44 [2000] [Unicode3.2]
+0xEB86 U+68A3 # <cjk> [2000]
+0xEB87 U+68A5 # <cjk> [2000]
+0xEB88 U+68B2 # <cjk> [2000]
+0xEB89 U+68C8 # <cjk> [2000]
+0xEB8A U+68D0 # <cjk> [2000]
+0xEB8B U+68E8 # <cjk> [2000]
+0xEB8C U+68ED # <cjk> [2000]
+0xEB8D U+68F0 # <cjk> [2000]
+0xEB8E U+68F1 # <cjk> [2000]
+0xEB8F U+68FC # <cjk> [2000]
+0xEB90 U+690A # <cjk> [2000]
+0xEB91 U+6949 # <cjk> [2000]
+0xEB92 U+235C4 # <cjk> [2000] [Unicode3.1]
+0xEB93 U+6935 # <cjk> [2000]
+0xEB94 U+6942 # <cjk> [2000]
+0xEB95 U+6957 # <cjk> [2000]
+0xEB96 U+6963 # <cjk> [2000]
+0xEB97 U+6964 # <cjk> [2000]
+0xEB98 U+6968 # <cjk> [2000]
+0xEB99 U+6980 # <cjk> [2000]
+0xEB9A U+FA14 # CJK COMPATIBILITY IDEOGRAPH-FA14 [2000]
+0xEB9B U+69A5 # <cjk> [2000]
+0xEB9C U+69AD # <cjk> [2000]
+0xEB9D U+69CF # <cjk> [2000]
+0xEB9E U+3BB6 # <cjk> [2000]
+0xEB9F U+3BC3 # <cjk> [2000]
+0xEBA0 U+69E2 # <cjk> [2000]
+0xEBA1 U+69E9 # <cjk> [2000]
+0xEBA2 U+69EA # <cjk> [2000]
+0xEBA3 U+69F5 # <cjk> [2000]
+0xEBA4 U+69F6 # <cjk> [2000]
+0xEBA5 U+6A0F # <cjk> [2000]
+0xEBA6 U+6A15 # <cjk> [2000]
+0xEBA7 U+2373F # <cjk> [2000] [Unicode3.1]
+0xEBA8 U+6A3B # <cjk> [2000]
+0xEBA9 U+6A3E # <cjk> [2000]
+0xEBAA U+6A45 # <cjk> [2000]
+0xEBAB U+6A50 # <cjk> [2000]
+0xEBAC U+6A56 # <cjk> [2000]
+0xEBAD U+6A5B # <cjk> [2000]
+0xEBAE U+6A6B # <cjk> [2000]
+0xEBAF U+6A73 # <cjk> [2000]
+0xEBB0 U+23763 # <cjk> [2000] [Unicode3.1]
+0xEBB1 U+6A89 # <cjk> [2000]
+0xEBB2 U+6A94 # <cjk> [2000]
+0xEBB3 U+6A9D # <cjk> [2000]
+0xEBB4 U+6A9E # <cjk> [2000]
+0xEBB5 U+6AA5 # <cjk> [2000]
+0xEBB6 U+6AE4 # <cjk> [2000]
+0xEBB7 U+6AE7 # <cjk> [2000]
+0xEBB8 U+3C0F # <cjk> [2000]
+0xEBB9 U+F91D # CJK COMPATIBILITY IDEOGRAPH-F91D [2000]
+0xEBBA U+6B1B # <cjk> [2000]
+0xEBBB U+6B1E # <cjk> [2000]
+0xEBBC U+6B2C # <cjk> [2000]
+0xEBBD U+6B35 # <cjk> [2000]
+0xEBBE U+6B46 # <cjk> [2000]
+0xEBBF U+6B56 # <cjk> [2000]
+0xEBC0 U+6B60 # <cjk> [2000]
+0xEBC1 U+6B65 # <cjk> [2000]
+0xEBC2 U+6B67 # <cjk> [2000]
+0xEBC3 U+6B77 # <cjk> [2000]
+0xEBC4 U+6B82 # <cjk> [2000]
+0xEBC5 U+6BA9 # <cjk> [2000]
+0xEBC6 U+6BAD # <cjk> [2000]
+0xEBC7 U+F970 # CJK COMPATIBILITY IDEOGRAPH-F970 [2000]
+0xEBC8 U+6BCF # <cjk> [2000]
+0xEBC9 U+6BD6 # <cjk> [2000]
+0xEBCA U+6BD7 # <cjk> [2000]
+0xEBCB U+6BFF # <cjk> [2000]
+0xEBCC U+6C05 # <cjk> [2000]
+0xEBCD U+6C10 # <cjk> [2000]
+0xEBCE U+6C33 # <cjk> [2000]
+0xEBCF U+6C59 # <cjk> [2000]
+0xEBD0 U+6C5C # <cjk> [2000]
+0xEBD1 U+6CAA # <cjk> [2000]
+0xEBD2 U+6C74 # <cjk> [2000]
+0xEBD3 U+6C76 # <cjk> [2000]
+0xEBD4 U+6C85 # <cjk> [2000]
+0xEBD5 U+6C86 # <cjk> [2000]
+0xEBD6 U+6C98 # <cjk> [2000]
+0xEBD7 U+6C9C # <cjk> [2000]
+0xEBD8 U+6CFB # <cjk> [2000]
+0xEBD9 U+6CC6 # <cjk> [2000]
+0xEBDA U+6CD4 # <cjk> [2000]
+0xEBDB U+6CE0 # <cjk> [2000]
+0xEBDC U+6CEB # <cjk> [2000]
+0xEBDD U+6CEE # <cjk> [2000]
+0xEBDE U+23CFE # <cjk> [2000] [Unicode3.1]
+0xEBDF U+6D04 # <cjk> [2000]
+0xEBE0 U+6D0E # <cjk> [2000]
+0xEBE1 U+6D2E # <cjk> [2000]
+0xEBE2 U+6D31 # <cjk> [2000]
+0xEBE3 U+6D39 # <cjk> [2000]
+0xEBE4 U+6D3F # <cjk> [2000]
+0xEBE5 U+6D58 # <cjk> [2000]
+0xEBE6 U+6D65 # <cjk> [2000]
+0xEBE7 U+FA45 # CJK COMPATIBILITY IDEOGRAPH-FA45 [2000] [Unicode3.2]
+0xEBE8 U+6D82 # <cjk> [2000]
+0xEBE9 U+6D87 # <cjk> [2000]
+0xEBEA U+6D89 # <cjk> [2000]
+0xEBEB U+6D94 # <cjk> [2000]
+0xEBEC U+6DAA # <cjk> [2000]
+0xEBED U+6DAC # <cjk> [2000]
+0xEBEE U+6DBF # <cjk> [2000]
+0xEBEF U+6DC4 # <cjk> [2000]
+0xEBF0 U+6DD6 # <cjk> [2000]
+0xEBF1 U+6DDA # <cjk> [2000]
+0xEBF2 U+6DDB # <cjk> [2000]
+0xEBF3 U+6DDD # <cjk> [2000]
+0xEBF4 U+6DFC # <cjk> [2000]
+0xEBF5 U+FA46 # CJK COMPATIBILITY IDEOGRAPH-FA46 [2000] [Unicode3.2]
+0xEBF6 U+6E34 # <cjk> [2000]
+0xEBF7 U+6E44 # <cjk> [2000]
+0xEBF8 U+6E5C # <cjk> [2000]
+0xEBF9 U+6E5E # <cjk> [2000]
+0xEBFA U+6EAB # <cjk> [2000]
+0xEBFB U+6EB1 # <cjk> [2000]
+0xEBFC U+6EC1 # <cjk> [2000]
+0xEC40 U+6EC7 # <cjk> [2000]
+0xEC41 U+6ECE # <cjk> [2000]
+0xEC42 U+6F10 # <cjk> [2000]
+0xEC43 U+6F1A # <cjk> [2000]
+0xEC44 U+FA47 # CJK COMPATIBILITY IDEOGRAPH-FA47 [2000] [Unicode3.2]
+0xEC45 U+6F2A # <cjk> [2000]
+0xEC46 U+6F2F # <cjk> [2000]
+0xEC47 U+6F33 # <cjk> [2000]
+0xEC48 U+6F51 # <cjk> [2000]
+0xEC49 U+6F59 # <cjk> [2000]
+0xEC4A U+6F5E # <cjk> [2000]
+0xEC4B U+6F61 # <cjk> [2000]
+0xEC4C U+6F62 # <cjk> [2000]
+0xEC4D U+6F7E # <cjk> [2000]
+0xEC4E U+6F88 # <cjk> [2000]
+0xEC4F U+6F8C # <cjk> [2000]
+0xEC50 U+6F8D # <cjk> [2000]
+0xEC51 U+6F94 # <cjk> [2000]
+0xEC52 U+6FA0 # <cjk> [2000]
+0xEC53 U+6FA7 # <cjk> [2000]
+0xEC54 U+6FB6 # <cjk> [2000]
+0xEC55 U+6FBC # <cjk> [2000]
+0xEC56 U+6FC7 # <cjk> [2000]
+0xEC57 U+6FCA # <cjk> [2000]
+0xEC58 U+6FF9 # <cjk> [2000]
+0xEC59 U+6FF0 # <cjk> [2000]
+0xEC5A U+6FF5 # <cjk> [2000]
+0xEC5B U+7005 # <cjk> [2000]
+0xEC5C U+7006 # <cjk> [2000]
+0xEC5D U+7028 # <cjk> [2000]
+0xEC5E U+704A # <cjk> [2000]
+0xEC5F U+705D # <cjk> [2000]
+0xEC60 U+705E # <cjk> [2000]
+0xEC61 U+704E # <cjk> [2000]
+0xEC62 U+7064 # <cjk> [2000]
+0xEC63 U+7075 # <cjk> [2000]
+0xEC64 U+7085 # <cjk> [2000]
+0xEC65 U+70A4 # <cjk> [2000]
+0xEC66 U+70AB # <cjk> [2000]
+0xEC67 U+70B7 # <cjk> [2000]
+0xEC68 U+70D4 # <cjk> [2000]
+0xEC69 U+70D8 # <cjk> [2000]
+0xEC6A U+70E4 # <cjk> [2000]
+0xEC6B U+710F # <cjk> [2000]
+0xEC6C U+712B # <cjk> [2000]
+0xEC6D U+711E # <cjk> [2000]
+0xEC6E U+7120 # <cjk> [2000]
+0xEC6F U+712E # <cjk> [2000]
+0xEC70 U+7130 # <cjk> [2000]
+0xEC71 U+7146 # <cjk> [2000]
+0xEC72 U+7147 # <cjk> [2000]
+0xEC73 U+7151 # <cjk> [2000]
+0xEC74 U+FA48 # CJK COMPATIBILITY IDEOGRAPH-FA48 [2000] [Unicode3.2]
+0xEC75 U+7152 # <cjk> [2000]
+0xEC76 U+715C # <cjk> [2000]
+0xEC77 U+7160 # <cjk> [2000]
+0xEC78 U+7168 # <cjk> [2000]
+0xEC79 U+FA15 # CJK COMPATIBILITY IDEOGRAPH-FA15 [2000]
+0xEC7A U+7185 # <cjk> [2000]
+0xEC7B U+7187 # <cjk> [2000]
+0xEC7C U+7192 # <cjk> [2000]
+0xEC7D U+71C1 # <cjk> [2000]
+0xEC7E U+71BA # <cjk> [2000]
+0xEC80 U+71C4 # <cjk> [2000]
+0xEC81 U+71FE # <cjk> [2000]
+0xEC82 U+7200 # <cjk> [2000]
+0xEC83 U+7215 # <cjk> [2000]
+0xEC84 U+7255 # <cjk> [2000]
+0xEC85 U+7256 # <cjk> [2000]
+0xEC86 U+3E3F # <cjk> [2000]
+0xEC87 U+728D # <cjk> [2000]
+0xEC88 U+729B # <cjk> [2000]
+0xEC89 U+72BE # <cjk> [2000]
+0xEC8A U+72C0 # <cjk> [2000]
+0xEC8B U+72FB # <cjk> [2000]
+0xEC8C U+247F1 # <cjk> [2000] [Unicode3.1]
+0xEC8D U+7327 # <cjk> [2000]
+0xEC8E U+7328 # <cjk> [2000]
+0xEC8F U+FA16 # CJK COMPATIBILITY IDEOGRAPH-FA16 [2000]
+0xEC90 U+7350 # <cjk> [2000]
+0xEC91 U+7366 # <cjk> [2000]
+0xEC92 U+737C # <cjk> [2000]
+0xEC93 U+7395 # <cjk> [2000]
+0xEC94 U+739F # <cjk> [2000]
+0xEC95 U+73A0 # <cjk> [2000]
+0xEC96 U+73A2 # <cjk> [2000]
+0xEC97 U+73A6 # <cjk> [2000]
+0xEC98 U+73AB # <cjk> [2000]
+0xEC99 U+73C9 # <cjk> [2000]
+0xEC9A U+73CF # <cjk> [2000]
+0xEC9B U+73D6 # <cjk> [2000]
+0xEC9C U+73D9 # <cjk> [2000]
+0xEC9D U+73E3 # <cjk> [2000]
+0xEC9E U+73E9 # <cjk> [2000]
+0xEC9F U+7407 # <cjk> [2000]
+0xECA0 U+740A # <cjk> [2000]
+0xECA1 U+741A # <cjk> [2000]
+0xECA2 U+741B # <cjk> [2000]
+0xECA3 U+FA4A # CJK COMPATIBILITY IDEOGRAPH-FA4A [2000] [Unicode3.2]
+0xECA4 U+7426 # <cjk> [2000]
+0xECA5 U+7428 # <cjk> [2000]
+0xECA6 U+742A # <cjk> [2000]
+0xECA7 U+742B # <cjk> [2000]
+0xECA8 U+742C # <cjk> [2000]
+0xECA9 U+742E # <cjk> [2000]
+0xECAA U+742F # <cjk> [2000]
+0xECAB U+7430 # <cjk> [2000]
+0xECAC U+7444 # <cjk> [2000]
+0xECAD U+7446 # <cjk> [2000]
+0xECAE U+7447 # <cjk> [2000]
+0xECAF U+744B # <cjk> [2000]
+0xECB0 U+7457 # <cjk> [2000]
+0xECB1 U+7462 # <cjk> [2000]
+0xECB2 U+746B # <cjk> [2000]
+0xECB3 U+746D # <cjk> [2000]
+0xECB4 U+7486 # <cjk> [2000]
+0xECB5 U+7487 # <cjk> [2000]
+0xECB6 U+7489 # <cjk> [2000]
+0xECB7 U+7498 # <cjk> [2000]
+0xECB8 U+749C # <cjk> [2000]
+0xECB9 U+749F # <cjk> [2000]
+0xECBA U+74A3 # <cjk> [2000]
+0xECBB U+7490 # <cjk> [2000]
+0xECBC U+74A6 # <cjk> [2000]
+0xECBD U+74A8 # <cjk> [2000]
+0xECBE U+74A9 # <cjk> [2000]
+0xECBF U+74B5 # <cjk> [2000]
+0xECC0 U+74BF # <cjk> [2000]
+0xECC1 U+74C8 # <cjk> [2000]
+0xECC2 U+74C9 # <cjk> [2000]
+0xECC3 U+74DA # <cjk> [2000]
+0xECC4 U+74FF # <cjk> [2000]
+0xECC5 U+7501 # <cjk> [2000]
+0xECC6 U+7517 # <cjk> [2000]
+0xECC7 U+752F # <cjk> [2000]
+0xECC8 U+756F # <cjk> [2000]
+0xECC9 U+7579 # <cjk> [2000]
+0xECCA U+7592 # <cjk> [2000]
+0xECCB U+3F72 # <cjk> [2000]
+0xECCC U+75CE # <cjk> [2000]
+0xECCD U+75E4 # <cjk> [2000]
+0xECCE U+7600 # <cjk> [2000]
+0xECCF U+7602 # <cjk> [2000]
+0xECD0 U+7608 # <cjk> [2000]
+0xECD1 U+7615 # <cjk> [2000]
+0xECD2 U+7616 # <cjk> [2000]
+0xECD3 U+7619 # <cjk> [2000]
+0xECD4 U+761E # <cjk> [2000]
+0xECD5 U+762D # <cjk> [2000]
+0xECD6 U+7635 # <cjk> [2000]
+0xECD7 U+7643 # <cjk> [2000]
+0xECD8 U+764B # <cjk> [2000]
+0xECD9 U+7664 # <cjk> [2000]
+0xECDA U+7665 # <cjk> [2000]
+0xECDB U+766D # <cjk> [2000]
+0xECDC U+766F # <cjk> [2000]
+0xECDD U+7671 # <cjk> [2000]
+0xECDE U+7681 # <cjk> [2000]
+0xECDF U+769B # <cjk> [2000]
+0xECE0 U+769D # <cjk> [2000]
+0xECE1 U+769E # <cjk> [2000]
+0xECE2 U+76A6 # <cjk> [2000]
+0xECE3 U+76AA # <cjk> [2000]
+0xECE4 U+76B6 # <cjk> [2000]
+0xECE5 U+76C5 # <cjk> [2000]
+0xECE6 U+76CC # <cjk> [2000]
+0xECE7 U+76CE # <cjk> [2000]
+0xECE8 U+76D4 # <cjk> [2000]
+0xECE9 U+76E6 # <cjk> [2000]
+0xECEA U+76F1 # <cjk> [2000]
+0xECEB U+76FC # <cjk> [2000]
+0xECEC U+770A # <cjk> [2000]
+0xECED U+7719 # <cjk> [2000]
+0xECEE U+7734 # <cjk> [2000]
+0xECEF U+7736 # <cjk> [2000]
+0xECF0 U+7746 # <cjk> [2000]
+0xECF1 U+774D # <cjk> [2000]
+0xECF2 U+774E # <cjk> [2000]
+0xECF3 U+775C # <cjk> [2000]
+0xECF4 U+775F # <cjk> [2000]
+0xECF5 U+7762 # <cjk> [2000]
+0xECF6 U+777A # <cjk> [2000]
+0xECF7 U+7780 # <cjk> [2000]
+0xECF8 U+7794 # <cjk> [2000]
+0xECF9 U+77AA # <cjk> [2000]
+0xECFA U+77E0 # <cjk> [2000]
+0xECFB U+782D # <cjk> [2000]
+0xECFC U+2548E # <cjk> [2000] [Unicode3.1]
+0xED40 U+7843 # <cjk> [2000]
+0xED41 U+784E # <cjk> [2000]
+0xED42 U+784F # <cjk> [2000]
+0xED43 U+7851 # <cjk> [2000]
+0xED44 U+7868 # <cjk> [2000]
+0xED45 U+786E # <cjk> [2000]
+0xED46 U+FA4B # CJK COMPATIBILITY IDEOGRAPH-FA4B [2000] [Unicode3.2]
+0xED47 U+78B0 # <cjk> [2000]
+0xED48 U+2550E # <cjk> [2000] [Unicode3.1]
+0xED49 U+78AD # <cjk> [2000]
+0xED4A U+78E4 # <cjk> [2000]
+0xED4B U+78F2 # <cjk> [2000]
+0xED4C U+7900 # <cjk> [2000]
+0xED4D U+78F7 # <cjk> [2000]
+0xED4E U+791C # <cjk> [2000]
+0xED4F U+792E # <cjk> [2000]
+0xED50 U+7931 # <cjk> [2000]
+0xED51 U+7934 # <cjk> [2000]
+0xED52 U+FA4C # CJK COMPATIBILITY IDEOGRAPH-FA4C [2000] [Unicode3.2]
+0xED53 U+FA4D # CJK COMPATIBILITY IDEOGRAPH-FA4D [2000] [Unicode3.2]
+0xED54 U+7945 # <cjk> [2000]
+0xED55 U+7946 # <cjk> [2000]
+0xED56 U+FA4E # CJK COMPATIBILITY IDEOGRAPH-FA4E [2000] [Unicode3.2]
+0xED57 U+FA4F # CJK COMPATIBILITY IDEOGRAPH-FA4F [2000] [Unicode3.2]
+0xED58 U+FA50 # CJK COMPATIBILITY IDEOGRAPH-FA50 [2000] [Unicode3.2]
+0xED59 U+795C # <cjk> [2000]
+0xED5A U+FA51 # CJK COMPATIBILITY IDEOGRAPH-FA51 [2000] [Unicode3.2]
+0xED5B U+FA19 # CJK COMPATIBILITY IDEOGRAPH-FA19 [2000]
+0xED5C U+FA1A # CJK COMPATIBILITY IDEOGRAPH-FA1A [2000]
+0xED5D U+7979 # <cjk> [2000]
+0xED5E U+FA52 # CJK COMPATIBILITY IDEOGRAPH-FA52 [2000] [Unicode3.2]
+0xED5F U+FA53 # CJK COMPATIBILITY IDEOGRAPH-FA53 [2000] [Unicode3.2]
+0xED60 U+FA1B # CJK COMPATIBILITY IDEOGRAPH-FA1B [2000]
+0xED61 U+7998 # <cjk> [2000]
+0xED62 U+79B1 # <cjk> [2000]
+0xED63 U+79B8 # <cjk> [2000]
+0xED64 U+79C8 # <cjk> [2000]
+0xED65 U+79CA # <cjk> [2000]
+0xED66 U+25771 # <cjk> [2000] [Unicode3.1]
+0xED67 U+79D4 # <cjk> [2000]
+0xED68 U+79DE # <cjk> [2000]
+0xED69 U+79EB # <cjk> [2000]
+0xED6A U+79ED # <cjk> [2000]
+0xED6B U+7A03 # <cjk> [2000]
+0xED6C U+FA54 # CJK COMPATIBILITY IDEOGRAPH-FA54 [2000] [Unicode3.2]
+0xED6D U+7A39 # <cjk> [2000]
+0xED6E U+7A5D # <cjk> [2000]
+0xED6F U+7A6D # <cjk> [2000]
+0xED70 U+FA55 # CJK COMPATIBILITY IDEOGRAPH-FA55 [2000] [Unicode3.2]
+0xED71 U+7A85 # <cjk> [2000]
+0xED72 U+7AA0 # <cjk> [2000]
+0xED73 U+259C4 # <cjk> [2000] [Unicode3.1]
+0xED74 U+7AB3 # <cjk> [2000]
+0xED75 U+7ABB # <cjk> [2000]
+0xED76 U+7ACE # <cjk> [2000]
+0xED77 U+7AEB # <cjk> [2000]
+0xED78 U+7AFD # <cjk> [2000]
+0xED79 U+7B12 # <cjk> [2000]
+0xED7A U+7B2D # <cjk> [2000]
+0xED7B U+7B3B # <cjk> [2000]
+0xED7C U+7B47 # <cjk> [2000]
+0xED7D U+7B4E # <cjk> [2000]
+0xED7E U+7B60 # <cjk> [2000]
+0xED80 U+7B6D # <cjk> [2000]
+0xED81 U+7B6F # <cjk> [2000]
+0xED82 U+7B72 # <cjk> [2000]
+0xED83 U+7B9E # <cjk> [2000]
+0xED84 U+FA56 # CJK COMPATIBILITY IDEOGRAPH-FA56 [2000] [Unicode3.2]
+0xED85 U+7BD7 # <cjk> [2000]
+0xED86 U+7BD9 # <cjk> [2000]
+0xED87 U+7C01 # <cjk> [2000]
+0xED88 U+7C31 # <cjk> [2000]
+0xED89 U+7C1E # <cjk> [2000]
+0xED8A U+7C20 # <cjk> [2000]
+0xED8B U+7C33 # <cjk> [2000]
+0xED8C U+7C36 # <cjk> [2000]
+0xED8D U+4264 # <cjk> [2000]
+0xED8E U+25DA1 # <cjk> [2000] [Unicode3.1]
+0xED8F U+7C59 # <cjk> [2000]
+0xED90 U+7C6D # <cjk> [2000]
+0xED91 U+7C79 # <cjk> [2000]
+0xED92 U+7C8F # <cjk> [2000]
+0xED93 U+7C94 # <cjk> [2000]
+0xED94 U+7CA0 # <cjk> [2000]
+0xED95 U+7CBC # <cjk> [2000]
+0xED96 U+7CD5 # <cjk> [2000]
+0xED97 U+7CD9 # <cjk> [2000]
+0xED98 U+7CDD # <cjk> [2000]
+0xED99 U+7D07 # <cjk> [2000]
+0xED9A U+7D08 # <cjk> [2000]
+0xED9B U+7D13 # <cjk> [2000]
+0xED9C U+7D1D # <cjk> [2000]
+0xED9D U+7D23 # <cjk> [2000]
+0xED9E U+7D31 # <cjk> [2000]
+0xED9F U+7D41 # <cjk> [2000]
+0xEDA0 U+7D48 # <cjk> [2000]
+0xEDA1 U+7D53 # <cjk> [2000]
+0xEDA2 U+7D5C # <cjk> [2000]
+0xEDA3 U+7D7A # <cjk> [2000]
+0xEDA4 U+7D83 # <cjk> [2000]
+0xEDA5 U+7D8B # <cjk> [2000]
+0xEDA6 U+7DA0 # <cjk> [2000]
+0xEDA7 U+7DA6 # <cjk> [2000]
+0xEDA8 U+7DC2 # <cjk> [2000]
+0xEDA9 U+7DCC # <cjk> [2000]
+0xEDAA U+7DD6 # <cjk> [2000]
+0xEDAB U+7DE3 # <cjk> [2000]
+0xEDAC U+FA57 # CJK COMPATIBILITY IDEOGRAPH-FA57 [2000] [Unicode3.2]
+0xEDAD U+7E28 # <cjk> [2000]
+0xEDAE U+7E08 # <cjk> [2000]
+0xEDAF U+7E11 # <cjk> [2000]
+0xEDB0 U+7E15 # <cjk> [2000]
+0xEDB1 U+FA59 # CJK COMPATIBILITY IDEOGRAPH-FA59 [2000] [Unicode3.2]
+0xEDB2 U+7E47 # <cjk> [2000]
+0xEDB3 U+7E52 # <cjk> [2000]
+0xEDB4 U+7E61 # <cjk> [2000]
+0xEDB5 U+7E8A # <cjk> [2000]
+0xEDB6 U+7E8D # <cjk> [2000]
+0xEDB7 U+7F47 # <cjk> [2000]
+0xEDB8 U+FA5A # CJK COMPATIBILITY IDEOGRAPH-FA5A [2000] [Unicode3.2]
+0xEDB9 U+7F91 # <cjk> [2000]
+0xEDBA U+7F97 # <cjk> [2000]
+0xEDBB U+7FBF # <cjk> [2000]
+0xEDBC U+7FCE # <cjk> [2000]
+0xEDBD U+7FDB # <cjk> [2000]
+0xEDBE U+7FDF # <cjk> [2000]
+0xEDBF U+7FEC # <cjk> [2000]
+0xEDC0 U+7FEE # <cjk> [2000]
+0xEDC1 U+7FFA # <cjk> [2000]
+0xEDC2 U+FA5B # CJK COMPATIBILITY IDEOGRAPH-FA5B [2000] [Unicode3.2]
+0xEDC3 U+8014 # <cjk> [2000]
+0xEDC4 U+8026 # <cjk> [2000]
+0xEDC5 U+8035 # <cjk> [2000]
+0xEDC6 U+8037 # <cjk> [2000]
+0xEDC7 U+803C # <cjk> [2000]
+0xEDC8 U+80CA # <cjk> [2000]
+0xEDC9 U+80D7 # <cjk> [2000]
+0xEDCA U+80E0 # <cjk> [2000]
+0xEDCB U+80F3 # <cjk> [2000]
+0xEDCC U+8118 # <cjk> [2000]
+0xEDCD U+814A # <cjk> [2000]
+0xEDCE U+8160 # <cjk> [2000]
+0xEDCF U+8167 # <cjk> [2000]
+0xEDD0 U+8168 # <cjk> [2000]
+0xEDD1 U+816D # <cjk> [2000]
+0xEDD2 U+81BB # <cjk> [2000]
+0xEDD3 U+81CA # <cjk> [2000]
+0xEDD4 U+81CF # <cjk> [2000]
+0xEDD5 U+81D7 # <cjk> [2000]
+0xEDD6 U+FA5C # CJK COMPATIBILITY IDEOGRAPH-FA5C [2000] [Unicode3.2]
+0xEDD7 U+4453 # <cjk> [2000]
+0xEDD8 U+445B # <cjk> [2000]
+0xEDD9 U+8260 # <cjk> [2000]
+0xEDDA U+8274 # <cjk> [2000]
+0xEDDB U+26AFF # <cjk> [2000] [Unicode3.1]
+0xEDDC U+828E # <cjk> [2000]
+0xEDDD U+82A1 # <cjk> [2000]
+0xEDDE U+82A3 # <cjk> [2000]
+0xEDDF U+82A4 # <cjk> [2000]
+0xEDE0 U+82A9 # <cjk> [2000]
+0xEDE1 U+82AE # <cjk> [2000]
+0xEDE2 U+82B7 # <cjk> [2000]
+0xEDE3 U+82BE # <cjk> [2000]
+0xEDE4 U+82BF # <cjk> [2000]
+0xEDE5 U+82C6 # <cjk> [2000]
+0xEDE6 U+82D5 # <cjk> [2000]
+0xEDE7 U+82FD # <cjk> [2000]
+0xEDE8 U+82FE # <cjk> [2000]
+0xEDE9 U+8300 # <cjk> [2000]
+0xEDEA U+8301 # <cjk> [2000]
+0xEDEB U+8362 # <cjk> [2000]
+0xEDEC U+8322 # <cjk> [2000]
+0xEDED U+832D # <cjk> [2000]
+0xEDEE U+833A # <cjk> [2000]
+0xEDEF U+8343 # <cjk> [2000]
+0xEDF0 U+8347 # <cjk> [2000]
+0xEDF1 U+8351 # <cjk> [2000]
+0xEDF2 U+8355 # <cjk> [2000]
+0xEDF3 U+837D # <cjk> [2000]
+0xEDF4 U+8386 # <cjk> [2000]
+0xEDF5 U+8392 # <cjk> [2000]
+0xEDF6 U+8398 # <cjk> [2000]
+0xEDF7 U+83A7 # <cjk> [2000]
+0xEDF8 U+83A9 # <cjk> [2000]
+0xEDF9 U+83BF # <cjk> [2000]
+0xEDFA U+83C0 # <cjk> [2000]
+0xEDFB U+83C7 # <cjk> [2000]
+0xEDFC U+83CF # <cjk> [2000]
+0xEE40 U+83D1 # <cjk> [2000]
+0xEE41 U+83E1 # <cjk> [2000]
+0xEE42 U+83EA # <cjk> [2000]
+0xEE43 U+8401 # <cjk> [2000]
+0xEE44 U+8406 # <cjk> [2000]
+0xEE45 U+840A # <cjk> [2000]
+0xEE46 U+FA5F # CJK COMPATIBILITY IDEOGRAPH-FA5F [2000] [Unicode3.2]
+0xEE47 U+8448 # <cjk> [2000]
+0xEE48 U+845F # <cjk> [2000]
+0xEE49 U+8470 # <cjk> [2000]
+0xEE4A U+8473 # <cjk> [2000]
+0xEE4B U+8485 # <cjk> [2000]
+0xEE4C U+849E # <cjk> [2000]
+0xEE4D U+84AF # <cjk> [2000]
+0xEE4E U+84B4 # <cjk> [2000]
+0xEE4F U+84BA # <cjk> [2000]
+0xEE50 U+84C0 # <cjk> [2000]
+0xEE51 U+84C2 # <cjk> [2000]
+0xEE52 U+26E40 # <cjk> [2000] [Unicode3.1]
+0xEE53 U+8532 # <cjk> [2000]
+0xEE54 U+851E # <cjk> [2000]
+0xEE55 U+8523 # <cjk> [2000]
+0xEE56 U+852F # <cjk> [2000]
+0xEE57 U+8559 # <cjk> [2000]
+0xEE58 U+8564 # <cjk> [2000]
+0xEE59 U+FA1F # CJK COMPATIBILITY IDEOGRAPH-FA1F [2000]
+0xEE5A U+85AD # <cjk> [2000]
+0xEE5B U+857A # <cjk> [2000]
+0xEE5C U+858C # <cjk> [2000]
+0xEE5D U+858F # <cjk> [2000]
+0xEE5E U+85A2 # <cjk> [2000]
+0xEE5F U+85B0 # <cjk> [2000]
+0xEE60 U+85CB # <cjk> [2000]
+0xEE61 U+85CE # <cjk> [2000]
+0xEE62 U+85ED # <cjk> [2000]
+0xEE63 U+8612 # <cjk> [2000]
+0xEE64 U+85FF # <cjk> [2000]
+0xEE65 U+8604 # <cjk> [2000]
+0xEE66 U+8605 # <cjk> [2000]
+0xEE67 U+8610 # <cjk> [2000]
+0xEE68 U+270F4 # <cjk> [2000] [Unicode3.1]
+0xEE69 U+8618 # <cjk> [2000]
+0xEE6A U+8629 # <cjk> [2000]
+0xEE6B U+8638 # <cjk> [2000]
+0xEE6C U+8657 # <cjk> [2000]
+0xEE6D U+865B # <cjk> [2000]
+0xEE6E U+F936 # CJK COMPATIBILITY IDEOGRAPH-F936 [2000]
+0xEE6F U+8662 # <cjk> [2000]
+0xEE70 U+459D # <cjk> [2000]
+0xEE71 U+866C # <cjk> [2000]
+0xEE72 U+8675 # <cjk> [2000]
+0xEE73 U+8698 # <cjk> [2000]
+0xEE74 U+86B8 # <cjk> [2000]
+0xEE75 U+86FA # <cjk> [2000]
+0xEE76 U+86FC # <cjk> [2000]
+0xEE77 U+86FD # <cjk> [2000]
+0xEE78 U+870B # <cjk> [2000]
+0xEE79 U+8771 # <cjk> [2000]
+0xEE7A U+8787 # <cjk> [2000]
+0xEE7B U+8788 # <cjk> [2000]
+0xEE7C U+87AC # <cjk> [2000]
+0xEE7D U+87AD # <cjk> [2000]
+0xEE7E U+87B5 # <cjk> [2000]
+0xEE80 U+45EA # <cjk> [2000]
+0xEE81 U+87D6 # <cjk> [2000]
+0xEE82 U+87EC # <cjk> [2000]
+0xEE83 U+8806 # <cjk> [2000]
+0xEE84 U+880A # <cjk> [2000]
+0xEE85 U+8810 # <cjk> [2000]
+0xEE86 U+8814 # <cjk> [2000]
+0xEE87 U+881F # <cjk> [2000]
+0xEE88 U+8898 # <cjk> [2000]
+0xEE89 U+88AA # <cjk> [2000]
+0xEE8A U+88CA # <cjk> [2000]
+0xEE8B U+88CE # <cjk> [2000]
+0xEE8C U+27684 # <cjk> [2000] [Unicode3.1]
+0xEE8D U+88F5 # <cjk> [2000]
+0xEE8E U+891C # <cjk> [2000]
+0xEE8F U+FA60 # CJK COMPATIBILITY IDEOGRAPH-FA60 [2000] [Unicode3.2]
+0xEE90 U+8918 # <cjk> [2000]
+0xEE91 U+8919 # <cjk> [2000]
+0xEE92 U+891A # <cjk> [2000]
+0xEE93 U+8927 # <cjk> [2000]
+0xEE94 U+8930 # <cjk> [2000]
+0xEE95 U+8932 # <cjk> [2000]
+0xEE96 U+8939 # <cjk> [2000]
+0xEE97 U+8940 # <cjk> [2000]
+0xEE98 U+8994 # <cjk> [2000]
+0xEE99 U+FA61 # CJK COMPATIBILITY IDEOGRAPH-FA61 [2000] [Unicode3.2]
+0xEE9A U+89D4 # <cjk> [2000]
+0xEE9B U+89E5 # <cjk> [2000]
+0xEE9C U+89F6 # <cjk> [2000]
+0xEE9D U+8A12 # <cjk> [2000]
+0xEE9E U+8A15 # <cjk> [2000]
+0xEE9F U+8A22 # <cjk> [2000]
+0xEEA0 U+8A37 # <cjk> [2000]
+0xEEA1 U+8A47 # <cjk> [2000]
+0xEEA2 U+8A4E # <cjk> [2000]
+0xEEA3 U+8A5D # <cjk> [2000]
+0xEEA4 U+8A61 # <cjk> [2000]
+0xEEA5 U+8A75 # <cjk> [2000]
+0xEEA6 U+8A79 # <cjk> [2000]
+0xEEA7 U+8AA7 # <cjk> [2000]
+0xEEA8 U+8AD0 # <cjk> [2000]
+0xEEA9 U+8ADF # <cjk> [2000]
+0xEEAA U+8AF4 # <cjk> [2000]
+0xEEAB U+8AF6 # <cjk> [2000]
+0xEEAC U+FA22 # CJK COMPATIBILITY IDEOGRAPH-FA22 [2000]
+0xEEAD U+FA62 # CJK COMPATIBILITY IDEOGRAPH-FA62 [2000] [Unicode3.2]
+0xEEAE U+FA63 # CJK COMPATIBILITY IDEOGRAPH-FA63 [2000] [Unicode3.2]
+0xEEAF U+8B46 # <cjk> [2000]
+0xEEB0 U+8B54 # <cjk> [2000]
+0xEEB1 U+8B59 # <cjk> [2000]
+0xEEB2 U+8B69 # <cjk> [2000]
+0xEEB3 U+8B9D # <cjk> [2000]
+0xEEB4 U+8C49 # <cjk> [2000]
+0xEEB5 U+8C68 # <cjk> [2000]
+0xEEB6 U+FA64 # CJK COMPATIBILITY IDEOGRAPH-FA64 [2000] [Unicode3.2]
+0xEEB7 U+8CE1 # <cjk> [2000]
+0xEEB8 U+8CF4 # <cjk> [2000]
+0xEEB9 U+8CF8 # <cjk> [2000]
+0xEEBA U+8CFE # <cjk> [2000]
+0xEEBB U+FA65 # CJK COMPATIBILITY IDEOGRAPH-FA65 [2000] [Unicode3.2]
+0xEEBC U+8D12 # <cjk> [2000]
+0xEEBD U+8D1B # <cjk> [2000]
+0xEEBE U+8DAF # <cjk> [2000]
+0xEEBF U+8DCE # <cjk> [2000]
+0xEEC0 U+8DD1 # <cjk> [2000]
+0xEEC1 U+8DD7 # <cjk> [2000]
+0xEEC2 U+8E20 # <cjk> [2000]
+0xEEC3 U+8E23 # <cjk> [2000]
+0xEEC4 U+8E3D # <cjk> [2000]
+0xEEC5 U+8E70 # <cjk> [2000]
+0xEEC6 U+8E7B # <cjk> [2000]
+0xEEC7 U+28277 # <cjk> [2000] [Unicode3.1]
+0xEEC8 U+8EC0 # <cjk> [2000]
+0xEEC9 U+4844 # <cjk> [2000]
+0xEECA U+8EFA # <cjk> [2000]
+0xEECB U+8F1E # <cjk> [2000]
+0xEECC U+8F2D # <cjk> [2000]
+0xEECD U+8F36 # <cjk> [2000]
+0xEECE U+8F54 # <cjk> [2000]
+0xEECF U+283CD # <cjk> [2000] [Unicode3.1]
+0xEED0 U+8FA6 # <cjk> [2000]
+0xEED1 U+8FB5 # <cjk> [2000]
+0xEED2 U+8FE4 # <cjk> [2000]
+0xEED3 U+8FE8 # <cjk> [2000]
+0xEED4 U+8FEE # <cjk> [2000]
+0xEED5 U+9008 # <cjk> [2000]
+0xEED6 U+902D # <cjk> [2000]
+0xEED7 U+FA67 # CJK COMPATIBILITY IDEOGRAPH-FA67 [2000] [Unicode3.2]
+0xEED8 U+9088 # <cjk> [2000]
+0xEED9 U+9095 # <cjk> [2000]
+0xEEDA U+9097 # <cjk> [2000]
+0xEEDB U+9099 # <cjk> [2000]
+0xEEDC U+909B # <cjk> [2000]
+0xEEDD U+90A2 # <cjk> [2000]
+0xEEDE U+90B3 # <cjk> [2000]
+0xEEDF U+90BE # <cjk> [2000]
+0xEEE0 U+90C4 # <cjk> [2000]
+0xEEE1 U+90C5 # <cjk> [2000]
+0xEEE2 U+90C7 # <cjk> [2000]
+0xEEE3 U+90D7 # <cjk> [2000]
+0xEEE4 U+90DD # <cjk> [2000]
+0xEEE5 U+90DE # <cjk> [2000]
+0xEEE6 U+90EF # <cjk> [2000]
+0xEEE7 U+90F4 # <cjk> [2000]
+0xEEE8 U+FA26 # CJK COMPATIBILITY IDEOGRAPH-FA26 [2000]
+0xEEE9 U+9114 # <cjk> [2000]
+0xEEEA U+9115 # <cjk> [2000]
+0xEEEB U+9116 # <cjk> [2000]
+0xEEEC U+9122 # <cjk> [2000]
+0xEEED U+9123 # <cjk> [2000]
+0xEEEE U+9127 # <cjk> [2000]
+0xEEEF U+912F # <cjk> [2000]
+0xEEF0 U+9131 # <cjk> [2000]
+0xEEF1 U+9134 # <cjk> [2000]
+0xEEF2 U+913D # <cjk> [2000]
+0xEEF3 U+9148 # <cjk> [2000]
+0xEEF4 U+915B # <cjk> [2000]
+0xEEF5 U+9183 # <cjk> [2000]
+0xEEF6 U+919E # <cjk> [2000]
+0xEEF7 U+91AC # <cjk> [2000]
+0xEEF8 U+91B1 # <cjk> [2000]
+0xEEF9 U+91BC # <cjk> [2000]
+0xEEFA U+91D7 # <cjk> [2000]
+0xEEFB U+91FB # <cjk> [2000]
+0xEEFC U+91E4 # <cjk> [2000]
+0xEF40 U+91E5 # <cjk> [2000]
+0xEF41 U+91ED # <cjk> [2000]
+0xEF42 U+91F1 # <cjk> [2000]
+0xEF43 U+9207 # <cjk> [2000]
+0xEF44 U+9210 # <cjk> [2000]
+0xEF45 U+9238 # <cjk> [2000]
+0xEF46 U+9239 # <cjk> [2000]
+0xEF47 U+923A # <cjk> [2000]
+0xEF48 U+923C # <cjk> [2000]
+0xEF49 U+9240 # <cjk> [2000]
+0xEF4A U+9243 # <cjk> [2000]
+0xEF4B U+924F # <cjk> [2000]
+0xEF4C U+9278 # <cjk> [2000]
+0xEF4D U+9288 # <cjk> [2000]
+0xEF4E U+92C2 # <cjk> [2000]
+0xEF4F U+92CB # <cjk> [2000]
+0xEF50 U+92CC # <cjk> [2000]
+0xEF51 U+92D3 # <cjk> [2000]
+0xEF52 U+92E0 # <cjk> [2000]
+0xEF53 U+92FF # <cjk> [2000]
+0xEF54 U+9304 # <cjk> [2000]
+0xEF55 U+931F # <cjk> [2000]
+0xEF56 U+9321 # <cjk> [2000]
+0xEF57 U+9325 # <cjk> [2000]
+0xEF58 U+9348 # <cjk> [2000]
+0xEF59 U+9349 # <cjk> [2000]
+0xEF5A U+934A # <cjk> [2000]
+0xEF5B U+9364 # <cjk> [2000]
+0xEF5C U+9365 # <cjk> [2000]
+0xEF5D U+936A # <cjk> [2000]
+0xEF5E U+9370 # <cjk> [2000]
+0xEF5F U+939B # <cjk> [2000]
+0xEF60 U+93A3 # <cjk> [2000]
+0xEF61 U+93BA # <cjk> [2000]
+0xEF62 U+93C6 # <cjk> [2000]
+0xEF63 U+93DE # <cjk> [2000]
+0xEF64 U+93DF # <cjk> [2000]
+0xEF65 U+9404 # <cjk> [2000]
+0xEF66 U+93FD # <cjk> [2000]
+0xEF67 U+9433 # <cjk> [2000]
+0xEF68 U+944A # <cjk> [2000]
+0xEF69 U+9463 # <cjk> [2000]
+0xEF6A U+946B # <cjk> [2000]
+0xEF6B U+9471 # <cjk> [2000]
+0xEF6C U+9472 # <cjk> [2000]
+0xEF6D U+958E # <cjk> [2000]
+0xEF6E U+959F # <cjk> [2000]
+0xEF6F U+95A6 # <cjk> [2000]
+0xEF70 U+95A9 # <cjk> [2000]
+0xEF71 U+95AC # <cjk> [2000]
+0xEF72 U+95B6 # <cjk> [2000]
+0xEF73 U+95BD # <cjk> [2000]
+0xEF74 U+95CB # <cjk> [2000]
+0xEF75 U+95D0 # <cjk> [2000]
+0xEF76 U+95D3 # <cjk> [2000]
+0xEF77 U+49B0 # <cjk> [2000]
+0xEF78 U+95DA # <cjk> [2000]
+0xEF79 U+95DE # <cjk> [2000]
+0xEF7A U+9658 # <cjk> [2000]
+0xEF7B U+9684 # <cjk> [2000]
+0xEF7C U+F9DC # CJK COMPATIBILITY IDEOGRAPH-F9DC [2000]
+0xEF7D U+969D # <cjk> [2000]
+0xEF7E U+96A4 # <cjk> [2000]
+0xEF80 U+96A5 # <cjk> [2000]
+0xEF81 U+96D2 # <cjk> [2000]
+0xEF82 U+96DE # <cjk> [2000]
+0xEF83 U+FA68 # CJK COMPATIBILITY IDEOGRAPH-FA68 [2000] [Unicode3.2]
+0xEF84 U+96E9 # <cjk> [2000]
+0xEF85 U+96EF # <cjk> [2000]
+0xEF86 U+9733 # <cjk> [2000]
+0xEF87 U+973B # <cjk> [2000]
+0xEF88 U+974D # <cjk> [2000]
+0xEF89 U+974E # <cjk> [2000]
+0xEF8A U+974F # <cjk> [2000]
+0xEF8B U+975A # <cjk> [2000]
+0xEF8C U+976E # <cjk> [2000]
+0xEF8D U+9773 # <cjk> [2000]
+0xEF8E U+9795 # <cjk> [2000]
+0xEF8F U+97AE # <cjk> [2000]
+0xEF90 U+97BA # <cjk> [2000]
+0xEF91 U+97C1 # <cjk> [2000]
+0xEF92 U+97C9 # <cjk> [2000]
+0xEF93 U+97DE # <cjk> [2000]
+0xEF94 U+97DB # <cjk> [2000]
+0xEF95 U+97F4 # <cjk> [2000]
+0xEF96 U+FA69 # CJK COMPATIBILITY IDEOGRAPH-FA69 [2000] [Unicode3.2]
+0xEF97 U+980A # <cjk> [2000]
+0xEF98 U+981E # <cjk> [2000]
+0xEF99 U+982B # <cjk> [2000]
+0xEF9A U+9830 # <cjk> [2000]
+0xEF9B U+FA6A # CJK COMPATIBILITY IDEOGRAPH-FA6A [2000] [Unicode3.2]
+0xEF9C U+9852 # <cjk> [2000]
+0xEF9D U+9853 # <cjk> [2000]
+0xEF9E U+9856 # <cjk> [2000]
+0xEF9F U+9857 # <cjk> [2000]
+0xEFA0 U+9859 # <cjk> [2000]
+0xEFA1 U+985A # <cjk> [2000]
+0xEFA2 U+F9D0 # CJK COMPATIBILITY IDEOGRAPH-F9D0 [2000]
+0xEFA3 U+9865 # <cjk> [2000]
+0xEFA4 U+986C # <cjk> [2000]
+0xEFA5 U+98BA # <cjk> [2000]
+0xEFA6 U+98C8 # <cjk> [2000]
+0xEFA7 U+98E7 # <cjk> [2000]
+0xEFA8 U+9958 # <cjk> [2000]
+0xEFA9 U+999E # <cjk> [2000]
+0xEFAA U+9A02 # <cjk> [2000]
+0xEFAB U+9A03 # <cjk> [2000]
+0xEFAC U+9A24 # <cjk> [2000]
+0xEFAD U+9A2D # <cjk> [2000]
+0xEFAE U+9A2E # <cjk> [2000]
+0xEFAF U+9A38 # <cjk> [2000]
+0xEFB0 U+9A4A # <cjk> [2000]
+0xEFB1 U+9A4E # <cjk> [2000]
+0xEFB2 U+9A52 # <cjk> [2000]
+0xEFB3 U+9AB6 # <cjk> [2000]
+0xEFB4 U+9AC1 # <cjk> [2000]
+0xEFB5 U+9AC3 # <cjk> [2000]
+0xEFB6 U+9ACE # <cjk> [2000]
+0xEFB7 U+9AD6 # <cjk> [2000]
+0xEFB8 U+9AF9 # <cjk> [2000]
+0xEFB9 U+9B02 # <cjk> [2000]
+0xEFBA U+9B08 # <cjk> [2000]
+0xEFBB U+9B20 # <cjk> [2000]
+0xEFBC U+4C17 # <cjk> [2000]
+0xEFBD U+9B2D # <cjk> [2000]
+0xEFBE U+9B5E # <cjk> [2000]
+0xEFBF U+9B79 # <cjk> [2000]
+0xEFC0 U+9B66 # <cjk> [2000]
+0xEFC1 U+9B72 # <cjk> [2000]
+0xEFC2 U+9B75 # <cjk> [2000]
+0xEFC3 U+9B84 # <cjk> [2000]
+0xEFC4 U+9B8A # <cjk> [2000]
+0xEFC5 U+9B8F # <cjk> [2000]
+0xEFC6 U+9B9E # <cjk> [2000]
+0xEFC7 U+9BA7 # <cjk> [2000]
+0xEFC8 U+9BC1 # <cjk> [2000]
+0xEFC9 U+9BCE # <cjk> [2000]
+0xEFCA U+9BE5 # <cjk> [2000]
+0xEFCB U+9BF8 # <cjk> [2000]
+0xEFCC U+9BFD # <cjk> [2000]
+0xEFCD U+9C00 # <cjk> [2000]
+0xEFCE U+9C23 # <cjk> [2000]
+0xEFCF U+9C41 # <cjk> [2000]
+0xEFD0 U+9C4F # <cjk> [2000]
+0xEFD1 U+9C50 # <cjk> [2000]
+0xEFD2 U+9C53 # <cjk> [2000]
+0xEFD3 U+9C63 # <cjk> [2000]
+0xEFD4 U+9C65 # <cjk> [2000]
+0xEFD5 U+9C77 # <cjk> [2000]
+0xEFD6 U+9D1D # <cjk> [2000]
+0xEFD7 U+9D1E # <cjk> [2000]
+0xEFD8 U+9D43 # <cjk> [2000]
+0xEFD9 U+9D47 # <cjk> [2000]
+0xEFDA U+9D52 # <cjk> [2000]
+0xEFDB U+9D63 # <cjk> [2000]
+0xEFDC U+9D70 # <cjk> [2000]
+0xEFDD U+9D7C # <cjk> [2000]
+0xEFDE U+9D8A # <cjk> [2000]
+0xEFDF U+9D96 # <cjk> [2000]
+0xEFE0 U+9DC0 # <cjk> [2000]
+0xEFE1 U+9DAC # <cjk> [2000]
+0xEFE2 U+9DBC # <cjk> [2000]
+0xEFE3 U+9DD7 # <cjk> [2000]
+0xEFE4 U+2A190 # <cjk> [2000] [Unicode3.1]
+0xEFE5 U+9DE7 # <cjk> [2000]
+0xEFE6 U+9E07 # <cjk> [2000]
+0xEFE7 U+9E15 # <cjk> [2000]
+0xEFE8 U+9E7C # <cjk> [2000]
+0xEFE9 U+9E9E # <cjk> [2000]
+0xEFEA U+9EA4 # <cjk> [2000]
+0xEFEB U+9EAC # <cjk> [2000]
+0xEFEC U+9EAF # <cjk> [2000]
+0xEFED U+9EB4 # <cjk> [2000]
+0xEFEE U+9EB5 # <cjk> [2000]
+0xEFEF U+9EC3 # <cjk> [2000]
+0xEFF0 U+9ED1 # <cjk> [2000]
+0xEFF1 U+9F10 # <cjk> [2000]
+0xEFF2 U+9F39 # <cjk> [2000]
+0xEFF3 U+9F57 # <cjk> [2000]
+0xEFF4 U+9F90 # <cjk> [2000]
+0xEFF5 U+9F94 # <cjk> [2000]
+0xEFF6 U+9F97 # <cjk> [2000]
+0xEFF7 U+9FA2 # <cjk> [2000]
+0xEFF8 U+59F8 # <cjk> [2004]
+0xEFF9 U+5C5B # <cjk> [2004]
+0xEFFA U+5E77 # <cjk> [2004]
+0xEFFB U+7626 # <cjk> [2004]
+0xEFFC U+7E6B # <cjk> [2004]
+0xF040 U+20089 # <cjk> [2000] [Unicode3.1]
+0xF041 U+4E02 # <cjk> [2000]
+0xF042 U+4E0F # <cjk> [2000]
+0xF043 U+4E12 # <cjk> [2000]
+0xF044 U+4E29 # <cjk> [2000]
+0xF045 U+4E2B # <cjk> [2000]
+0xF046 U+4E2E # <cjk> [2000]
+0xF047 U+4E40 # <cjk> [2000]
+0xF048 U+4E47 # <cjk> [2000]
+0xF049 U+4E48 # <cjk> [2000]
+0xF04A U+200A2 # <cjk> [2000] [Unicode3.1]
+0xF04B U+4E51 # <cjk> [2000]
+0xF04C U+3406 # <cjk> [2000]
+0xF04D U+200A4 # <cjk> [2000] [Unicode3.1]
+0xF04E U+4E5A # <cjk> [2000]
+0xF04F U+4E69 # <cjk> [2000]
+0xF050 U+4E9D # <cjk> [2000]
+0xF051 U+342C # <cjk> [2000]
+0xF052 U+342E # <cjk> [2000]
+0xF053 U+4EB9 # <cjk> [2000]
+0xF054 U+4EBB # <cjk> [2000]
+0xF055 U+201A2 # <cjk> [2000] [Unicode3.1]
+0xF056 U+4EBC # <cjk> [2000]
+0xF057 U+4EC3 # <cjk> [2000]
+0xF058 U+4EC8 # <cjk> [2000]
+0xF059 U+4ED0 # <cjk> [2000]
+0xF05A U+4EEB # <cjk> [2000]
+0xF05B U+4EDA # <cjk> [2000]
+0xF05C U+4EF1 # <cjk> [2000]
+0xF05D U+4EF5 # <cjk> [2000]
+0xF05E U+4F00 # <cjk> [2000]
+0xF05F U+4F16 # <cjk> [2000]
+0xF060 U+4F64 # <cjk> [2000]
+0xF061 U+4F37 # <cjk> [2000]
+0xF062 U+4F3E # <cjk> [2000]
+0xF063 U+4F54 # <cjk> [2000]
+0xF064 U+4F58 # <cjk> [2000]
+0xF065 U+20213 # <cjk> [2000] [Unicode3.1]
+0xF066 U+4F77 # <cjk> [2000]
+0xF067 U+4F78 # <cjk> [2000]
+0xF068 U+4F7A # <cjk> [2000]
+0xF069 U+4F7D # <cjk> [2000]
+0xF06A U+4F82 # <cjk> [2000]
+0xF06B U+4F85 # <cjk> [2000]
+0xF06C U+4F92 # <cjk> [2000]
+0xF06D U+4F9A # <cjk> [2000]
+0xF06E U+4FE6 # <cjk> [2000]
+0xF06F U+4FB2 # <cjk> [2000]
+0xF070 U+4FBE # <cjk> [2000]
+0xF071 U+4FC5 # <cjk> [2000]
+0xF072 U+4FCB # <cjk> [2000]
+0xF073 U+4FCF # <cjk> [2000]
+0xF074 U+4FD2 # <cjk> [2000]
+0xF075 U+346A # <cjk> [2000]
+0xF076 U+4FF2 # <cjk> [2000]
+0xF077 U+5000 # <cjk> [2000]
+0xF078 U+5010 # <cjk> [2000]
+0xF079 U+5013 # <cjk> [2000]
+0xF07A U+501C # <cjk> [2000]
+0xF07B U+501E # <cjk> [2000]
+0xF07C U+5022 # <cjk> [2000]
+0xF07D U+3468 # <cjk> [2000]
+0xF07E U+5042 # <cjk> [2000]
+0xF080 U+5046 # <cjk> [2000]
+0xF081 U+504E # <cjk> [2000]
+0xF082 U+5053 # <cjk> [2000]
+0xF083 U+5057 # <cjk> [2000]
+0xF084 U+5063 # <cjk> [2000]
+0xF085 U+5066 # <cjk> [2000]
+0xF086 U+506A # <cjk> [2000]
+0xF087 U+5070 # <cjk> [2000]
+0xF088 U+50A3 # <cjk> [2000]
+0xF089 U+5088 # <cjk> [2000]
+0xF08A U+5092 # <cjk> [2000]
+0xF08B U+5093 # <cjk> [2000]
+0xF08C U+5095 # <cjk> [2000]
+0xF08D U+5096 # <cjk> [2000]
+0xF08E U+509C # <cjk> [2000]
+0xF08F U+50AA # <cjk> [2000]
+0xF090 U+2032B # <cjk> [2000] [Unicode3.1]
+0xF091 U+50B1 # <cjk> [2000]
+0xF092 U+50BA # <cjk> [2000]
+0xF093 U+50BB # <cjk> [2000]
+0xF094 U+50C4 # <cjk> [2000]
+0xF095 U+50C7 # <cjk> [2000]
+0xF096 U+50F3 # <cjk> [2000]
+0xF097 U+20381 # <cjk> [2000] [Unicode3.1]
+0xF098 U+50CE # <cjk> [2000]
+0xF099 U+20371 # <cjk> [2000] [Unicode3.1]
+0xF09A U+50D4 # <cjk> [2000]
+0xF09B U+50D9 # <cjk> [2000]
+0xF09C U+50E1 # <cjk> [2000]
+0xF09D U+50E9 # <cjk> [2000]
+0xF09E U+3492 # <cjk> [2000]
+0xF140 U+5108 # <cjk> [2000]
+0xF141 U+203F9 # <cjk> [2000] [Unicode3.1]
+0xF142 U+5117 # <cjk> [2000]
+0xF143 U+511B # <cjk> [2000]
+0xF144 U+2044A # <cjk> [2000] [Unicode3.1]
+0xF145 U+5160 # <cjk> [2000]
+0xF146 U+20509 # <cjk> [2000] [Unicode3.1]
+0xF147 U+5173 # <cjk> [2000]
+0xF148 U+5183 # <cjk> [2000]
+0xF149 U+518B # <cjk> [2000]
+0xF14A U+34BC # <cjk> [2000]
+0xF14B U+5198 # <cjk> [2000]
+0xF14C U+51A3 # <cjk> [2000]
+0xF14D U+51AD # <cjk> [2000]
+0xF14E U+34C7 # <cjk> [2000]
+0xF14F U+51BC # <cjk> [2000]
+0xF150 U+205D6 # <cjk> [2000] [Unicode3.1]
+0xF151 U+20628 # <cjk> [2000] [Unicode3.1]
+0xF152 U+51F3 # <cjk> [2000]
+0xF153 U+51F4 # <cjk> [2000]
+0xF154 U+5202 # <cjk> [2000]
+0xF155 U+5212 # <cjk> [2000]
+0xF156 U+5216 # <cjk> [2000]
+0xF157 U+2074F # <cjk> [2000] [Unicode3.1]
+0xF158 U+5255 # <cjk> [2000]
+0xF159 U+525C # <cjk> [2000]
+0xF15A U+526C # <cjk> [2000]
+0xF15B U+5277 # <cjk> [2000]
+0xF15C U+5284 # <cjk> [2000]
+0xF15D U+5282 # <cjk> [2000]
+0xF15E U+20807 # <cjk> [2000] [Unicode3.1]
+0xF15F U+5298 # <cjk> [2000]
+0xF160 U+2083A # <cjk> [2000] [Unicode3.1]
+0xF161 U+52A4 # <cjk> [2000]
+0xF162 U+52A6 # <cjk> [2000]
+0xF163 U+52AF # <cjk> [2000]
+0xF164 U+52BA # <cjk> [2000]
+0xF165 U+52BB # <cjk> [2000]
+0xF166 U+52CA # <cjk> [2000]
+0xF167 U+351F # <cjk> [2000]
+0xF168 U+52D1 # <cjk> [2000]
+0xF169 U+208B9 # <cjk> [2000] [Unicode3.1]
+0xF16A U+52F7 # <cjk> [2000]
+0xF16B U+530A # <cjk> [2000]
+0xF16C U+530B # <cjk> [2000]
+0xF16D U+5324 # <cjk> [2000]
+0xF16E U+5335 # <cjk> [2000]
+0xF16F U+533E # <cjk> [2000]
+0xF170 U+5342 # <cjk> [2000]
+0xF171 U+2097C # <cjk> [2000] [Unicode3.1]
+0xF172 U+2099D # <cjk> [2000] [Unicode3.1]
+0xF173 U+5367 # <cjk> [2000]
+0xF174 U+536C # <cjk> [2000]
+0xF175 U+537A # <cjk> [2000]
+0xF176 U+53A4 # <cjk> [2000]
+0xF177 U+53B4 # <cjk> [2000]
+0xF178 U+20AD3 # <cjk> [2000] [Unicode3.1]
+0xF179 U+53B7 # <cjk> [2000]
+0xF17A U+53C0 # <cjk> [2000]
+0xF17B U+20B1D # <cjk> [2000] [Unicode3.1]
+0xF17C U+355D # <cjk> [2000]
+0xF17D U+355E # <cjk> [2000]
+0xF17E U+53D5 # <cjk> [2000]
+0xF180 U+53DA # <cjk> [2000]
+0xF181 U+3563 # <cjk> [2000]
+0xF182 U+53F4 # <cjk> [2000]
+0xF183 U+53F5 # <cjk> [2000]
+0xF184 U+5455 # <cjk> [2000]
+0xF185 U+5424 # <cjk> [2000]
+0xF186 U+5428 # <cjk> [2000]
+0xF187 U+356E # <cjk> [2000]
+0xF188 U+5443 # <cjk> [2000]
+0xF189 U+5462 # <cjk> [2000]
+0xF18A U+5466 # <cjk> [2000]
+0xF18B U+546C # <cjk> [2000]
+0xF18C U+548A # <cjk> [2000]
+0xF18D U+548D # <cjk> [2000]
+0xF18E U+5495 # <cjk> [2000]
+0xF18F U+54A0 # <cjk> [2000]
+0xF190 U+54A6 # <cjk> [2000]
+0xF191 U+54AD # <cjk> [2000]
+0xF192 U+54AE # <cjk> [2000]
+0xF193 U+54B7 # <cjk> [2000]
+0xF194 U+54BA # <cjk> [2000]
+0xF195 U+54BF # <cjk> [2000]
+0xF196 U+54C3 # <cjk> [2000]
+0xF197 U+20D45 # <cjk> [2000] [Unicode3.1]
+0xF198 U+54EC # <cjk> [2000]
+0xF199 U+54EF # <cjk> [2000]
+0xF19A U+54F1 # <cjk> [2000]
+0xF19B U+54F3 # <cjk> [2000]
+0xF19C U+5500 # <cjk> [2000]
+0xF19D U+5501 # <cjk> [2000]
+0xF19E U+5509 # <cjk> [2000]
+0xF19F U+553C # <cjk> [2000]
+0xF1A0 U+5541 # <cjk> [2000]
+0xF1A1 U+35A6 # <cjk> [2000]
+0xF1A2 U+5547 # <cjk> [2000]
+0xF1A3 U+554A # <cjk> [2000]
+0xF1A4 U+35A8 # <cjk> [2000]
+0xF1A5 U+5560 # <cjk> [2000]
+0xF1A6 U+5561 # <cjk> [2000]
+0xF1A7 U+5564 # <cjk> [2000]
+0xF1A8 U+20DE1 # <cjk> [2000] [Unicode3.1]
+0xF1A9 U+557D # <cjk> [2000]
+0xF1AA U+5582 # <cjk> [2000]
+0xF1AB U+5588 # <cjk> [2000]
+0xF1AC U+5591 # <cjk> [2000]
+0xF1AD U+35C5 # <cjk> [2000]
+0xF1AE U+55D2 # <cjk> [2000]
+0xF1AF U+20E95 # <cjk> [2000] [Unicode3.1]
+0xF1B0 U+20E6D # <cjk> [2000] [Unicode3.1]
+0xF1B1 U+55BF # <cjk> [2000]
+0xF1B2 U+55C9 # <cjk> [2000]
+0xF1B3 U+55CC # <cjk> [2000]
+0xF1B4 U+55D1 # <cjk> [2000]
+0xF1B5 U+55DD # <cjk> [2000]
+0xF1B6 U+35DA # <cjk> [2000]
+0xF1B7 U+55E2 # <cjk> [2000]
+0xF1B8 U+20E64 # <cjk> [2000] [Unicode3.1]
+0xF1B9 U+55E9 # <cjk> [2000]
+0xF1BA U+5628 # <cjk> [2000]
+0xF1BB U+20F5F # <cjk> [2000] [Unicode3.1]
+0xF1BC U+5607 # <cjk> [2000]
+0xF1BD U+5610 # <cjk> [2000]
+0xF1BE U+5630 # <cjk> [2000]
+0xF1BF U+5637 # <cjk> [2000]
+0xF1C0 U+35F4 # <cjk> [2000]
+0xF1C1 U+563D # <cjk> [2000]
+0xF1C2 U+563F # <cjk> [2000]
+0xF1C3 U+5640 # <cjk> [2000]
+0xF1C4 U+5647 # <cjk> [2000]
+0xF1C5 U+565E # <cjk> [2000]
+0xF1C6 U+5660 # <cjk> [2000]
+0xF1C7 U+566D # <cjk> [2000]
+0xF1C8 U+3605 # <cjk> [2000]
+0xF1C9 U+5688 # <cjk> [2000]
+0xF1CA U+568C # <cjk> [2000]
+0xF1CB U+5695 # <cjk> [2000]
+0xF1CC U+569A # <cjk> [2000]
+0xF1CD U+569D # <cjk> [2000]
+0xF1CE U+56A8 # <cjk> [2000]
+0xF1CF U+56AD # <cjk> [2000]
+0xF1D0 U+56B2 # <cjk> [2000]
+0xF1D1 U+56C5 # <cjk> [2000]
+0xF1D2 U+56CD # <cjk> [2000]
+0xF1D3 U+56DF # <cjk> [2000]
+0xF1D4 U+56E8 # <cjk> [2000]
+0xF1D5 U+56F6 # <cjk> [2000]
+0xF1D6 U+56F7 # <cjk> [2000]
+0xF1D7 U+21201 # <cjk> [2000] [Unicode3.1]
+0xF1D8 U+5715 # <cjk> [2000]
+0xF1D9 U+5723 # <cjk> [2000]
+0xF1DA U+21255 # <cjk> [2000] [Unicode3.1]
+0xF1DB U+5729 # <cjk> [2000]
+0xF1DC U+2127B # <cjk> [2000] [Unicode3.1]
+0xF1DD U+5745 # <cjk> [2000]
+0xF1DE U+5746 # <cjk> [2000]
+0xF1DF U+574C # <cjk> [2000]
+0xF1E0 U+574D # <cjk> [2000]
+0xF1E1 U+21274 # <cjk> [2000] [Unicode3.1]
+0xF1E2 U+5768 # <cjk> [2000]
+0xF1E3 U+576F # <cjk> [2000]
+0xF1E4 U+5773 # <cjk> [2000]
+0xF1E5 U+5774 # <cjk> [2000]
+0xF1E6 U+5775 # <cjk> [2000]
+0xF1E7 U+577B # <cjk> [2000]
+0xF1E8 U+212E4 # <cjk> [2000] [Unicode3.1]
+0xF1E9 U+212D7 # <cjk> [2000] [Unicode3.1]
+0xF1EA U+57AC # <cjk> [2000]
+0xF1EB U+579A # <cjk> [2000]
+0xF1EC U+579D # <cjk> [2000]
+0xF1ED U+579E # <cjk> [2000]
+0xF1EE U+57A8 # <cjk> [2000]
+0xF1EF U+57D7 # <cjk> [2000]
+0xF1F0 U+212FD # <cjk> [2000] [Unicode3.1]
+0xF1F1 U+57CC # <cjk> [2000]
+0xF1F2 U+21336 # <cjk> [2000] [Unicode3.1]
+0xF1F3 U+21344 # <cjk> [2000] [Unicode3.1]
+0xF1F4 U+57DE # <cjk> [2000]
+0xF1F5 U+57E6 # <cjk> [2000]
+0xF1F6 U+57F0 # <cjk> [2000]
+0xF1F7 U+364A # <cjk> [2000]
+0xF1F8 U+57F8 # <cjk> [2000]
+0xF1F9 U+57FB # <cjk> [2000]
+0xF1FA U+57FD # <cjk> [2000]
+0xF1FB U+5804 # <cjk> [2000]
+0xF1FC U+581E # <cjk> [2000]
+0xF240 U+5820 # <cjk> [2000]
+0xF241 U+5827 # <cjk> [2000]
+0xF242 U+5832 # <cjk> [2000]
+0xF243 U+5839 # <cjk> [2000]
+0xF244 U+213C4 # <cjk> [2000] [Unicode3.1]
+0xF245 U+5849 # <cjk> [2000]
+0xF246 U+584C # <cjk> [2000]
+0xF247 U+5867 # <cjk> [2000]
+0xF248 U+588A # <cjk> [2000]
+0xF249 U+588B # <cjk> [2000]
+0xF24A U+588D # <cjk> [2000]
+0xF24B U+588F # <cjk> [2000]
+0xF24C U+5890 # <cjk> [2000]
+0xF24D U+5894 # <cjk> [2000]
+0xF24E U+589D # <cjk> [2000]
+0xF24F U+58AA # <cjk> [2000]
+0xF250 U+58B1 # <cjk> [2000]
+0xF251 U+2146D # <cjk> [2000] [Unicode3.1]
+0xF252 U+58C3 # <cjk> [2000]
+0xF253 U+58CD # <cjk> [2000]
+0xF254 U+58E2 # <cjk> [2000]
+0xF255 U+58F3 # <cjk> [2000]
+0xF256 U+58F4 # <cjk> [2000]
+0xF257 U+5905 # <cjk> [2000]
+0xF258 U+5906 # <cjk> [2000]
+0xF259 U+590B # <cjk> [2000]
+0xF25A U+590D # <cjk> [2000]
+0xF25B U+5914 # <cjk> [2000]
+0xF25C U+5924 # <cjk> [2000]
+0xF25D U+215D7 # <cjk> [2000] [Unicode3.1]
+0xF25E U+3691 # <cjk> [2000]
+0xF25F U+593D # <cjk> [2000]
+0xF260 U+3699 # <cjk> [2000]
+0xF261 U+5946 # <cjk> [2000]
+0xF262 U+3696 # <cjk> [2000]
+0xF263 U+26C29 # <cjk> [2000] [Unicode3.1]
+0xF264 U+595B # <cjk> [2000]
+0xF265 U+595F # <cjk> [2000]
+0xF266 U+21647 # <cjk> [2000] [Unicode3.1]
+0xF267 U+5975 # <cjk> [2000]
+0xF268 U+5976 # <cjk> [2000]
+0xF269 U+597C # <cjk> [2000]
+0xF26A U+599F # <cjk> [2000]
+0xF26B U+59AE # <cjk> [2000]
+0xF26C U+59BC # <cjk> [2000]
+0xF26D U+59C8 # <cjk> [2000]
+0xF26E U+59CD # <cjk> [2000]
+0xF26F U+59DE # <cjk> [2000]
+0xF270 U+59E3 # <cjk> [2000]
+0xF271 U+59E4 # <cjk> [2000]
+0xF272 U+59E7 # <cjk> [2000]
+0xF273 U+59EE # <cjk> [2000]
+0xF274 U+21706 # <cjk> [2000] [Unicode3.1]
+0xF275 U+21742 # <cjk> [2000] [Unicode3.1]
+0xF276 U+36CF # <cjk> [2000]
+0xF277 U+5A0C # <cjk> [2000]
+0xF278 U+5A0D # <cjk> [2000]
+0xF279 U+5A17 # <cjk> [2000]
+0xF27A U+5A27 # <cjk> [2000]
+0xF27B U+5A2D # <cjk> [2000]
+0xF27C U+5A55 # <cjk> [2000]
+0xF27D U+5A65 # <cjk> [2000]
+0xF27E U+5A7A # <cjk> [2000]
+0xF280 U+5A8B # <cjk> [2000]
+0xF281 U+5A9C # <cjk> [2000]
+0xF282 U+5A9F # <cjk> [2000]
+0xF283 U+5AA0 # <cjk> [2000]
+0xF284 U+5AA2 # <cjk> [2000]
+0xF285 U+5AB1 # <cjk> [2000]
+0xF286 U+5AB3 # <cjk> [2000]
+0xF287 U+5AB5 # <cjk> [2000]
+0xF288 U+5ABA # <cjk> [2000]
+0xF289 U+5ABF # <cjk> [2000]
+0xF28A U+5ADA # <cjk> [2000]
+0xF28B U+5ADC # <cjk> [2000]
+0xF28C U+5AE0 # <cjk> [2000]
+0xF28D U+5AE5 # <cjk> [2000]
+0xF28E U+5AF0 # <cjk> [2000]
+0xF28F U+5AEE # <cjk> [2000]
+0xF290 U+5AF5 # <cjk> [2000]
+0xF291 U+5B00 # <cjk> [2000]
+0xF292 U+5B08 # <cjk> [2000]
+0xF293 U+5B17 # <cjk> [2000]
+0xF294 U+5B34 # <cjk> [2000]
+0xF295 U+5B2D # <cjk> [2000]
+0xF296 U+5B4C # <cjk> [2000]
+0xF297 U+5B52 # <cjk> [2000]
+0xF298 U+5B68 # <cjk> [2000]
+0xF299 U+5B6F # <cjk> [2000]
+0xF29A U+5B7C # <cjk> [2000]
+0xF29B U+5B7F # <cjk> [2000]
+0xF29C U+5B81 # <cjk> [2000]
+0xF29D U+5B84 # <cjk> [2000]
+0xF29E U+219C3 # <cjk> [2000] [Unicode3.1]
+0xF09F U+5B96 # <cjk> [2000]
+0xF0A0 U+5BAC # <cjk> [2000]
+0xF0A1 U+3761 # <cjk> [2000]
+0xF0A2 U+5BC0 # <cjk> [2000]
+0xF0A3 U+3762 # <cjk> [2000]
+0xF0A4 U+5BCE # <cjk> [2000]
+0xF0A5 U+5BD6 # <cjk> [2000]
+0xF0A6 U+376C # <cjk> [2000]
+0xF0A7 U+376B # <cjk> [2000]
+0xF0A8 U+5BF1 # <cjk> [2000]
+0xF0A9 U+5BFD # <cjk> [2000]
+0xF0AA U+3775 # <cjk> [2000]
+0xF0AB U+5C03 # <cjk> [2000]
+0xF0AC U+5C29 # <cjk> [2000]
+0xF0AD U+5C30 # <cjk> [2000]
+0xF0AE U+21C56 # <cjk> [2000] [Unicode3.1]
+0xF0AF U+5C5F # <cjk> [2000]
+0xF0B0 U+5C63 # <cjk> [2000]
+0xF0B1 U+5C67 # <cjk> [2000]
+0xF0B2 U+5C68 # <cjk> [2000]
+0xF0B3 U+5C69 # <cjk> [2000]
+0xF0B4 U+5C70 # <cjk> [2000]
+0xF0B5 U+21D2D # <cjk> [2000] [Unicode3.1]
+0xF0B6 U+21D45 # <cjk> [2000] [Unicode3.1]
+0xF0B7 U+5C7C # <cjk> [2000]
+0xF0B8 U+21D78 # <cjk> [2000] [Unicode3.1]
+0xF0B9 U+21D62 # <cjk> [2000] [Unicode3.1]
+0xF0BA U+5C88 # <cjk> [2000]
+0xF0BB U+5C8A # <cjk> [2000]
+0xF0BC U+37C1 # <cjk> [2000]
+0xF0BD U+21DA1 # <cjk> [2000] [Unicode3.1]
+0xF0BE U+21D9C # <cjk> [2000] [Unicode3.1]
+0xF0BF U+5CA0 # <cjk> [2000]
+0xF0C0 U+5CA2 # <cjk> [2000]
+0xF0C1 U+5CA6 # <cjk> [2000]
+0xF0C2 U+5CA7 # <cjk> [2000]
+0xF0C3 U+21D92 # <cjk> [2000] [Unicode3.1]
+0xF0C4 U+5CAD # <cjk> [2000]
+0xF0C5 U+5CB5 # <cjk> [2000]
+0xF0C6 U+21DB7 # <cjk> [2000] [Unicode3.1]
+0xF0C7 U+5CC9 # <cjk> [2000]
+0xF0C8 U+21DE0 # <cjk> [2000] [Unicode3.1]
+0xF0C9 U+21E33 # <cjk> [2000] [Unicode3.1]
+0xF0CA U+5D06 # <cjk> [2000]
+0xF0CB U+5D10 # <cjk> [2000]
+0xF0CC U+5D2B # <cjk> [2000]
+0xF0CD U+5D1D # <cjk> [2000]
+0xF0CE U+5D20 # <cjk> [2000]
+0xF0CF U+5D24 # <cjk> [2000]
+0xF0D0 U+5D26 # <cjk> [2000]
+0xF0D1 U+5D31 # <cjk> [2000]
+0xF0D2 U+5D39 # <cjk> [2000]
+0xF0D3 U+5D42 # <cjk> [2000]
+0xF0D4 U+37E8 # <cjk> [2000]
+0xF0D5 U+5D61 # <cjk> [2000]
+0xF0D6 U+5D6A # <cjk> [2000]
+0xF0D7 U+37F4 # <cjk> [2000]
+0xF0D8 U+5D70 # <cjk> [2000]
+0xF0D9 U+21F1E # <cjk> [2000] [Unicode3.1]
+0xF0DA U+37FD # <cjk> [2000]
+0xF0DB U+5D88 # <cjk> [2000]
+0xF0DC U+3800 # <cjk> [2000]
+0xF0DD U+5D92 # <cjk> [2000]
+0xF0DE U+5D94 # <cjk> [2000]
+0xF0DF U+5D97 # <cjk> [2000]
+0xF0E0 U+5D99 # <cjk> [2000]
+0xF0E1 U+5DB0 # <cjk> [2000]
+0xF0E2 U+5DB2 # <cjk> [2000]
+0xF0E3 U+5DB4 # <cjk> [2000]
+0xF0E4 U+21F76 # <cjk> [2000] [Unicode3.1]
+0xF0E5 U+5DB9 # <cjk> [2000]
+0xF0E6 U+5DD1 # <cjk> [2000]
+0xF0E7 U+5DD7 # <cjk> [2000]
+0xF0E8 U+5DD8 # <cjk> [2000]
+0xF0E9 U+5DE0 # <cjk> [2000]
+0xF0EA U+21FFA # <cjk> [2000] [Unicode3.1]
+0xF0EB U+5DE4 # <cjk> [2000]
+0xF0EC U+5DE9 # <cjk> [2000]
+0xF0ED U+382F # <cjk> [2000]
+0xF0EE U+5E00 # <cjk> [2000]
+0xF0EF U+3836 # <cjk> [2000]
+0xF0F0 U+5E12 # <cjk> [2000]
+0xF0F1 U+5E15 # <cjk> [2000]
+0xF0F2 U+3840 # <cjk> [2000]
+0xF0F3 U+5E1F # <cjk> [2000]
+0xF0F4 U+5E2E # <cjk> [2000]
+0xF0F5 U+5E3E # <cjk> [2000]
+0xF0F6 U+5E49 # <cjk> [2000]
+0xF0F7 U+385C # <cjk> [2000]
+0xF0F8 U+5E56 # <cjk> [2000]
+0xF0F9 U+3861 # <cjk> [2000]
+0xF0FA U+5E6B # <cjk> [2000]
+0xF0FB U+5E6C # <cjk> [2000]
+0xF0FC U+5E6D # <cjk> [2000]
+0xF29F U+5E6E # <cjk> [2000]
+0xF2A0 U+2217B # <cjk> [2000] [Unicode3.1]
+0xF2A1 U+5EA5 # <cjk> [2000]
+0xF2A2 U+5EAA # <cjk> [2000]
+0xF2A3 U+5EAC # <cjk> [2000]
+0xF2A4 U+5EB9 # <cjk> [2000]
+0xF2A5 U+5EBF # <cjk> [2000]
+0xF2A6 U+5EC6 # <cjk> [2000]
+0xF2A7 U+5ED2 # <cjk> [2000]
+0xF2A8 U+5ED9 # <cjk> [2000]
+0xF2A9 U+2231E # <cjk> [2000] [Unicode3.1]
+0xF2AA U+5EFD # <cjk> [2000]
+0xF2AB U+5F08 # <cjk> [2000]
+0xF2AC U+5F0E # <cjk> [2000]
+0xF2AD U+5F1C # <cjk> [2000]
+0xF2AE U+223AD # <cjk> [2000] [Unicode3.1]
+0xF2AF U+5F1E # <cjk> [2000]
+0xF2B0 U+5F47 # <cjk> [2000]
+0xF2B1 U+5F63 # <cjk> [2000]
+0xF2B2 U+5F72 # <cjk> [2000]
+0xF2B3 U+5F7E # <cjk> [2000]
+0xF2B4 U+5F8F # <cjk> [2000]
+0xF2B5 U+5FA2 # <cjk> [2000]
+0xF2B6 U+5FA4 # <cjk> [2000]
+0xF2B7 U+5FB8 # <cjk> [2000]
+0xF2B8 U+5FC4 # <cjk> [2000]
+0xF2B9 U+38FA # <cjk> [2000]
+0xF2BA U+5FC7 # <cjk> [2000]
+0xF2BB U+5FCB # <cjk> [2000]
+0xF2BC U+5FD2 # <cjk> [2000]
+0xF2BD U+5FD3 # <cjk> [2000]
+0xF2BE U+5FD4 # <cjk> [2000]
+0xF2BF U+5FE2 # <cjk> [2000]
+0xF2C0 U+5FEE # <cjk> [2000]
+0xF2C1 U+5FEF # <cjk> [2000]
+0xF2C2 U+5FF3 # <cjk> [2000]
+0xF2C3 U+5FFC # <cjk> [2000]
+0xF2C4 U+3917 # <cjk> [2000]
+0xF2C5 U+6017 # <cjk> [2000]
+0xF2C6 U+6022 # <cjk> [2000]
+0xF2C7 U+6024 # <cjk> [2000]
+0xF2C8 U+391A # <cjk> [2000]
+0xF2C9 U+604C # <cjk> [2000]
+0xF2CA U+607F # <cjk> [2000]
+0xF2CB U+608A # <cjk> [2000]
+0xF2CC U+6095 # <cjk> [2000]
+0xF2CD U+60A8 # <cjk> [2000]
+0xF2CE U+226F3 # <cjk> [2000] [Unicode3.1]
+0xF2CF U+60B0 # <cjk> [2000]
+0xF2D0 U+60B1 # <cjk> [2000]
+0xF2D1 U+60BE # <cjk> [2000]
+0xF2D2 U+60C8 # <cjk> [2000]
+0xF2D3 U+60D9 # <cjk> [2000]
+0xF2D4 U+60DB # <cjk> [2000]
+0xF2D5 U+60EE # <cjk> [2000]
+0xF2D6 U+60F2 # <cjk> [2000]
+0xF2D7 U+60F5 # <cjk> [2000]
+0xF2D8 U+6110 # <cjk> [2000]
+0xF2D9 U+6112 # <cjk> [2000]
+0xF2DA U+6113 # <cjk> [2000]
+0xF2DB U+6119 # <cjk> [2000]
+0xF2DC U+611E # <cjk> [2000]
+0xF2DD U+613A # <cjk> [2000]
+0xF2DE U+396F # <cjk> [2000]
+0xF2DF U+6141 # <cjk> [2000]
+0xF2E0 U+6146 # <cjk> [2000]
+0xF2E1 U+6160 # <cjk> [2000]
+0xF2E2 U+617C # <cjk> [2000]
+0xF2E3 U+2285B # <cjk> [2000] [Unicode3.1]
+0xF2E4 U+6192 # <cjk> [2000]
+0xF2E5 U+6193 # <cjk> [2000]
+0xF2E6 U+6197 # <cjk> [2000]
+0xF2E7 U+6198 # <cjk> [2000]
+0xF2E8 U+61A5 # <cjk> [2000]
+0xF2E9 U+61A8 # <cjk> [2000]
+0xF2EA U+61AD # <cjk> [2000]
+0xF2EB U+228AB # <cjk> [2000] [Unicode3.1]
+0xF2EC U+61D5 # <cjk> [2000]
+0xF2ED U+61DD # <cjk> [2000]
+0xF2EE U+61DF # <cjk> [2000]
+0xF2EF U+61F5 # <cjk> [2000]
+0xF2F0 U+2298F # <cjk> [2000] [Unicode3.1]
+0xF2F1 U+6215 # <cjk> [2000]
+0xF2F2 U+6223 # <cjk> [2000]
+0xF2F3 U+6229 # <cjk> [2000]
+0xF2F4 U+6246 # <cjk> [2000]
+0xF2F5 U+624C # <cjk> [2000]
+0xF2F6 U+6251 # <cjk> [2000]
+0xF2F7 U+6252 # <cjk> [2000]
+0xF2F8 U+6261 # <cjk> [2000]
+0xF2F9 U+6264 # <cjk> [2000]
+0xF2FA U+627B # <cjk> [2000]
+0xF2FB U+626D # <cjk> [2000]
+0xF2FC U+6273 # <cjk> [2000]
+0xF340 U+6299 # <cjk> [2000]
+0xF341 U+62A6 # <cjk> [2000]
+0xF342 U+62D5 # <cjk> [2000]
+0xF343 U+22AB8 # <cjk> [2000] [Unicode3.1]
+0xF344 U+62FD # <cjk> [2000]
+0xF345 U+6303 # <cjk> [2000]
+0xF346 U+630D # <cjk> [2000]
+0xF347 U+6310 # <cjk> [2000]
+0xF348 U+22B4F # <cjk> [2000] [Unicode3.1]
+0xF349 U+22B50 # <cjk> [2000] [Unicode3.1]
+0xF34A U+6332 # <cjk> [2000]
+0xF34B U+6335 # <cjk> [2000]
+0xF34C U+633B # <cjk> [2000]
+0xF34D U+633C # <cjk> [2000]
+0xF34E U+6341 # <cjk> [2000]
+0xF34F U+6344 # <cjk> [2000]
+0xF350 U+634E # <cjk> [2000]
+0xF351 U+22B46 # <cjk> [2000] [Unicode3.1]
+0xF352 U+6359 # <cjk> [2000]
+0xF353 U+22C1D # <cjk> [2000] [Unicode3.1]
+0xF354 U+22BA6 # <cjk> [2000] [Unicode3.1]
+0xF355 U+636C # <cjk> [2000]
+0xF356 U+6384 # <cjk> [2000]
+0xF357 U+6399 # <cjk> [2000]
+0xF358 U+22C24 # <cjk> [2000] [Unicode3.1]
+0xF359 U+6394 # <cjk> [2000]
+0xF35A U+63BD # <cjk> [2000]
+0xF35B U+63F7 # <cjk> [2000]
+0xF35C U+63D4 # <cjk> [2000]
+0xF35D U+63D5 # <cjk> [2000]
+0xF35E U+63DC # <cjk> [2000]
+0xF35F U+63E0 # <cjk> [2000]
+0xF360 U+63EB # <cjk> [2000]
+0xF361 U+63EC # <cjk> [2000]
+0xF362 U+63F2 # <cjk> [2000]
+0xF363 U+6409 # <cjk> [2000]
+0xF364 U+641E # <cjk> [2000]
+0xF365 U+6425 # <cjk> [2000]
+0xF366 U+6429 # <cjk> [2000]
+0xF367 U+642F # <cjk> [2000]
+0xF368 U+645A # <cjk> [2000]
+0xF369 U+645B # <cjk> [2000]
+0xF36A U+645D # <cjk> [2000]
+0xF36B U+6473 # <cjk> [2000]
+0xF36C U+647D # <cjk> [2000]
+0xF36D U+6487 # <cjk> [2000]
+0xF36E U+6491 # <cjk> [2000]
+0xF36F U+649D # <cjk> [2000]
+0xF370 U+649F # <cjk> [2000]
+0xF371 U+64CB # <cjk> [2000]
+0xF372 U+64CC # <cjk> [2000]
+0xF373 U+64D5 # <cjk> [2000]
+0xF374 U+64D7 # <cjk> [2000]
+0xF375 U+22DE1 # <cjk> [2000] [Unicode3.1]
+0xF376 U+64E4 # <cjk> [2000]
+0xF377 U+64E5 # <cjk> [2000]
+0xF378 U+64FF # <cjk> [2000]
+0xF379 U+6504 # <cjk> [2000]
+0xF37A U+3A6E # <cjk> [2000]
+0xF37B U+650F # <cjk> [2000]
+0xF37C U+6514 # <cjk> [2000]
+0xF37D U+6516 # <cjk> [2000]
+0xF37E U+3A73 # <cjk> [2000]
+0xF380 U+651E # <cjk> [2000]
+0xF381 U+6532 # <cjk> [2000]
+0xF382 U+6544 # <cjk> [2000]
+0xF383 U+6554 # <cjk> [2000]
+0xF384 U+656B # <cjk> [2000]
+0xF385 U+657A # <cjk> [2000]
+0xF386 U+6581 # <cjk> [2000]
+0xF387 U+6584 # <cjk> [2000]
+0xF388 U+6585 # <cjk> [2000]
+0xF389 U+658A # <cjk> [2000]
+0xF38A U+65B2 # <cjk> [2000]
+0xF38B U+65B5 # <cjk> [2000]
+0xF38C U+65B8 # <cjk> [2000]
+0xF38D U+65BF # <cjk> [2000]
+0xF38E U+65C2 # <cjk> [2000]
+0xF38F U+65C9 # <cjk> [2000]
+0xF390 U+65D4 # <cjk> [2000]
+0xF391 U+3AD6 # <cjk> [2000]
+0xF392 U+65F2 # <cjk> [2000]
+0xF393 U+65F9 # <cjk> [2000]
+0xF394 U+65FC # <cjk> [2000]
+0xF395 U+6604 # <cjk> [2000]
+0xF396 U+6608 # <cjk> [2000]
+0xF397 U+6621 # <cjk> [2000]
+0xF398 U+662A # <cjk> [2000]
+0xF399 U+6645 # <cjk> [2000]
+0xF39A U+6651 # <cjk> [2000]
+0xF39B U+664E # <cjk> [2000]
+0xF39C U+3AEA # <cjk> [2000]
+0xF39D U+231C3 # <cjk> [2000] [Unicode3.1]
+0xF39E U+6657 # <cjk> [2000]
+0xF39F U+665B # <cjk> [2000]
+0xF3A0 U+6663 # <cjk> [2000]
+0xF3A1 U+231F5 # <cjk> [2000] [Unicode3.1]
+0xF3A2 U+231B6 # <cjk> [2000] [Unicode3.1]
+0xF3A3 U+666A # <cjk> [2000]
+0xF3A4 U+666B # <cjk> [2000]
+0xF3A5 U+666C # <cjk> [2000]
+0xF3A6 U+666D # <cjk> [2000]
+0xF3A7 U+667B # <cjk> [2000]
+0xF3A8 U+6680 # <cjk> [2000]
+0xF3A9 U+6690 # <cjk> [2000]
+0xF3AA U+6692 # <cjk> [2000]
+0xF3AB U+6699 # <cjk> [2000]
+0xF3AC U+3B0E # <cjk> [2000]
+0xF3AD U+66AD # <cjk> [2000]
+0xF3AE U+66B1 # <cjk> [2000]
+0xF3AF U+66B5 # <cjk> [2000]
+0xF3B0 U+3B1A # <cjk> [2000]
+0xF3B1 U+66BF # <cjk> [2000]
+0xF3B2 U+3B1C # <cjk> [2000]
+0xF3B3 U+66EC # <cjk> [2000]
+0xF3B4 U+3AD7 # <cjk> [2000]
+0xF3B5 U+6701 # <cjk> [2000]
+0xF3B6 U+6705 # <cjk> [2000]
+0xF3B7 U+6712 # <cjk> [2000]
+0xF3B8 U+23372 # <cjk> [2000] [Unicode3.1]
+0xF3B9 U+6719 # <cjk> [2000]
+0xF3BA U+233D3 # <cjk> [2000] [Unicode3.1]
+0xF3BB U+233D2 # <cjk> [2000] [Unicode3.1]
+0xF3BC U+674C # <cjk> [2000]
+0xF3BD U+674D # <cjk> [2000]
+0xF3BE U+6754 # <cjk> [2000]
+0xF3BF U+675D # <cjk> [2000]
+0xF3C0 U+233D0 # <cjk> [2000] [Unicode3.1]
+0xF3C1 U+233E4 # <cjk> [2000] [Unicode3.1]
+0xF3C2 U+233D5 # <cjk> [2000] [Unicode3.1]
+0xF3C3 U+6774 # <cjk> [2000]
+0xF3C4 U+6776 # <cjk> [2000]
+0xF3C5 U+233DA # <cjk> [2000] [Unicode3.1]
+0xF3C6 U+6792 # <cjk> [2000]
+0xF3C7 U+233DF # <cjk> [2000] [Unicode3.1]
+0xF3C8 U+8363 # <cjk> [2000]
+0xF3C9 U+6810 # <cjk> [2000]
+0xF3CA U+67B0 # <cjk> [2000]
+0xF3CB U+67B2 # <cjk> [2000]
+0xF3CC U+67C3 # <cjk> [2000]
+0xF3CD U+67C8 # <cjk> [2000]
+0xF3CE U+67D2 # <cjk> [2000]
+0xF3CF U+67D9 # <cjk> [2000]
+0xF3D0 U+67DB # <cjk> [2000]
+0xF3D1 U+67F0 # <cjk> [2000]
+0xF3D2 U+67F7 # <cjk> [2000]
+0xF3D3 U+2344A # <cjk> [2000] [Unicode3.1]
+0xF3D4 U+23451 # <cjk> [2000] [Unicode3.1]
+0xF3D5 U+2344B # <cjk> [2000] [Unicode3.1]
+0xF3D6 U+6818 # <cjk> [2000]
+0xF3D7 U+681F # <cjk> [2000]
+0xF3D8 U+682D # <cjk> [2000]
+0xF3D9 U+23465 # <cjk> [2000] [Unicode3.1]
+0xF3DA U+6833 # <cjk> [2000]
+0xF3DB U+683B # <cjk> [2000]
+0xF3DC U+683E # <cjk> [2000]
+0xF3DD U+6844 # <cjk> [2000]
+0xF3DE U+6845 # <cjk> [2000]
+0xF3DF U+6849 # <cjk> [2000]
+0xF3E0 U+684C # <cjk> [2000]
+0xF3E1 U+6855 # <cjk> [2000]
+0xF3E2 U+6857 # <cjk> [2000]
+0xF3E3 U+3B77 # <cjk> [2000]
+0xF3E4 U+686B # <cjk> [2000]
+0xF3E5 U+686E # <cjk> [2000]
+0xF3E6 U+687A # <cjk> [2000]
+0xF3E7 U+687C # <cjk> [2000]
+0xF3E8 U+6882 # <cjk> [2000]
+0xF3E9 U+6890 # <cjk> [2000]
+0xF3EA U+6896 # <cjk> [2000]
+0xF3EB U+3B6D # <cjk> [2000]
+0xF3EC U+6898 # <cjk> [2000]
+0xF3ED U+6899 # <cjk> [2000]
+0xF3EE U+689A # <cjk> [2000]
+0xF3EF U+689C # <cjk> [2000]
+0xF3F0 U+68AA # <cjk> [2000]
+0xF3F1 U+68AB # <cjk> [2000]
+0xF3F2 U+68B4 # <cjk> [2000]
+0xF3F3 U+68BB # <cjk> [2000]
+0xF3F4 U+68FB # <cjk> [2000]
+0xF3F5 U+234E4 # <cjk> [2000] [Unicode3.1]
+0xF3F6 U+2355A # <cjk> [2000] [Unicode3.1]
+0xF3F7 U+FA13 # CJK COMPATIBILITY IDEOGRAPH-FA13 [2000]
+0xF3F8 U+68C3 # <cjk> [2000]
+0xF3F9 U+68C5 # <cjk> [2000]
+0xF3FA U+68CC # <cjk> [2000]
+0xF3FB U+68CF # <cjk> [2000]
+0xF3FC U+68D6 # <cjk> [2000]
+0xF440 U+68D9 # <cjk> [2000]
+0xF441 U+68E4 # <cjk> [2000]
+0xF442 U+68E5 # <cjk> [2000]
+0xF443 U+68EC # <cjk> [2000]
+0xF444 U+68F7 # <cjk> [2000]
+0xF445 U+6903 # <cjk> [2000]
+0xF446 U+6907 # <cjk> [2000]
+0xF447 U+3B87 # <cjk> [2000]
+0xF448 U+3B88 # <cjk> [2000]
+0xF449 U+23594 # <cjk> [2000] [Unicode3.1]
+0xF44A U+693B # <cjk> [2000]
+0xF44B U+3B8D # <cjk> [2000]
+0xF44C U+6946 # <cjk> [2000]
+0xF44D U+6969 # <cjk> [2000]
+0xF44E U+696C # <cjk> [2000]
+0xF44F U+6972 # <cjk> [2000]
+0xF450 U+697A # <cjk> [2000]
+0xF451 U+697F # <cjk> [2000]
+0xF452 U+6992 # <cjk> [2000]
+0xF453 U+3BA4 # <cjk> [2000]
+0xF454 U+6996 # <cjk> [2000]
+0xF455 U+6998 # <cjk> [2000]
+0xF456 U+69A6 # <cjk> [2000]
+0xF457 U+69B0 # <cjk> [2000]
+0xF458 U+69B7 # <cjk> [2000]
+0xF459 U+69BA # <cjk> [2000]
+0xF45A U+69BC # <cjk> [2000]
+0xF45B U+69C0 # <cjk> [2000]
+0xF45C U+69D1 # <cjk> [2000]
+0xF45D U+69D6 # <cjk> [2000]
+0xF45E U+23639 # <cjk> [2000] [Unicode3.1]
+0xF45F U+23647 # <cjk> [2000] [Unicode3.1]
+0xF460 U+6A30 # <cjk> [2000]
+0xF461 U+23638 # <cjk> [2000] [Unicode3.1]
+0xF462 U+2363A # <cjk> [2000] [Unicode3.1]
+0xF463 U+69E3 # <cjk> [2000]
+0xF464 U+69EE # <cjk> [2000]
+0xF465 U+69EF # <cjk> [2000]
+0xF466 U+69F3 # <cjk> [2000]
+0xF467 U+3BCD # <cjk> [2000]
+0xF468 U+69F4 # <cjk> [2000]
+0xF469 U+69FE # <cjk> [2000]
+0xF46A U+6A11 # <cjk> [2000]
+0xF46B U+6A1A # <cjk> [2000]
+0xF46C U+6A1D # <cjk> [2000]
+0xF46D U+2371C # <cjk> [2000] [Unicode3.1]
+0xF46E U+6A32 # <cjk> [2000]
+0xF46F U+6A33 # <cjk> [2000]
+0xF470 U+6A34 # <cjk> [2000]
+0xF471 U+6A3F # <cjk> [2000]
+0xF472 U+6A46 # <cjk> [2000]
+0xF473 U+6A49 # <cjk> [2000]
+0xF474 U+6A7A # <cjk> [2000]
+0xF475 U+6A4E # <cjk> [2000]
+0xF476 U+6A52 # <cjk> [2000]
+0xF477 U+6A64 # <cjk> [2000]
+0xF478 U+2370C # <cjk> [2000] [Unicode3.1]
+0xF479 U+6A7E # <cjk> [2000]
+0xF47A U+6A83 # <cjk> [2000]
+0xF47B U+6A8B # <cjk> [2000]
+0xF47C U+3BF0 # <cjk> [2000]
+0xF47D U+6A91 # <cjk> [2000]
+0xF47E U+6A9F # <cjk> [2000]
+0xF480 U+6AA1 # <cjk> [2000]
+0xF481 U+23764 # <cjk> [2000] [Unicode3.1]
+0xF482 U+6AAB # <cjk> [2000]
+0xF483 U+6ABD # <cjk> [2000]
+0xF484 U+6AC6 # <cjk> [2000]
+0xF485 U+6AD4 # <cjk> [2000]
+0xF486 U+6AD0 # <cjk> [2000]
+0xF487 U+6ADC # <cjk> [2000]
+0xF488 U+6ADD # <cjk> [2000]
+0xF489 U+237FF # <cjk> [2000] [Unicode3.1]
+0xF48A U+237E7 # <cjk> [2000] [Unicode3.1]
+0xF48B U+6AEC # <cjk> [2000]
+0xF48C U+6AF1 # <cjk> [2000]
+0xF48D U+6AF2 # <cjk> [2000]
+0xF48E U+6AF3 # <cjk> [2000]
+0xF48F U+6AFD # <cjk> [2000]
+0xF490 U+23824 # <cjk> [2000] [Unicode3.1]
+0xF491 U+6B0B # <cjk> [2000]
+0xF492 U+6B0F # <cjk> [2000]
+0xF493 U+6B10 # <cjk> [2000]
+0xF494 U+6B11 # <cjk> [2000]
+0xF495 U+2383D # <cjk> [2000] [Unicode3.1]
+0xF496 U+6B17 # <cjk> [2000]
+0xF497 U+3C26 # <cjk> [2000]
+0xF498 U+6B2F # <cjk> [2000]
+0xF499 U+6B4A # <cjk> [2000]
+0xF49A U+6B58 # <cjk> [2000]
+0xF49B U+6B6C # <cjk> [2000]
+0xF49C U+6B75 # <cjk> [2000]
+0xF49D U+6B7A # <cjk> [2000]
+0xF49E U+6B81 # <cjk> [2000]
+0xF49F U+6B9B # <cjk> [2000]
+0xF4A0 U+6BAE # <cjk> [2000]
+0xF4A1 U+23A98 # <cjk> [2000] [Unicode3.1]
+0xF4A2 U+6BBD # <cjk> [2000]
+0xF4A3 U+6BBE # <cjk> [2000]
+0xF4A4 U+6BC7 # <cjk> [2000]
+0xF4A5 U+6BC8 # <cjk> [2000]
+0xF4A6 U+6BC9 # <cjk> [2000]
+0xF4A7 U+6BDA # <cjk> [2000]
+0xF4A8 U+6BE6 # <cjk> [2000]
+0xF4A9 U+6BE7 # <cjk> [2000]
+0xF4AA U+6BEE # <cjk> [2000]
+0xF4AB U+6BF1 # <cjk> [2000]
+0xF4AC U+6C02 # <cjk> [2000]
+0xF4AD U+6C0A # <cjk> [2000]
+0xF4AE U+6C0E # <cjk> [2000]
+0xF4AF U+6C35 # <cjk> [2000]
+0xF4B0 U+6C36 # <cjk> [2000]
+0xF4B1 U+6C3A # <cjk> [2000]
+0xF4B2 U+23C7F # <cjk> [2000] [Unicode3.1]
+0xF4B3 U+6C3F # <cjk> [2000]
+0xF4B4 U+6C4D # <cjk> [2000]
+0xF4B5 U+6C5B # <cjk> [2000]
+0xF4B6 U+6C6D # <cjk> [2000]
+0xF4B7 U+6C84 # <cjk> [2000]
+0xF4B8 U+6C89 # <cjk> [2000]
+0xF4B9 U+3CC3 # <cjk> [2000]
+0xF4BA U+6C94 # <cjk> [2000]
+0xF4BB U+6C95 # <cjk> [2000]
+0xF4BC U+6C97 # <cjk> [2000]
+0xF4BD U+6CAD # <cjk> [2000]
+0xF4BE U+6CC2 # <cjk> [2000]
+0xF4BF U+6CD0 # <cjk> [2000]
+0xF4C0 U+3CD2 # <cjk> [2000]
+0xF4C1 U+6CD6 # <cjk> [2000]
+0xF4C2 U+6CDA # <cjk> [2000]
+0xF4C3 U+6CDC # <cjk> [2000]
+0xF4C4 U+6CE9 # <cjk> [2000]
+0xF4C5 U+6CEC # <cjk> [2000]
+0xF4C6 U+6CED # <cjk> [2000]
+0xF4C7 U+23D00 # <cjk> [2000] [Unicode3.1]
+0xF4C8 U+6D00 # <cjk> [2000]
+0xF4C9 U+6D0A # <cjk> [2000]
+0xF4CA U+6D24 # <cjk> [2000]
+0xF4CB U+6D26 # <cjk> [2000]
+0xF4CC U+6D27 # <cjk> [2000]
+0xF4CD U+6C67 # <cjk> [2000]
+0xF4CE U+6D2F # <cjk> [2000]
+0xF4CF U+6D3C # <cjk> [2000]
+0xF4D0 U+6D5B # <cjk> [2000]
+0xF4D1 U+6D5E # <cjk> [2000]
+0xF4D2 U+6D60 # <cjk> [2000]
+0xF4D3 U+6D70 # <cjk> [2000]
+0xF4D4 U+6D80 # <cjk> [2000]
+0xF4D5 U+6D81 # <cjk> [2000]
+0xF4D6 U+6D8A # <cjk> [2000]
+0xF4D7 U+6D8D # <cjk> [2000]
+0xF4D8 U+6D91 # <cjk> [2000]
+0xF4D9 U+6D98 # <cjk> [2000]
+0xF4DA U+23D40 # <cjk> [2000] [Unicode3.1]
+0xF4DB U+6E17 # <cjk> [2000]
+0xF4DC U+23DFA # <cjk> [2000] [Unicode3.1]
+0xF4DD U+23DF9 # <cjk> [2000] [Unicode3.1]
+0xF4DE U+23DD3 # <cjk> [2000] [Unicode3.1]
+0xF4DF U+6DAB # <cjk> [2000]
+0xF4E0 U+6DAE # <cjk> [2000]
+0xF4E1 U+6DB4 # <cjk> [2000]
+0xF4E2 U+6DC2 # <cjk> [2000]
+0xF4E3 U+6D34 # <cjk> [2000]
+0xF4E4 U+6DC8 # <cjk> [2000]
+0xF4E5 U+6DCE # <cjk> [2000]
+0xF4E6 U+6DCF # <cjk> [2000]
+0xF4E7 U+6DD0 # <cjk> [2000]
+0xF4E8 U+6DDF # <cjk> [2000]
+0xF4E9 U+6DE9 # <cjk> [2000]
+0xF4EA U+6DF6 # <cjk> [2000]
+0xF4EB U+6E36 # <cjk> [2000]
+0xF4EC U+6E1E # <cjk> [2000]
+0xF4ED U+6E22 # <cjk> [2000]
+0xF4EE U+6E27 # <cjk> [2000]
+0xF4EF U+3D11 # <cjk> [2000]
+0xF4F0 U+6E32 # <cjk> [2000]
+0xF4F1 U+6E3C # <cjk> [2000]
+0xF4F2 U+6E48 # <cjk> [2000]
+0xF4F3 U+6E49 # <cjk> [2000]
+0xF4F4 U+6E4B # <cjk> [2000]
+0xF4F5 U+6E4C # <cjk> [2000]
+0xF4F6 U+6E4F # <cjk> [2000]
+0xF4F7 U+6E51 # <cjk> [2000]
+0xF4F8 U+6E53 # <cjk> [2000]
+0xF4F9 U+6E54 # <cjk> [2000]
+0xF4FA U+6E57 # <cjk> [2000]
+0xF4FB U+6E63 # <cjk> [2000]
+0xF4FC U+3D1E # <cjk> [2000]
+0xF540 U+6E93 # <cjk> [2000]
+0xF541 U+6EA7 # <cjk> [2000]
+0xF542 U+6EB4 # <cjk> [2000]
+0xF543 U+6EBF # <cjk> [2000]
+0xF544 U+6EC3 # <cjk> [2000]
+0xF545 U+6ECA # <cjk> [2000]
+0xF546 U+6ED9 # <cjk> [2000]
+0xF547 U+6F35 # <cjk> [2000]
+0xF548 U+6EEB # <cjk> [2000]
+0xF549 U+6EF9 # <cjk> [2000]
+0xF54A U+6EFB # <cjk> [2000]
+0xF54B U+6F0A # <cjk> [2000]
+0xF54C U+6F0C # <cjk> [2000]
+0xF54D U+6F18 # <cjk> [2000]
+0xF54E U+6F25 # <cjk> [2000]
+0xF54F U+6F36 # <cjk> [2000]
+0xF550 U+6F3C # <cjk> [2000]
+0xF551 U+23F7E # <cjk> [2000] [Unicode3.1]
+0xF552 U+6F52 # <cjk> [2000]
+0xF553 U+6F57 # <cjk> [2000]
+0xF554 U+6F5A # <cjk> [2000]
+0xF555 U+6F60 # <cjk> [2000]
+0xF556 U+6F68 # <cjk> [2000]
+0xF557 U+6F98 # <cjk> [2000]
+0xF558 U+6F7D # <cjk> [2000]
+0xF559 U+6F90 # <cjk> [2000]
+0xF55A U+6F96 # <cjk> [2000]
+0xF55B U+6FBE # <cjk> [2000]
+0xF55C U+6F9F # <cjk> [2000]
+0xF55D U+6FA5 # <cjk> [2000]
+0xF55E U+6FAF # <cjk> [2000]
+0xF55F U+3D64 # <cjk> [2000]
+0xF560 U+6FB5 # <cjk> [2000]
+0xF561 U+6FC8 # <cjk> [2000]
+0xF562 U+6FC9 # <cjk> [2000]
+0xF563 U+6FDA # <cjk> [2000]
+0xF564 U+6FDE # <cjk> [2000]
+0xF565 U+6FE9 # <cjk> [2000]
+0xF566 U+24096 # <cjk> [2000] [Unicode3.1]
+0xF567 U+6FFC # <cjk> [2000]
+0xF568 U+7000 # <cjk> [2000]
+0xF569 U+7007 # <cjk> [2000]
+0xF56A U+700A # <cjk> [2000]
+0xF56B U+7023 # <cjk> [2000]
+0xF56C U+24103 # <cjk> [2000] [Unicode3.1]
+0xF56D U+7039 # <cjk> [2000]
+0xF56E U+703A # <cjk> [2000]
+0xF56F U+703C # <cjk> [2000]
+0xF570 U+7043 # <cjk> [2000]
+0xF571 U+7047 # <cjk> [2000]
+0xF572 U+704B # <cjk> [2000]
+0xF573 U+3D9A # <cjk> [2000]
+0xF574 U+7054 # <cjk> [2000]
+0xF575 U+7065 # <cjk> [2000]
+0xF576 U+7069 # <cjk> [2000]
+0xF577 U+706C # <cjk> [2000]
+0xF578 U+706E # <cjk> [2000]
+0xF579 U+7076 # <cjk> [2000]
+0xF57A U+707E # <cjk> [2000]
+0xF57B U+7081 # <cjk> [2000]
+0xF57C U+7086 # <cjk> [2000]
+0xF57D U+7095 # <cjk> [2000]
+0xF57E U+7097 # <cjk> [2000]
+0xF580 U+70BB # <cjk> [2000]
+0xF581 U+241C6 # <cjk> [2000] [Unicode3.1]
+0xF582 U+709F # <cjk> [2000]
+0xF583 U+70B1 # <cjk> [2000]
+0xF584 U+241FE # <cjk> [2000] [Unicode3.1]
+0xF585 U+70EC # <cjk> [2000]
+0xF586 U+70CA # <cjk> [2000]
+0xF587 U+70D1 # <cjk> [2000]
+0xF588 U+70D3 # <cjk> [2000]
+0xF589 U+70DC # <cjk> [2000]
+0xF58A U+7103 # <cjk> [2000]
+0xF58B U+7104 # <cjk> [2000]
+0xF58C U+7106 # <cjk> [2000]
+0xF58D U+7107 # <cjk> [2000]
+0xF58E U+7108 # <cjk> [2000]
+0xF58F U+710C # <cjk> [2000]
+0xF590 U+3DC0 # <cjk> [2000]
+0xF591 U+712F # <cjk> [2000]
+0xF592 U+7131 # <cjk> [2000]
+0xF593 U+7150 # <cjk> [2000]
+0xF594 U+714A # <cjk> [2000]
+0xF595 U+7153 # <cjk> [2000]
+0xF596 U+715E # <cjk> [2000]
+0xF597 U+3DD4 # <cjk> [2000]
+0xF598 U+7196 # <cjk> [2000]
+0xF599 U+7180 # <cjk> [2000]
+0xF59A U+719B # <cjk> [2000]
+0xF59B U+71A0 # <cjk> [2000]
+0xF59C U+71A2 # <cjk> [2000]
+0xF59D U+71AE # <cjk> [2000]
+0xF59E U+71AF # <cjk> [2000]
+0xF59F U+71B3 # <cjk> [2000]
+0xF5A0 U+243BC # <cjk> [2000] [Unicode3.1]
+0xF5A1 U+71CB # <cjk> [2000]
+0xF5A2 U+71D3 # <cjk> [2000]
+0xF5A3 U+71D9 # <cjk> [2000]
+0xF5A4 U+71DC # <cjk> [2000]
+0xF5A5 U+7207 # <cjk> [2000]
+0xF5A6 U+3E05 # <cjk> [2000]
+0xF5A7 U+FA49 # CJK COMPATIBILITY IDEOGRAPH-FA49 [2000] [Unicode3.2]
+0xF5A8 U+722B # <cjk> [2000]
+0xF5A9 U+7234 # <cjk> [2000]
+0xF5AA U+7238 # <cjk> [2000]
+0xF5AB U+7239 # <cjk> [2000]
+0xF5AC U+4E2C # <cjk> [2000]
+0xF5AD U+7242 # <cjk> [2000]
+0xF5AE U+7253 # <cjk> [2000]
+0xF5AF U+7257 # <cjk> [2000]
+0xF5B0 U+7263 # <cjk> [2000]
+0xF5B1 U+24629 # <cjk> [2000] [Unicode3.1]
+0xF5B2 U+726E # <cjk> [2000]
+0xF5B3 U+726F # <cjk> [2000]
+0xF5B4 U+7278 # <cjk> [2000]
+0xF5B5 U+727F # <cjk> [2000]
+0xF5B6 U+728E # <cjk> [2000]
+0xF5B7 U+246A5 # <cjk> [2000] [Unicode3.1]
+0xF5B8 U+72AD # <cjk> [2000]
+0xF5B9 U+72AE # <cjk> [2000]
+0xF5BA U+72B0 # <cjk> [2000]
+0xF5BB U+72B1 # <cjk> [2000]
+0xF5BC U+72C1 # <cjk> [2000]
+0xF5BD U+3E60 # <cjk> [2000]
+0xF5BE U+72CC # <cjk> [2000]
+0xF5BF U+3E66 # <cjk> [2000]
+0xF5C0 U+3E68 # <cjk> [2000]
+0xF5C1 U+72F3 # <cjk> [2000]
+0xF5C2 U+72FA # <cjk> [2000]
+0xF5C3 U+7307 # <cjk> [2000]
+0xF5C4 U+7312 # <cjk> [2000]
+0xF5C5 U+7318 # <cjk> [2000]
+0xF5C6 U+7319 # <cjk> [2000]
+0xF5C7 U+3E83 # <cjk> [2000]
+0xF5C8 U+7339 # <cjk> [2000]
+0xF5C9 U+732C # <cjk> [2000]
+0xF5CA U+7331 # <cjk> [2000]
+0xF5CB U+7333 # <cjk> [2000]
+0xF5CC U+733D # <cjk> [2000]
+0xF5CD U+7352 # <cjk> [2000]
+0xF5CE U+3E94 # <cjk> [2000]
+0xF5CF U+736B # <cjk> [2000]
+0xF5D0 U+736C # <cjk> [2000]
+0xF5D1 U+24896 # <cjk> [2000] [Unicode3.1]
+0xF5D2 U+736E # <cjk> [2000]
+0xF5D3 U+736F # <cjk> [2000]
+0xF5D4 U+7371 # <cjk> [2000]
+0xF5D5 U+7377 # <cjk> [2000]
+0xF5D6 U+7381 # <cjk> [2000]
+0xF5D7 U+7385 # <cjk> [2000]
+0xF5D8 U+738A # <cjk> [2000]
+0xF5D9 U+7394 # <cjk> [2000]
+0xF5DA U+7398 # <cjk> [2000]
+0xF5DB U+739C # <cjk> [2000]
+0xF5DC U+739E # <cjk> [2000]
+0xF5DD U+73A5 # <cjk> [2000]
+0xF5DE U+73A8 # <cjk> [2000]
+0xF5DF U+73B5 # <cjk> [2000]
+0xF5E0 U+73B7 # <cjk> [2000]
+0xF5E1 U+73B9 # <cjk> [2000]
+0xF5E2 U+73BC # <cjk> [2000]
+0xF5E3 U+73BF # <cjk> [2000]
+0xF5E4 U+73C5 # <cjk> [2000]
+0xF5E5 U+73CB # <cjk> [2000]
+0xF5E6 U+73E1 # <cjk> [2000]
+0xF5E7 U+73E7 # <cjk> [2000]
+0xF5E8 U+73F9 # <cjk> [2000]
+0xF5E9 U+7413 # <cjk> [2000]
+0xF5EA U+73FA # <cjk> [2000]
+0xF5EB U+7401 # <cjk> [2000]
+0xF5EC U+7424 # <cjk> [2000]
+0xF5ED U+7431 # <cjk> [2000]
+0xF5EE U+7439 # <cjk> [2000]
+0xF5EF U+7453 # <cjk> [2000]
+0xF5F0 U+7440 # <cjk> [2000]
+0xF5F1 U+7443 # <cjk> [2000]
+0xF5F2 U+744D # <cjk> [2000]
+0xF5F3 U+7452 # <cjk> [2000]
+0xF5F4 U+745D # <cjk> [2000]
+0xF5F5 U+7471 # <cjk> [2000]
+0xF5F6 U+7481 # <cjk> [2000]
+0xF5F7 U+7485 # <cjk> [2000]
+0xF5F8 U+7488 # <cjk> [2000]
+0xF5F9 U+24A4D # <cjk> [2000] [Unicode3.1]
+0xF5FA U+7492 # <cjk> [2000]
+0xF5FB U+7497 # <cjk> [2000]
+0xF5FC U+7499 # <cjk> [2000]
+0xF640 U+74A0 # <cjk> [2000]
+0xF641 U+74A1 # <cjk> [2000]
+0xF642 U+74A5 # <cjk> [2000]
+0xF643 U+74AA # <cjk> [2000]
+0xF644 U+74AB # <cjk> [2000]
+0xF645 U+74B9 # <cjk> [2000]
+0xF646 U+74BB # <cjk> [2000]
+0xF647 U+74BA # <cjk> [2000]
+0xF648 U+74D6 # <cjk> [2000]
+0xF649 U+74D8 # <cjk> [2000]
+0xF64A U+74DE # <cjk> [2000]
+0xF64B U+74EF # <cjk> [2000]
+0xF64C U+74EB # <cjk> [2000]
+0xF64D U+24B56 # <cjk> [2000] [Unicode3.1]
+0xF64E U+74FA # <cjk> [2000]
+0xF64F U+24B6F # <cjk> [2000] [Unicode3.1]
+0xF650 U+7520 # <cjk> [2000]
+0xF651 U+7524 # <cjk> [2000]
+0xF652 U+752A # <cjk> [2000]
+0xF653 U+3F57 # <cjk> [2000]
+0xF654 U+24C16 # <cjk> [2000] [Unicode3.1]
+0xF655 U+753D # <cjk> [2000]
+0xF656 U+753E # <cjk> [2000]
+0xF657 U+7540 # <cjk> [2000]
+0xF658 U+7548 # <cjk> [2000]
+0xF659 U+754E # <cjk> [2000]
+0xF65A U+7550 # <cjk> [2000]
+0xF65B U+7552 # <cjk> [2000]
+0xF65C U+756C # <cjk> [2000]
+0xF65D U+7572 # <cjk> [2000]
+0xF65E U+7571 # <cjk> [2000]
+0xF65F U+757A # <cjk> [2000]
+0xF660 U+757D # <cjk> [2000]
+0xF661 U+757E # <cjk> [2000]
+0xF662 U+7581 # <cjk> [2000]
+0xF663 U+24D14 # <cjk> [2000] [Unicode3.1]
+0xF664 U+758C # <cjk> [2000]
+0xF665 U+3F75 # <cjk> [2000]
+0xF666 U+75A2 # <cjk> [2000]
+0xF667 U+3F77 # <cjk> [2000]
+0xF668 U+75B0 # <cjk> [2000]
+0xF669 U+75B7 # <cjk> [2000]
+0xF66A U+75BF # <cjk> [2000]
+0xF66B U+75C0 # <cjk> [2000]
+0xF66C U+75C6 # <cjk> [2000]
+0xF66D U+75CF # <cjk> [2000]
+0xF66E U+75D3 # <cjk> [2000]
+0xF66F U+75DD # <cjk> [2000]
+0xF670 U+75DF # <cjk> [2000]
+0xF671 U+75E0 # <cjk> [2000]
+0xF672 U+75E7 # <cjk> [2000]
+0xF673 U+75EC # <cjk> [2000]
+0xF674 U+75EE # <cjk> [2000]
+0xF675 U+75F1 # <cjk> [2000]
+0xF676 U+75F9 # <cjk> [2000]
+0xF677 U+7603 # <cjk> [2000]
+0xF678 U+7618 # <cjk> [2000]
+0xF679 U+7607 # <cjk> [2000]
+0xF67A U+760F # <cjk> [2000]
+0xF67B U+3FAE # <cjk> [2000]
+0xF67C U+24E0E # <cjk> [2000] [Unicode3.1]
+0xF67D U+7613 # <cjk> [2000]
+0xF67E U+761B # <cjk> [2000]
+0xF680 U+761C # <cjk> [2000]
+0xF681 U+24E37 # <cjk> [2000] [Unicode3.1]
+0xF682 U+7625 # <cjk> [2000]
+0xF683 U+7628 # <cjk> [2000]
+0xF684 U+763C # <cjk> [2000]
+0xF685 U+7633 # <cjk> [2000]
+0xF686 U+24E6A # <cjk> [2000] [Unicode3.1]
+0xF687 U+3FC9 # <cjk> [2000]
+0xF688 U+7641 # <cjk> [2000]
+0xF689 U+24E8B # <cjk> [2000] [Unicode3.1]
+0xF68A U+7649 # <cjk> [2000]
+0xF68B U+7655 # <cjk> [2000]
+0xF68C U+3FD7 # <cjk> [2000]
+0xF68D U+766E # <cjk> [2000]
+0xF68E U+7695 # <cjk> [2000]
+0xF68F U+769C # <cjk> [2000]
+0xF690 U+76A1 # <cjk> [2000]
+0xF691 U+76A0 # <cjk> [2000]
+0xF692 U+76A7 # <cjk> [2000]
+0xF693 U+76A8 # <cjk> [2000]
+0xF694 U+76AF # <cjk> [2000]
+0xF695 U+2504A # <cjk> [2000] [Unicode3.1]
+0xF696 U+76C9 # <cjk> [2000]
+0xF697 U+25055 # <cjk> [2000] [Unicode3.1]
+0xF698 U+76E8 # <cjk> [2000]
+0xF699 U+76EC # <cjk> [2000]
+0xF69A U+25122 # <cjk> [2000] [Unicode3.1]
+0xF69B U+7717 # <cjk> [2000]
+0xF69C U+771A # <cjk> [2000]
+0xF69D U+772D # <cjk> [2000]
+0xF69E U+7735 # <cjk> [2000]
+0xF69F U+251A9 # <cjk> [2000] [Unicode3.1]
+0xF6A0 U+4039 # <cjk> [2000]
+0xF6A1 U+251E5 # <cjk> [2000] [Unicode3.1]
+0xF6A2 U+251CD # <cjk> [2000] [Unicode3.1]
+0xF6A3 U+7758 # <cjk> [2000]
+0xF6A4 U+7760 # <cjk> [2000]
+0xF6A5 U+776A # <cjk> [2000]
+0xF6A6 U+2521E # <cjk> [2000] [Unicode3.1]
+0xF6A7 U+7772 # <cjk> [2000]
+0xF6A8 U+777C # <cjk> [2000]
+0xF6A9 U+777D # <cjk> [2000]
+0xF6AA U+2524C # <cjk> [2000] [Unicode3.1]
+0xF6AB U+4058 # <cjk> [2000]
+0xF6AC U+779A # <cjk> [2000]
+0xF6AD U+779F # <cjk> [2000]
+0xF6AE U+77A2 # <cjk> [2000]
+0xF6AF U+77A4 # <cjk> [2000]
+0xF6B0 U+77A9 # <cjk> [2000]
+0xF6B1 U+77DE # <cjk> [2000]
+0xF6B2 U+77DF # <cjk> [2000]
+0xF6B3 U+77E4 # <cjk> [2000]
+0xF6B4 U+77E6 # <cjk> [2000]
+0xF6B5 U+77EA # <cjk> [2000]
+0xF6B6 U+77EC # <cjk> [2000]
+0xF6B7 U+4093 # <cjk> [2000]
+0xF6B8 U+77F0 # <cjk> [2000]
+0xF6B9 U+77F4 # <cjk> [2000]
+0xF6BA U+77FB # <cjk> [2000]
+0xF6BB U+2542E # <cjk> [2000] [Unicode3.1]
+0xF6BC U+7805 # <cjk> [2000]
+0xF6BD U+7806 # <cjk> [2000]
+0xF6BE U+7809 # <cjk> [2000]
+0xF6BF U+780D # <cjk> [2000]
+0xF6C0 U+7819 # <cjk> [2000]
+0xF6C1 U+7821 # <cjk> [2000]
+0xF6C2 U+782C # <cjk> [2000]
+0xF6C3 U+7847 # <cjk> [2000]
+0xF6C4 U+7864 # <cjk> [2000]
+0xF6C5 U+786A # <cjk> [2000]
+0xF6C6 U+254D9 # <cjk> [2000] [Unicode3.1]
+0xF6C7 U+788A # <cjk> [2000]
+0xF6C8 U+7894 # <cjk> [2000]
+0xF6C9 U+78A4 # <cjk> [2000]
+0xF6CA U+789D # <cjk> [2000]
+0xF6CB U+789E # <cjk> [2000]
+0xF6CC U+789F # <cjk> [2000]
+0xF6CD U+78BB # <cjk> [2000]
+0xF6CE U+78C8 # <cjk> [2000]
+0xF6CF U+78CC # <cjk> [2000]
+0xF6D0 U+78CE # <cjk> [2000]
+0xF6D1 U+78D5 # <cjk> [2000]
+0xF6D2 U+78E0 # <cjk> [2000]
+0xF6D3 U+78E1 # <cjk> [2000]
+0xF6D4 U+78E6 # <cjk> [2000]
+0xF6D5 U+78F9 # <cjk> [2000]
+0xF6D6 U+78FA # <cjk> [2000]
+0xF6D7 U+78FB # <cjk> [2000]
+0xF6D8 U+78FE # <cjk> [2000]
+0xF6D9 U+255A7 # <cjk> [2000] [Unicode3.1]
+0xF6DA U+7910 # <cjk> [2000]
+0xF6DB U+791B # <cjk> [2000]
+0xF6DC U+7930 # <cjk> [2000]
+0xF6DD U+7925 # <cjk> [2000]
+0xF6DE U+793B # <cjk> [2000]
+0xF6DF U+794A # <cjk> [2000]
+0xF6E0 U+7958 # <cjk> [2000]
+0xF6E1 U+795B # <cjk> [2000]
+0xF6E2 U+4105 # <cjk> [2000]
+0xF6E3 U+7967 # <cjk> [2000]
+0xF6E4 U+7972 # <cjk> [2000]
+0xF6E5 U+7994 # <cjk> [2000]
+0xF6E6 U+7995 # <cjk> [2000]
+0xF6E7 U+7996 # <cjk> [2000]
+0xF6E8 U+799B # <cjk> [2000]
+0xF6E9 U+79A1 # <cjk> [2000]
+0xF6EA U+79A9 # <cjk> [2000]
+0xF6EB U+79B4 # <cjk> [2000]
+0xF6EC U+79BB # <cjk> [2000]
+0xF6ED U+79C2 # <cjk> [2000]
+0xF6EE U+79C7 # <cjk> [2000]
+0xF6EF U+79CC # <cjk> [2000]
+0xF6F0 U+79CD # <cjk> [2000]
+0xF6F1 U+79D6 # <cjk> [2000]
+0xF6F2 U+4148 # <cjk> [2000]
+0xF6F3 U+257A9 # <cjk> [2000] [Unicode3.1]
+0xF6F4 U+257B4 # <cjk> [2000] [Unicode3.1]
+0xF6F5 U+414F # <cjk> [2000]
+0xF6F6 U+7A0A # <cjk> [2000]
+0xF6F7 U+7A11 # <cjk> [2000]
+0xF6F8 U+7A15 # <cjk> [2000]
+0xF6F9 U+7A1B # <cjk> [2000]
+0xF6FA U+7A1E # <cjk> [2000]
+0xF6FB U+4163 # <cjk> [2000]
+0xF6FC U+7A2D # <cjk> [2000]
+0xF740 U+7A38 # <cjk> [2000]
+0xF741 U+7A47 # <cjk> [2000]
+0xF742 U+7A4C # <cjk> [2000]
+0xF743 U+7A56 # <cjk> [2000]
+0xF744 U+7A59 # <cjk> [2000]
+0xF745 U+7A5C # <cjk> [2000]
+0xF746 U+7A5F # <cjk> [2000]
+0xF747 U+7A60 # <cjk> [2000]
+0xF748 U+7A67 # <cjk> [2000]
+0xF749 U+7A6A # <cjk> [2000]
+0xF74A U+7A75 # <cjk> [2000]
+0xF74B U+7A78 # <cjk> [2000]
+0xF74C U+7A82 # <cjk> [2000]
+0xF74D U+7A8A # <cjk> [2000]
+0xF74E U+7A90 # <cjk> [2000]
+0xF74F U+7AA3 # <cjk> [2000]
+0xF750 U+7AAC # <cjk> [2000]
+0xF751 U+259D4 # <cjk> [2000] [Unicode3.1]
+0xF752 U+41B4 # <cjk> [2000]
+0xF753 U+7AB9 # <cjk> [2000]
+0xF754 U+7ABC # <cjk> [2000]
+0xF755 U+7ABE # <cjk> [2000]
+0xF756 U+41BF # <cjk> [2000]
+0xF757 U+7ACC # <cjk> [2000]
+0xF758 U+7AD1 # <cjk> [2000]
+0xF759 U+7AE7 # <cjk> [2000]
+0xF75A U+7AE8 # <cjk> [2000]
+0xF75B U+7AF4 # <cjk> [2000]
+0xF75C U+25AE4 # <cjk> [2000] [Unicode3.1]
+0xF75D U+25AE3 # <cjk> [2000] [Unicode3.1]
+0xF75E U+7B07 # <cjk> [2000]
+0xF75F U+25AF1 # <cjk> [2000] [Unicode3.1]
+0xF760 U+7B3D # <cjk> [2000]
+0xF761 U+7B27 # <cjk> [2000]
+0xF762 U+7B2A # <cjk> [2000]
+0xF763 U+7B2E # <cjk> [2000]
+0xF764 U+7B2F # <cjk> [2000]
+0xF765 U+7B31 # <cjk> [2000]
+0xF766 U+41E6 # <cjk> [2000]
+0xF767 U+41F3 # <cjk> [2000]
+0xF768 U+7B7F # <cjk> [2000]
+0xF769 U+7B41 # <cjk> [2000]
+0xF76A U+41EE # <cjk> [2000]
+0xF76B U+7B55 # <cjk> [2000]
+0xF76C U+7B79 # <cjk> [2000]
+0xF76D U+7B64 # <cjk> [2000]
+0xF76E U+7B66 # <cjk> [2000]
+0xF76F U+7B69 # <cjk> [2000]
+0xF770 U+7B73 # <cjk> [2000]
+0xF771 U+25BB2 # <cjk> [2000] [Unicode3.1]
+0xF772 U+4207 # <cjk> [2000]
+0xF773 U+7B90 # <cjk> [2000]
+0xF774 U+7B91 # <cjk> [2000]
+0xF775 U+7B9B # <cjk> [2000]
+0xF776 U+420E # <cjk> [2000]
+0xF777 U+7BAF # <cjk> [2000]
+0xF778 U+7BB5 # <cjk> [2000]
+0xF779 U+7BBC # <cjk> [2000]
+0xF77A U+7BC5 # <cjk> [2000]
+0xF77B U+7BCA # <cjk> [2000]
+0xF77C U+25C4B # <cjk> [2000] [Unicode3.1]
+0xF77D U+25C64 # <cjk> [2000] [Unicode3.1]
+0xF77E U+7BD4 # <cjk> [2000]
+0xF780 U+7BD6 # <cjk> [2000]
+0xF781 U+7BDA # <cjk> [2000]
+0xF782 U+7BEA # <cjk> [2000]
+0xF783 U+7BF0 # <cjk> [2000]
+0xF784 U+7C03 # <cjk> [2000]
+0xF785 U+7C0B # <cjk> [2000]
+0xF786 U+7C0E # <cjk> [2000]
+0xF787 U+7C0F # <cjk> [2000]
+0xF788 U+7C26 # <cjk> [2000]
+0xF789 U+7C45 # <cjk> [2000]
+0xF78A U+7C4A # <cjk> [2000]
+0xF78B U+7C51 # <cjk> [2000]
+0xF78C U+7C57 # <cjk> [2000]
+0xF78D U+7C5E # <cjk> [2000]
+0xF78E U+7C61 # <cjk> [2000]
+0xF78F U+7C69 # <cjk> [2000]
+0xF790 U+7C6E # <cjk> [2000]
+0xF791 U+7C6F # <cjk> [2000]
+0xF792 U+7C70 # <cjk> [2000]
+0xF793 U+25E2E # <cjk> [2000] [Unicode3.1]
+0xF794 U+25E56 # <cjk> [2000] [Unicode3.1]
+0xF795 U+25E65 # <cjk> [2000] [Unicode3.1]
+0xF796 U+7CA6 # <cjk> [2000]
+0xF797 U+25E62 # <cjk> [2000] [Unicode3.1]
+0xF798 U+7CB6 # <cjk> [2000]
+0xF799 U+7CB7 # <cjk> [2000]
+0xF79A U+7CBF # <cjk> [2000]
+0xF79B U+25ED8 # <cjk> [2000] [Unicode3.1]
+0xF79C U+7CC4 # <cjk> [2000]
+0xF79D U+25EC2 # <cjk> [2000] [Unicode3.1]
+0xF79E U+7CC8 # <cjk> [2000]
+0xF79F U+7CCD # <cjk> [2000]
+0xF7A0 U+25EE8 # <cjk> [2000] [Unicode3.1]
+0xF7A1 U+7CD7 # <cjk> [2000]
+0xF7A2 U+25F23 # <cjk> [2000] [Unicode3.1]
+0xF7A3 U+7CE6 # <cjk> [2000]
+0xF7A4 U+7CEB # <cjk> [2000]
+0xF7A5 U+25F5C # <cjk> [2000] [Unicode3.1]
+0xF7A6 U+7CF5 # <cjk> [2000]
+0xF7A7 U+7D03 # <cjk> [2000]
+0xF7A8 U+7D09 # <cjk> [2000]
+0xF7A9 U+42C6 # <cjk> [2000]
+0xF7AA U+7D12 # <cjk> [2000]
+0xF7AB U+7D1E # <cjk> [2000]
+0xF7AC U+25FE0 # <cjk> [2000] [Unicode3.1]
+0xF7AD U+25FD4 # <cjk> [2000] [Unicode3.1]
+0xF7AE U+7D3D # <cjk> [2000]
+0xF7AF U+7D3E # <cjk> [2000]
+0xF7B0 U+7D40 # <cjk> [2000]
+0xF7B1 U+7D47 # <cjk> [2000]
+0xF7B2 U+2600C # <cjk> [2000] [Unicode3.1]
+0xF7B3 U+25FFB # <cjk> [2000] [Unicode3.1]
+0xF7B4 U+42D6 # <cjk> [2000]
+0xF7B5 U+7D59 # <cjk> [2000]
+0xF7B6 U+7D5A # <cjk> [2000]
+0xF7B7 U+7D6A # <cjk> [2000]
+0xF7B8 U+7D70 # <cjk> [2000]
+0xF7B9 U+42DD # <cjk> [2000]
+0xF7BA U+7D7F # <cjk> [2000]
+0xF7BB U+26017 # <cjk> [2000] [Unicode3.1]
+0xF7BC U+7D86 # <cjk> [2000]
+0xF7BD U+7D88 # <cjk> [2000]
+0xF7BE U+7D8C # <cjk> [2000]
+0xF7BF U+7D97 # <cjk> [2000]
+0xF7C0 U+26060 # <cjk> [2000] [Unicode3.1]
+0xF7C1 U+7D9D # <cjk> [2000]
+0xF7C2 U+7DA7 # <cjk> [2000]
+0xF7C3 U+7DAA # <cjk> [2000]
+0xF7C4 U+7DB6 # <cjk> [2000]
+0xF7C5 U+7DB7 # <cjk> [2000]
+0xF7C6 U+7DC0 # <cjk> [2000]
+0xF7C7 U+7DD7 # <cjk> [2000]
+0xF7C8 U+7DD9 # <cjk> [2000]
+0xF7C9 U+7DE6 # <cjk> [2000]
+0xF7CA U+7DF1 # <cjk> [2000]
+0xF7CB U+7DF9 # <cjk> [2000]
+0xF7CC U+4302 # <cjk> [2000]
+0xF7CD U+260ED # <cjk> [2000] [Unicode3.1]
+0xF7CE U+FA58 # CJK COMPATIBILITY IDEOGRAPH-FA58 [2000] [Unicode3.2]
+0xF7CF U+7E10 # <cjk> [2000]
+0xF7D0 U+7E17 # <cjk> [2000]
+0xF7D1 U+7E1D # <cjk> [2000]
+0xF7D2 U+7E20 # <cjk> [2000]
+0xF7D3 U+7E27 # <cjk> [2000]
+0xF7D4 U+7E2C # <cjk> [2000]
+0xF7D5 U+7E45 # <cjk> [2000]
+0xF7D6 U+7E73 # <cjk> [2000]
+0xF7D7 U+7E75 # <cjk> [2000]
+0xF7D8 U+7E7E # <cjk> [2000]
+0xF7D9 U+7E86 # <cjk> [2000]
+0xF7DA U+7E87 # <cjk> [2000]
+0xF7DB U+432B # <cjk> [2000]
+0xF7DC U+7E91 # <cjk> [2000]
+0xF7DD U+7E98 # <cjk> [2000]
+0xF7DE U+7E9A # <cjk> [2000]
+0xF7DF U+4343 # <cjk> [2000]
+0xF7E0 U+7F3C # <cjk> [2000]
+0xF7E1 U+7F3B # <cjk> [2000]
+0xF7E2 U+7F3E # <cjk> [2000]
+0xF7E3 U+7F43 # <cjk> [2000]
+0xF7E4 U+7F44 # <cjk> [2000]
+0xF7E5 U+7F4F # <cjk> [2000]
+0xF7E6 U+34C1 # <cjk> [2000]
+0xF7E7 U+26270 # <cjk> [2000] [Unicode3.1]
+0xF7E8 U+7F52 # <cjk> [2000]
+0xF7E9 U+26286 # <cjk> [2000] [Unicode3.1]
+0xF7EA U+7F61 # <cjk> [2000]
+0xF7EB U+7F63 # <cjk> [2000]
+0xF7EC U+7F64 # <cjk> [2000]
+0xF7ED U+7F6D # <cjk> [2000]
+0xF7EE U+7F7D # <cjk> [2000]
+0xF7EF U+7F7E # <cjk> [2000]
+0xF7F0 U+2634C # <cjk> [2000] [Unicode3.1]
+0xF7F1 U+7F90 # <cjk> [2000]
+0xF7F2 U+517B # <cjk> [2000]
+0xF7F3 U+23D0E # <cjk> [2000] [Unicode3.1]
+0xF7F4 U+7F96 # <cjk> [2000]
+0xF7F5 U+7F9C # <cjk> [2000]
+0xF7F6 U+7FAD # <cjk> [2000]
+0xF7F7 U+26402 # <cjk> [2000] [Unicode3.1]
+0xF7F8 U+7FC3 # <cjk> [2000]
+0xF7F9 U+7FCF # <cjk> [2000]
+0xF7FA U+7FE3 # <cjk> [2000]
+0xF7FB U+7FE5 # <cjk> [2000]
+0xF7FC U+7FEF # <cjk> [2000]
+0xF840 U+7FF2 # <cjk> [2000]
+0xF841 U+8002 # <cjk> [2000]
+0xF842 U+800A # <cjk> [2000]
+0xF843 U+8008 # <cjk> [2000]
+0xF844 U+800E # <cjk> [2000]
+0xF845 U+8011 # <cjk> [2000]
+0xF846 U+8016 # <cjk> [2000]
+0xF847 U+8024 # <cjk> [2000]
+0xF848 U+802C # <cjk> [2000]
+0xF849 U+8030 # <cjk> [2000]
+0xF84A U+8043 # <cjk> [2000]
+0xF84B U+8066 # <cjk> [2000]
+0xF84C U+8071 # <cjk> [2000]
+0xF84D U+8075 # <cjk> [2000]
+0xF84E U+807B # <cjk> [2000]
+0xF84F U+8099 # <cjk> [2000]
+0xF850 U+809C # <cjk> [2000]
+0xF851 U+80A4 # <cjk> [2000]
+0xF852 U+80A7 # <cjk> [2000]
+0xF853 U+80B8 # <cjk> [2000]
+0xF854 U+2667E # <cjk> [2000] [Unicode3.1]
+0xF855 U+80C5 # <cjk> [2000]
+0xF856 U+80D5 # <cjk> [2000]
+0xF857 U+80D8 # <cjk> [2000]
+0xF858 U+80E6 # <cjk> [2000]
+0xF859 U+266B0 # <cjk> [2000] [Unicode3.1]
+0xF85A U+810D # <cjk> [2000]
+0xF85B U+80F5 # <cjk> [2000]
+0xF85C U+80FB # <cjk> [2000]
+0xF85D U+43EE # <cjk> [2000]
+0xF85E U+8135 # <cjk> [2000]
+0xF85F U+8116 # <cjk> [2000]
+0xF860 U+811E # <cjk> [2000]
+0xF861 U+43F0 # <cjk> [2000]
+0xF862 U+8124 # <cjk> [2000]
+0xF863 U+8127 # <cjk> [2000]
+0xF864 U+812C # <cjk> [2000]
+0xF865 U+2671D # <cjk> [2000] [Unicode3.1]
+0xF866 U+813D # <cjk> [2000]
+0xF867 U+4408 # <cjk> [2000]
+0xF868 U+8169 # <cjk> [2000]
+0xF869 U+4417 # <cjk> [2000]
+0xF86A U+8181 # <cjk> [2000]
+0xF86B U+441C # <cjk> [2000]
+0xF86C U+8184 # <cjk> [2000]
+0xF86D U+8185 # <cjk> [2000]
+0xF86E U+4422 # <cjk> [2000]
+0xF86F U+8198 # <cjk> [2000]
+0xF870 U+81B2 # <cjk> [2000]
+0xF871 U+81C1 # <cjk> [2000]
+0xF872 U+81C3 # <cjk> [2000]
+0xF873 U+81D6 # <cjk> [2000]
+0xF874 U+81DB # <cjk> [2000]
+0xF875 U+268DD # <cjk> [2000] [Unicode3.1]
+0xF876 U+81E4 # <cjk> [2000]
+0xF877 U+268EA # <cjk> [2000] [Unicode3.1]
+0xF878 U+81EC # <cjk> [2000]
+0xF879 U+26951 # <cjk> [2000] [Unicode3.1]
+0xF87A U+81FD # <cjk> [2000]
+0xF87B U+81FF # <cjk> [2000]
+0xF87C U+2696F # <cjk> [2000] [Unicode3.1]
+0xF87D U+8204 # <cjk> [2000]
+0xF87E U+269DD # <cjk> [2000] [Unicode3.1]
+0xF880 U+8219 # <cjk> [2000]
+0xF881 U+8221 # <cjk> [2000]
+0xF882 U+8222 # <cjk> [2000]
+0xF883 U+26A1E # <cjk> [2000] [Unicode3.1]
+0xF884 U+8232 # <cjk> [2000]
+0xF885 U+8234 # <cjk> [2000]
+0xF886 U+823C # <cjk> [2000]
+0xF887 U+8246 # <cjk> [2000]
+0xF888 U+8249 # <cjk> [2000]
+0xF889 U+8245 # <cjk> [2000]
+0xF88A U+26A58 # <cjk> [2000] [Unicode3.1]
+0xF88B U+824B # <cjk> [2000]
+0xF88C U+4476 # <cjk> [2000]
+0xF88D U+824F # <cjk> [2000]
+0xF88E U+447A # <cjk> [2000]
+0xF88F U+8257 # <cjk> [2000]
+0xF890 U+26A8C # <cjk> [2000] [Unicode3.1]
+0xF891 U+825C # <cjk> [2000]
+0xF892 U+8263 # <cjk> [2000]
+0xF893 U+26AB7 # <cjk> [2000] [Unicode3.1]
+0xF894 U+FA5D # CJK COMPATIBILITY IDEOGRAPH-FA5D [2000] [Unicode3.2]
+0xF895 U+FA5E # CJK COMPATIBILITY IDEOGRAPH-FA5E [2000] [Unicode3.2]
+0xF896 U+8279 # <cjk> [2000]
+0xF897 U+4491 # <cjk> [2000]
+0xF898 U+827D # <cjk> [2000]
+0xF899 U+827F # <cjk> [2000]
+0xF89A U+8283 # <cjk> [2000]
+0xF89B U+828A # <cjk> [2000]
+0xF89C U+8293 # <cjk> [2000]
+0xF89D U+82A7 # <cjk> [2000]
+0xF89E U+82A8 # <cjk> [2000]
+0xF89F U+82B2 # <cjk> [2000]
+0xF8A0 U+82B4 # <cjk> [2000]
+0xF8A1 U+82BA # <cjk> [2000]
+0xF8A2 U+82BC # <cjk> [2000]
+0xF8A3 U+82E2 # <cjk> [2000]
+0xF8A4 U+82E8 # <cjk> [2000]
+0xF8A5 U+82F7 # <cjk> [2000]
+0xF8A6 U+8307 # <cjk> [2000]
+0xF8A7 U+8308 # <cjk> [2000]
+0xF8A8 U+830C # <cjk> [2000]
+0xF8A9 U+8354 # <cjk> [2000]
+0xF8AA U+831B # <cjk> [2000]
+0xF8AB U+831D # <cjk> [2000]
+0xF8AC U+8330 # <cjk> [2000]
+0xF8AD U+833C # <cjk> [2000]
+0xF8AE U+8344 # <cjk> [2000]
+0xF8AF U+8357 # <cjk> [2000]
+0xF8B0 U+44BE # <cjk> [2000]
+0xF8B1 U+837F # <cjk> [2000]
+0xF8B2 U+44D4 # <cjk> [2000]
+0xF8B3 U+44B3 # <cjk> [2000]
+0xF8B4 U+838D # <cjk> [2000]
+0xF8B5 U+8394 # <cjk> [2000]
+0xF8B6 U+8395 # <cjk> [2000]
+0xF8B7 U+839B # <cjk> [2000]
+0xF8B8 U+839D # <cjk> [2000]
+0xF8B9 U+83C9 # <cjk> [2000]
+0xF8BA U+83D0 # <cjk> [2000]
+0xF8BB U+83D4 # <cjk> [2000]
+0xF8BC U+83DD # <cjk> [2000]
+0xF8BD U+83E5 # <cjk> [2000]
+0xF8BE U+83F9 # <cjk> [2000]
+0xF8BF U+840F # <cjk> [2000]
+0xF8C0 U+8411 # <cjk> [2000]
+0xF8C1 U+8415 # <cjk> [2000]
+0xF8C2 U+26C73 # <cjk> [2000] [Unicode3.1]
+0xF8C3 U+8417 # <cjk> [2000]
+0xF8C4 U+8439 # <cjk> [2000]
+0xF8C5 U+844A # <cjk> [2000]
+0xF8C6 U+844F # <cjk> [2000]
+0xF8C7 U+8451 # <cjk> [2000]
+0xF8C8 U+8452 # <cjk> [2000]
+0xF8C9 U+8459 # <cjk> [2000]
+0xF8CA U+845A # <cjk> [2000]
+0xF8CB U+845C # <cjk> [2000]
+0xF8CC U+26CDD # <cjk> [2000] [Unicode3.1]
+0xF8CD U+8465 # <cjk> [2000]
+0xF8CE U+8476 # <cjk> [2000]
+0xF8CF U+8478 # <cjk> [2000]
+0xF8D0 U+847C # <cjk> [2000]
+0xF8D1 U+8481 # <cjk> [2000]
+0xF8D2 U+450D # <cjk> [2000]
+0xF8D3 U+84DC # <cjk> [2000]
+0xF8D4 U+8497 # <cjk> [2000]
+0xF8D5 U+84A6 # <cjk> [2000]
+0xF8D6 U+84BE # <cjk> [2000]
+0xF8D7 U+4508 # <cjk> [2000]
+0xF8D8 U+84CE # <cjk> [2000]
+0xF8D9 U+84CF # <cjk> [2000]
+0xF8DA U+84D3 # <cjk> [2000]
+0xF8DB U+26E65 # <cjk> [2000] [Unicode3.1]
+0xF8DC U+84E7 # <cjk> [2000]
+0xF8DD U+84EA # <cjk> [2000]
+0xF8DE U+84EF # <cjk> [2000]
+0xF8DF U+84F0 # <cjk> [2000]
+0xF8E0 U+84F1 # <cjk> [2000]
+0xF8E1 U+84FA # <cjk> [2000]
+0xF8E2 U+84FD # <cjk> [2000]
+0xF8E3 U+850C # <cjk> [2000]
+0xF8E4 U+851B # <cjk> [2000]
+0xF8E5 U+8524 # <cjk> [2000]
+0xF8E6 U+8525 # <cjk> [2000]
+0xF8E7 U+852B # <cjk> [2000]
+0xF8E8 U+8534 # <cjk> [2000]
+0xF8E9 U+854F # <cjk> [2000]
+0xF8EA U+856F # <cjk> [2000]
+0xF8EB U+4525 # <cjk> [2000]
+0xF8EC U+4543 # <cjk> [2000]
+0xF8ED U+853E # <cjk> [2000]
+0xF8EE U+8551 # <cjk> [2000]
+0xF8EF U+8553 # <cjk> [2000]
+0xF8F0 U+855E # <cjk> [2000]
+0xF8F1 U+8561 # <cjk> [2000]
+0xF8F2 U+8562 # <cjk> [2000]
+0xF8F3 U+26F94 # <cjk> [2000] [Unicode3.1]
+0xF8F4 U+857B # <cjk> [2000]
+0xF8F5 U+857D # <cjk> [2000]
+0xF8F6 U+857F # <cjk> [2000]
+0xF8F7 U+8581 # <cjk> [2000]
+0xF8F8 U+8586 # <cjk> [2000]
+0xF8F9 U+8593 # <cjk> [2000]
+0xF8FA U+859D # <cjk> [2000]
+0xF8FB U+859F # <cjk> [2000]
+0xF8FC U+26FF8 # <cjk> [2000] [Unicode3.1]
+0xF940 U+26FF6 # <cjk> [2000] [Unicode3.1]
+0xF941 U+26FF7 # <cjk> [2000] [Unicode3.1]
+0xF942 U+85B7 # <cjk> [2000]
+0xF943 U+85BC # <cjk> [2000]
+0xF944 U+85C7 # <cjk> [2000]
+0xF945 U+85CA # <cjk> [2000]
+0xF946 U+85D8 # <cjk> [2000]
+0xF947 U+85D9 # <cjk> [2000]
+0xF948 U+85DF # <cjk> [2000]
+0xF949 U+85E1 # <cjk> [2000]
+0xF94A U+85E6 # <cjk> [2000]
+0xF94B U+85F6 # <cjk> [2000]
+0xF94C U+8600 # <cjk> [2000]
+0xF94D U+8611 # <cjk> [2000]
+0xF94E U+861E # <cjk> [2000]
+0xF94F U+8621 # <cjk> [2000]
+0xF950 U+8624 # <cjk> [2000]
+0xF951 U+8627 # <cjk> [2000]
+0xF952 U+2710D # <cjk> [2000] [Unicode3.1]
+0xF953 U+8639 # <cjk> [2000]
+0xF954 U+863C # <cjk> [2000]
+0xF955 U+27139 # <cjk> [2000] [Unicode3.1]
+0xF956 U+8640 # <cjk> [2000]
+0xF957 U+FA20 # CJK COMPATIBILITY IDEOGRAPH-FA20 [2000]
+0xF958 U+8653 # <cjk> [2000]
+0xF959 U+8656 # <cjk> [2000]
+0xF95A U+866F # <cjk> [2000]
+0xF95B U+8677 # <cjk> [2000]
+0xF95C U+867A # <cjk> [2000]
+0xF95D U+8687 # <cjk> [2000]
+0xF95E U+8689 # <cjk> [2000]
+0xF95F U+868D # <cjk> [2000]
+0xF960 U+8691 # <cjk> [2000]
+0xF961 U+869C # <cjk> [2000]
+0xF962 U+869D # <cjk> [2000]
+0xF963 U+86A8 # <cjk> [2000]
+0xF964 U+FA21 # CJK COMPATIBILITY IDEOGRAPH-FA21 [2000]
+0xF965 U+86B1 # <cjk> [2000]
+0xF966 U+86B3 # <cjk> [2000]
+0xF967 U+86C1 # <cjk> [2000]
+0xF968 U+86C3 # <cjk> [2000]
+0xF969 U+86D1 # <cjk> [2000]
+0xF96A U+86D5 # <cjk> [2000]
+0xF96B U+86D7 # <cjk> [2000]
+0xF96C U+86E3 # <cjk> [2000]
+0xF96D U+86E6 # <cjk> [2000]
+0xF96E U+45B8 # <cjk> [2000]
+0xF96F U+8705 # <cjk> [2000]
+0xF970 U+8707 # <cjk> [2000]
+0xF971 U+870E # <cjk> [2000]
+0xF972 U+8710 # <cjk> [2000]
+0xF973 U+8713 # <cjk> [2000]
+0xF974 U+8719 # <cjk> [2000]
+0xF975 U+871F # <cjk> [2000]
+0xF976 U+8721 # <cjk> [2000]
+0xF977 U+8723 # <cjk> [2000]
+0xF978 U+8731 # <cjk> [2000]
+0xF979 U+873A # <cjk> [2000]
+0xF97A U+873E # <cjk> [2000]
+0xF97B U+8740 # <cjk> [2000]
+0xF97C U+8743 # <cjk> [2000]
+0xF97D U+8751 # <cjk> [2000]
+0xF97E U+8758 # <cjk> [2000]
+0xF980 U+8764 # <cjk> [2000]
+0xF981 U+8765 # <cjk> [2000]
+0xF982 U+8772 # <cjk> [2000]
+0xF983 U+877C # <cjk> [2000]
+0xF984 U+273DB # <cjk> [2000] [Unicode3.1]
+0xF985 U+273DA # <cjk> [2000] [Unicode3.1]
+0xF986 U+87A7 # <cjk> [2000]
+0xF987 U+8789 # <cjk> [2000]
+0xF988 U+878B # <cjk> [2000]
+0xF989 U+8793 # <cjk> [2000]
+0xF98A U+87A0 # <cjk> [2000]
+0xF98B U+273FE # <cjk> [2000] [Unicode3.1]
+0xF98C U+45E5 # <cjk> [2000]
+0xF98D U+87BE # <cjk> [2000]
+0xF98E U+27410 # <cjk> [2000] [Unicode3.1]
+0xF98F U+87C1 # <cjk> [2000]
+0xF990 U+87CE # <cjk> [2000]
+0xF991 U+87F5 # <cjk> [2000]
+0xF992 U+87DF # <cjk> [2000]
+0xF993 U+27449 # <cjk> [2000] [Unicode3.1]
+0xF994 U+87E3 # <cjk> [2000]
+0xF995 U+87E5 # <cjk> [2000]
+0xF996 U+87E6 # <cjk> [2000]
+0xF997 U+87EA # <cjk> [2000]
+0xF998 U+87EB # <cjk> [2000]
+0xF999 U+87ED # <cjk> [2000]
+0xF99A U+8801 # <cjk> [2000]
+0xF99B U+8803 # <cjk> [2000]
+0xF99C U+880B # <cjk> [2000]
+0xF99D U+8813 # <cjk> [2000]
+0xF99E U+8828 # <cjk> [2000]
+0xF99F U+882E # <cjk> [2000]
+0xF9A0 U+8832 # <cjk> [2000]
+0xF9A1 U+883C # <cjk> [2000]
+0xF9A2 U+460F # <cjk> [2000]
+0xF9A3 U+884A # <cjk> [2000]
+0xF9A4 U+8858 # <cjk> [2000]
+0xF9A5 U+885F # <cjk> [2000]
+0xF9A6 U+8864 # <cjk> [2000]
+0xF9A7 U+27615 # <cjk> [2000] [Unicode3.1]
+0xF9A8 U+27614 # <cjk> [2000] [Unicode3.1]
+0xF9A9 U+8869 # <cjk> [2000]
+0xF9AA U+27631 # <cjk> [2000] [Unicode3.1]
+0xF9AB U+886F # <cjk> [2000]
+0xF9AC U+88A0 # <cjk> [2000]
+0xF9AD U+88BC # <cjk> [2000]
+0xF9AE U+88BD # <cjk> [2000]
+0xF9AF U+88BE # <cjk> [2000]
+0xF9B0 U+88C0 # <cjk> [2000]
+0xF9B1 U+88D2 # <cjk> [2000]
+0xF9B2 U+27693 # <cjk> [2000] [Unicode3.1]
+0xF9B3 U+88D1 # <cjk> [2000]
+0xF9B4 U+88D3 # <cjk> [2000]
+0xF9B5 U+88DB # <cjk> [2000]
+0xF9B6 U+88F0 # <cjk> [2000]
+0xF9B7 U+88F1 # <cjk> [2000]
+0xF9B8 U+4641 # <cjk> [2000]
+0xF9B9 U+8901 # <cjk> [2000]
+0xF9BA U+2770E # <cjk> [2000] [Unicode3.1]
+0xF9BB U+8937 # <cjk> [2000]
+0xF9BC U+27723 # <cjk> [2000] [Unicode3.1]
+0xF9BD U+8942 # <cjk> [2000]
+0xF9BE U+8945 # <cjk> [2000]
+0xF9BF U+8949 # <cjk> [2000]
+0xF9C0 U+27752 # <cjk> [2000] [Unicode3.1]
+0xF9C1 U+4665 # <cjk> [2000]
+0xF9C2 U+8962 # <cjk> [2000]
+0xF9C3 U+8980 # <cjk> [2000]
+0xF9C4 U+8989 # <cjk> [2000]
+0xF9C5 U+8990 # <cjk> [2000]
+0xF9C6 U+899F # <cjk> [2000]
+0xF9C7 U+89B0 # <cjk> [2000]
+0xF9C8 U+89B7 # <cjk> [2000]
+0xF9C9 U+89D6 # <cjk> [2000]
+0xF9CA U+89D8 # <cjk> [2000]
+0xF9CB U+89EB # <cjk> [2000]
+0xF9CC U+46A1 # <cjk> [2000]
+0xF9CD U+89F1 # <cjk> [2000]
+0xF9CE U+89F3 # <cjk> [2000]
+0xF9CF U+89FD # <cjk> [2000]
+0xF9D0 U+89FF # <cjk> [2000]
+0xF9D1 U+46AF # <cjk> [2000]
+0xF9D2 U+8A11 # <cjk> [2000]
+0xF9D3 U+8A14 # <cjk> [2000]
+0xF9D4 U+27985 # <cjk> [2000] [Unicode3.1]
+0xF9D5 U+8A21 # <cjk> [2000]
+0xF9D6 U+8A35 # <cjk> [2000]
+0xF9D7 U+8A3E # <cjk> [2000]
+0xF9D8 U+8A45 # <cjk> [2000]
+0xF9D9 U+8A4D # <cjk> [2000]
+0xF9DA U+8A58 # <cjk> [2000]
+0xF9DB U+8AAE # <cjk> [2000]
+0xF9DC U+8A90 # <cjk> [2000]
+0xF9DD U+8AB7 # <cjk> [2000]
+0xF9DE U+8ABE # <cjk> [2000]
+0xF9DF U+8AD7 # <cjk> [2000]
+0xF9E0 U+8AFC # <cjk> [2000]
+0xF9E1 U+27A84 # <cjk> [2000] [Unicode3.1]
+0xF9E2 U+8B0A # <cjk> [2000]
+0xF9E3 U+8B05 # <cjk> [2000]
+0xF9E4 U+8B0D # <cjk> [2000]
+0xF9E5 U+8B1C # <cjk> [2000]
+0xF9E6 U+8B1F # <cjk> [2000]
+0xF9E7 U+8B2D # <cjk> [2000]
+0xF9E8 U+8B43 # <cjk> [2000]
+0xF9E9 U+470C # <cjk> [2000]
+0xF9EA U+8B51 # <cjk> [2000]
+0xF9EB U+8B5E # <cjk> [2000]
+0xF9EC U+8B76 # <cjk> [2000]
+0xF9ED U+8B7F # <cjk> [2000]
+0xF9EE U+8B81 # <cjk> [2000]
+0xF9EF U+8B8B # <cjk> [2000]
+0xF9F0 U+8B94 # <cjk> [2000]
+0xF9F1 U+8B95 # <cjk> [2000]
+0xF9F2 U+8B9C # <cjk> [2000]
+0xF9F3 U+8B9E # <cjk> [2000]
+0xF9F4 U+8C39 # <cjk> [2000]
+0xF9F5 U+27BB3 # <cjk> [2000] [Unicode3.1]
+0xF9F6 U+8C3D # <cjk> [2000]
+0xF9F7 U+27BBE # <cjk> [2000] [Unicode3.1]
+0xF9F8 U+27BC7 # <cjk> [2000] [Unicode3.1]
+0xF9F9 U+8C45 # <cjk> [2000]
+0xF9FA U+8C47 # <cjk> [2000]
+0xF9FB U+8C4F # <cjk> [2000]
+0xF9FC U+8C54 # <cjk> [2000]
+0xFA40 U+8C57 # <cjk> [2000]
+0xFA41 U+8C69 # <cjk> [2000]
+0xFA42 U+8C6D # <cjk> [2000]
+0xFA43 U+8C73 # <cjk> [2000]
+0xFA44 U+27CB8 # <cjk> [2000] [Unicode3.1]
+0xFA45 U+8C93 # <cjk> [2000]
+0xFA46 U+8C92 # <cjk> [2000]
+0xFA47 U+8C99 # <cjk> [2000]
+0xFA48 U+4764 # <cjk> [2000]
+0xFA49 U+8C9B # <cjk> [2000]
+0xFA4A U+8CA4 # <cjk> [2000]
+0xFA4B U+8CD6 # <cjk> [2000]
+0xFA4C U+8CD5 # <cjk> [2000]
+0xFA4D U+8CD9 # <cjk> [2000]
+0xFA4E U+27DA0 # <cjk> [2000] [Unicode3.1]
+0xFA4F U+8CF0 # <cjk> [2000]
+0xFA50 U+8CF1 # <cjk> [2000]
+0xFA51 U+27E10 # <cjk> [2000] [Unicode3.1]
+0xFA52 U+8D09 # <cjk> [2000]
+0xFA53 U+8D0E # <cjk> [2000]
+0xFA54 U+8D6C # <cjk> [2000]
+0xFA55 U+8D84 # <cjk> [2000]
+0xFA56 U+8D95 # <cjk> [2000]
+0xFA57 U+8DA6 # <cjk> [2000]
+0xFA58 U+27FB7 # <cjk> [2000] [Unicode3.1]
+0xFA59 U+8DC6 # <cjk> [2000]
+0xFA5A U+8DC8 # <cjk> [2000]
+0xFA5B U+8DD9 # <cjk> [2000]
+0xFA5C U+8DEC # <cjk> [2000]
+0xFA5D U+8E0C # <cjk> [2000]
+0xFA5E U+47FD # <cjk> [2000]
+0xFA5F U+8DFD # <cjk> [2000]
+0xFA60 U+8E06 # <cjk> [2000]
+0xFA61 U+2808A # <cjk> [2000] [Unicode3.1]
+0xFA62 U+8E14 # <cjk> [2000]
+0xFA63 U+8E16 # <cjk> [2000]
+0xFA64 U+8E21 # <cjk> [2000]
+0xFA65 U+8E22 # <cjk> [2000]
+0xFA66 U+8E27 # <cjk> [2000]
+0xFA67 U+280BB # <cjk> [2000] [Unicode3.1]
+0xFA68 U+4816 # <cjk> [2000]
+0xFA69 U+8E36 # <cjk> [2000]
+0xFA6A U+8E39 # <cjk> [2000]
+0xFA6B U+8E4B # <cjk> [2000]
+0xFA6C U+8E54 # <cjk> [2000]
+0xFA6D U+8E62 # <cjk> [2000]
+0xFA6E U+8E6C # <cjk> [2000]
+0xFA6F U+8E6D # <cjk> [2000]
+0xFA70 U+8E6F # <cjk> [2000]
+0xFA71 U+8E98 # <cjk> [2000]
+0xFA72 U+8E9E # <cjk> [2000]
+0xFA73 U+8EAE # <cjk> [2000]
+0xFA74 U+8EB3 # <cjk> [2000]
+0xFA75 U+8EB5 # <cjk> [2000]
+0xFA76 U+8EB6 # <cjk> [2000]
+0xFA77 U+8EBB # <cjk> [2000]
+0xFA78 U+28282 # <cjk> [2000] [Unicode3.1]
+0xFA79 U+8ED1 # <cjk> [2000]
+0xFA7A U+8ED4 # <cjk> [2000]
+0xFA7B U+484E # <cjk> [2000]
+0xFA7C U+8EF9 # <cjk> [2000]
+0xFA7D U+282F3 # <cjk> [2000] [Unicode3.1]
+0xFA7E U+8F00 # <cjk> [2000]
+0xFA80 U+8F08 # <cjk> [2000]
+0xFA81 U+8F17 # <cjk> [2000]
+0xFA82 U+8F2B # <cjk> [2000]
+0xFA83 U+8F40 # <cjk> [2000]
+0xFA84 U+8F4A # <cjk> [2000]
+0xFA85 U+8F58 # <cjk> [2000]
+0xFA86 U+2840C # <cjk> [2000] [Unicode3.1]
+0xFA87 U+8FA4 # <cjk> [2000]
+0xFA88 U+8FB4 # <cjk> [2000]
+0xFA89 U+FA66 # CJK COMPATIBILITY IDEOGRAPH-FA66 [2000] [Unicode3.2]
+0xFA8A U+8FB6 # <cjk> [2000]
+0xFA8B U+28455 # <cjk> [2000] [Unicode3.1]
+0xFA8C U+8FC1 # <cjk> [2000]
+0xFA8D U+8FC6 # <cjk> [2000]
+0xFA8E U+FA24 # CJK COMPATIBILITY IDEOGRAPH-FA24 [2000]
+0xFA8F U+8FCA # <cjk> [2000]
+0xFA90 U+8FCD # <cjk> [2000]
+0xFA91 U+8FD3 # <cjk> [2000]
+0xFA92 U+8FD5 # <cjk> [2000]
+0xFA93 U+8FE0 # <cjk> [2000]
+0xFA94 U+8FF1 # <cjk> [2000]
+0xFA95 U+8FF5 # <cjk> [2000]
+0xFA96 U+8FFB # <cjk> [2000]
+0xFA97 U+9002 # <cjk> [2000]
+0xFA98 U+900C # <cjk> [2000]
+0xFA99 U+9037 # <cjk> [2000]
+0xFA9A U+2856B # <cjk> [2000] [Unicode3.1]
+0xFA9B U+9043 # <cjk> [2000]
+0xFA9C U+9044 # <cjk> [2000]
+0xFA9D U+905D # <cjk> [2000]
+0xFA9E U+285C8 # <cjk> [2000] [Unicode3.1]
+0xFA9F U+285C9 # <cjk> [2000] [Unicode3.1]
+0xFAA0 U+9085 # <cjk> [2000]
+0xFAA1 U+908C # <cjk> [2000]
+0xFAA2 U+9090 # <cjk> [2000]
+0xFAA3 U+961D # <cjk> [2000]
+0xFAA4 U+90A1 # <cjk> [2000]
+0xFAA5 U+48B5 # <cjk> [2000]
+0xFAA6 U+90B0 # <cjk> [2000]
+0xFAA7 U+90B6 # <cjk> [2000]
+0xFAA8 U+90C3 # <cjk> [2000]
+0xFAA9 U+90C8 # <cjk> [2000]
+0xFAAA U+286D7 # <cjk> [2000] [Unicode3.1]
+0xFAAB U+90DC # <cjk> [2000]
+0xFAAC U+90DF # <cjk> [2000]
+0xFAAD U+286FA # <cjk> [2000] [Unicode3.1]
+0xFAAE U+90F6 # <cjk> [2000]
+0xFAAF U+90F2 # <cjk> [2000]
+0xFAB0 U+9100 # <cjk> [2000]
+0xFAB1 U+90EB # <cjk> [2000]
+0xFAB2 U+90FE # <cjk> [2000]
+0xFAB3 U+90FF # <cjk> [2000]
+0xFAB4 U+9104 # <cjk> [2000]
+0xFAB5 U+9106 # <cjk> [2000]
+0xFAB6 U+9118 # <cjk> [2000]
+0xFAB7 U+911C # <cjk> [2000]
+0xFAB8 U+911E # <cjk> [2000]
+0xFAB9 U+9137 # <cjk> [2000]
+0xFABA U+9139 # <cjk> [2000]
+0xFABB U+913A # <cjk> [2000]
+0xFABC U+9146 # <cjk> [2000]
+0xFABD U+9147 # <cjk> [2000]
+0xFABE U+9157 # <cjk> [2000]
+0xFABF U+9159 # <cjk> [2000]
+0xFAC0 U+9161 # <cjk> [2000]
+0xFAC1 U+9164 # <cjk> [2000]
+0xFAC2 U+9174 # <cjk> [2000]
+0xFAC3 U+9179 # <cjk> [2000]
+0xFAC4 U+9185 # <cjk> [2000]
+0xFAC5 U+918E # <cjk> [2000]
+0xFAC6 U+91A8 # <cjk> [2000]
+0xFAC7 U+91AE # <cjk> [2000]
+0xFAC8 U+91B3 # <cjk> [2000]
+0xFAC9 U+91B6 # <cjk> [2000]
+0xFACA U+91C3 # <cjk> [2000]
+0xFACB U+91C4 # <cjk> [2000]
+0xFACC U+91DA # <cjk> [2000]
+0xFACD U+28949 # <cjk> [2000] [Unicode3.1]
+0xFACE U+28946 # <cjk> [2000] [Unicode3.1]
+0xFACF U+91EC # <cjk> [2000]
+0xFAD0 U+91EE # <cjk> [2000]
+0xFAD1 U+9201 # <cjk> [2000]
+0xFAD2 U+920A # <cjk> [2000]
+0xFAD3 U+9216 # <cjk> [2000]
+0xFAD4 U+9217 # <cjk> [2000]
+0xFAD5 U+2896B # <cjk> [2000] [Unicode3.1]
+0xFAD6 U+9233 # <cjk> [2000]
+0xFAD7 U+9242 # <cjk> [2000]
+0xFAD8 U+9247 # <cjk> [2000]
+0xFAD9 U+924A # <cjk> [2000]
+0xFADA U+924E # <cjk> [2000]
+0xFADB U+9251 # <cjk> [2000]
+0xFADC U+9256 # <cjk> [2000]
+0xFADD U+9259 # <cjk> [2000]
+0xFADE U+9260 # <cjk> [2000]
+0xFADF U+9261 # <cjk> [2000]
+0xFAE0 U+9265 # <cjk> [2000]
+0xFAE1 U+9267 # <cjk> [2000]
+0xFAE2 U+9268 # <cjk> [2000]
+0xFAE3 U+28987 # <cjk> [2000] [Unicode3.1]
+0xFAE4 U+28988 # <cjk> [2000] [Unicode3.1]
+0xFAE5 U+927C # <cjk> [2000]
+0xFAE6 U+927D # <cjk> [2000]
+0xFAE7 U+927F # <cjk> [2000]
+0xFAE8 U+9289 # <cjk> [2000]
+0xFAE9 U+928D # <cjk> [2000]
+0xFAEA U+9297 # <cjk> [2000]
+0xFAEB U+9299 # <cjk> [2000]
+0xFAEC U+929F # <cjk> [2000]
+0xFAED U+92A7 # <cjk> [2000]
+0xFAEE U+92AB # <cjk> [2000]
+0xFAEF U+289BA # <cjk> [2000] [Unicode3.1]
+0xFAF0 U+289BB # <cjk> [2000] [Unicode3.1]
+0xFAF1 U+92B2 # <cjk> [2000]
+0xFAF2 U+92BF # <cjk> [2000]
+0xFAF3 U+92C0 # <cjk> [2000]
+0xFAF4 U+92C6 # <cjk> [2000]
+0xFAF5 U+92CE # <cjk> [2000]
+0xFAF6 U+92D0 # <cjk> [2000]
+0xFAF7 U+92D7 # <cjk> [2000]
+0xFAF8 U+92D9 # <cjk> [2000]
+0xFAF9 U+92E5 # <cjk> [2000]
+0xFAFA U+92E7 # <cjk> [2000]
+0xFAFB U+9311 # <cjk> [2000]
+0xFAFC U+28A1E # <cjk> [2000] [Unicode3.1]
+0xFB40 U+28A29 # <cjk> [2000] [Unicode3.1]
+0xFB41 U+92F7 # <cjk> [2000]
+0xFB42 U+92F9 # <cjk> [2000]
+0xFB43 U+92FB # <cjk> [2000]
+0xFB44 U+9302 # <cjk> [2000]
+0xFB45 U+930D # <cjk> [2000]
+0xFB46 U+9315 # <cjk> [2000]
+0xFB47 U+931D # <cjk> [2000]
+0xFB48 U+931E # <cjk> [2000]
+0xFB49 U+9327 # <cjk> [2000]
+0xFB4A U+9329 # <cjk> [2000]
+0xFB4B U+28A71 # <cjk> [2000] [Unicode3.1]
+0xFB4C U+28A43 # <cjk> [2000] [Unicode3.1]
+0xFB4D U+9347 # <cjk> [2000]
+0xFB4E U+9351 # <cjk> [2000]
+0xFB4F U+9357 # <cjk> [2000]
+0xFB50 U+935A # <cjk> [2000]
+0xFB51 U+936B # <cjk> [2000]
+0xFB52 U+9371 # <cjk> [2000]
+0xFB53 U+9373 # <cjk> [2000]
+0xFB54 U+93A1 # <cjk> [2000]
+0xFB55 U+28A99 # <cjk> [2000] [Unicode3.1]
+0xFB56 U+28ACD # <cjk> [2000] [Unicode3.1]
+0xFB57 U+9388 # <cjk> [2000]
+0xFB58 U+938B # <cjk> [2000]
+0xFB59 U+938F # <cjk> [2000]
+0xFB5A U+939E # <cjk> [2000]
+0xFB5B U+93F5 # <cjk> [2000]
+0xFB5C U+28AE4 # <cjk> [2000] [Unicode3.1]
+0xFB5D U+28ADD # <cjk> [2000] [Unicode3.1]
+0xFB5E U+93F1 # <cjk> [2000]
+0xFB5F U+93C1 # <cjk> [2000]
+0xFB60 U+93C7 # <cjk> [2000]
+0xFB61 U+93DC # <cjk> [2000]
+0xFB62 U+93E2 # <cjk> [2000]
+0xFB63 U+93E7 # <cjk> [2000]
+0xFB64 U+9409 # <cjk> [2000]
+0xFB65 U+940F # <cjk> [2000]
+0xFB66 U+9416 # <cjk> [2000]
+0xFB67 U+9417 # <cjk> [2000]
+0xFB68 U+93FB # <cjk> [2000]
+0xFB69 U+9432 # <cjk> [2000]
+0xFB6A U+9434 # <cjk> [2000]
+0xFB6B U+943B # <cjk> [2000]
+0xFB6C U+9445 # <cjk> [2000]
+0xFB6D U+28BC1 # <cjk> [2000] [Unicode3.1]
+0xFB6E U+28BEF # <cjk> [2000] [Unicode3.1]
+0xFB6F U+946D # <cjk> [2000]
+0xFB70 U+946F # <cjk> [2000]
+0xFB71 U+9578 # <cjk> [2000]
+0xFB72 U+9579 # <cjk> [2000]
+0xFB73 U+9586 # <cjk> [2000]
+0xFB74 U+958C # <cjk> [2000]
+0xFB75 U+958D # <cjk> [2000]
+0xFB76 U+28D10 # <cjk> [2000] [Unicode3.1]
+0xFB77 U+95AB # <cjk> [2000]
+0xFB78 U+95B4 # <cjk> [2000]
+0xFB79 U+28D71 # <cjk> [2000] [Unicode3.1]
+0xFB7A U+95C8 # <cjk> [2000]
+0xFB7B U+28DFB # <cjk> [2000] [Unicode3.1]
+0xFB7C U+28E1F # <cjk> [2000] [Unicode3.1]
+0xFB7D U+962C # <cjk> [2000]
+0xFB7E U+9633 # <cjk> [2000]
+0xFB80 U+9634 # <cjk> [2000]
+0xFB81 U+28E36 # <cjk> [2000] [Unicode3.1]
+0xFB82 U+963C # <cjk> [2000]
+0xFB83 U+9641 # <cjk> [2000]
+0xFB84 U+9661 # <cjk> [2000]
+0xFB85 U+28E89 # <cjk> [2000] [Unicode3.1]
+0xFB86 U+9682 # <cjk> [2000]
+0xFB87 U+28EEB # <cjk> [2000] [Unicode3.1]
+0xFB88 U+969A # <cjk> [2000]
+0xFB89 U+28F32 # <cjk> [2000] [Unicode3.1]
+0xFB8A U+49E7 # <cjk> [2000]
+0xFB8B U+96A9 # <cjk> [2000]
+0xFB8C U+96AF # <cjk> [2000]
+0xFB8D U+96B3 # <cjk> [2000]
+0xFB8E U+96BA # <cjk> [2000]
+0xFB8F U+96BD # <cjk> [2000]
+0xFB90 U+49FA # <cjk> [2000]
+0xFB91 U+28FF8 # <cjk> [2000] [Unicode3.1]
+0xFB92 U+96D8 # <cjk> [2000]
+0xFB93 U+96DA # <cjk> [2000]
+0xFB94 U+96DD # <cjk> [2000]
+0xFB95 U+4A04 # <cjk> [2000]
+0xFB96 U+9714 # <cjk> [2000]
+0xFB97 U+9723 # <cjk> [2000]
+0xFB98 U+4A29 # <cjk> [2000]
+0xFB99 U+9736 # <cjk> [2000]
+0xFB9A U+9741 # <cjk> [2000]
+0xFB9B U+9747 # <cjk> [2000]
+0xFB9C U+9755 # <cjk> [2000]
+0xFB9D U+9757 # <cjk> [2000]
+0xFB9E U+975B # <cjk> [2000]
+0xFB9F U+976A # <cjk> [2000]
+0xFBA0 U+292A0 # <cjk> [2000] [Unicode3.1]
+0xFBA1 U+292B1 # <cjk> [2000] [Unicode3.1]
+0xFBA2 U+9796 # <cjk> [2000]
+0xFBA3 U+979A # <cjk> [2000]
+0xFBA4 U+979E # <cjk> [2000]
+0xFBA5 U+97A2 # <cjk> [2000]
+0xFBA6 U+97B1 # <cjk> [2000]
+0xFBA7 U+97B2 # <cjk> [2000]
+0xFBA8 U+97BE # <cjk> [2000]
+0xFBA9 U+97CC # <cjk> [2000]
+0xFBAA U+97D1 # <cjk> [2000]
+0xFBAB U+97D4 # <cjk> [2000]
+0xFBAC U+97D8 # <cjk> [2000]
+0xFBAD U+97D9 # <cjk> [2000]
+0xFBAE U+97E1 # <cjk> [2000]
+0xFBAF U+97F1 # <cjk> [2000]
+0xFBB0 U+9804 # <cjk> [2000]
+0xFBB1 U+980D # <cjk> [2000]
+0xFBB2 U+980E # <cjk> [2000]
+0xFBB3 U+9814 # <cjk> [2000]
+0xFBB4 U+9816 # <cjk> [2000]
+0xFBB5 U+4ABC # <cjk> [2000]
+0xFBB6 U+29490 # <cjk> [2000] [Unicode3.1]
+0xFBB7 U+9823 # <cjk> [2000]
+0xFBB8 U+9832 # <cjk> [2000]
+0xFBB9 U+9833 # <cjk> [2000]
+0xFBBA U+9825 # <cjk> [2000]
+0xFBBB U+9847 # <cjk> [2000]
+0xFBBC U+9866 # <cjk> [2000]
+0xFBBD U+98AB # <cjk> [2000]
+0xFBBE U+98AD # <cjk> [2000]
+0xFBBF U+98B0 # <cjk> [2000]
+0xFBC0 U+295CF # <cjk> [2000] [Unicode3.1]
+0xFBC1 U+98B7 # <cjk> [2000]
+0xFBC2 U+98B8 # <cjk> [2000]
+0xFBC3 U+98BB # <cjk> [2000]
+0xFBC4 U+98BC # <cjk> [2000]
+0xFBC5 U+98BF # <cjk> [2000]
+0xFBC6 U+98C2 # <cjk> [2000]
+0xFBC7 U+98C7 # <cjk> [2000]
+0xFBC8 U+98CB # <cjk> [2000]
+0xFBC9 U+98E0 # <cjk> [2000]
+0xFBCA U+2967F # <cjk> [2000] [Unicode3.1]
+0xFBCB U+98E1 # <cjk> [2000]
+0xFBCC U+98E3 # <cjk> [2000]
+0xFBCD U+98E5 # <cjk> [2000]
+0xFBCE U+98EA # <cjk> [2000]
+0xFBCF U+98F0 # <cjk> [2000]
+0xFBD0 U+98F1 # <cjk> [2000]
+0xFBD1 U+98F3 # <cjk> [2000]
+0xFBD2 U+9908 # <cjk> [2000]
+0xFBD3 U+4B3B # <cjk> [2000]
+0xFBD4 U+296F0 # <cjk> [2000] [Unicode3.1]
+0xFBD5 U+9916 # <cjk> [2000]
+0xFBD6 U+9917 # <cjk> [2000]
+0xFBD7 U+29719 # <cjk> [2000] [Unicode3.1]
+0xFBD8 U+991A # <cjk> [2000]
+0xFBD9 U+991B # <cjk> [2000]
+0xFBDA U+991C # <cjk> [2000]
+0xFBDB U+29750 # <cjk> [2000] [Unicode3.1]
+0xFBDC U+9931 # <cjk> [2000]
+0xFBDD U+9932 # <cjk> [2000]
+0xFBDE U+9933 # <cjk> [2000]
+0xFBDF U+993A # <cjk> [2000]
+0xFBE0 U+993B # <cjk> [2000]
+0xFBE1 U+993C # <cjk> [2000]
+0xFBE2 U+9940 # <cjk> [2000]
+0xFBE3 U+9941 # <cjk> [2000]
+0xFBE4 U+9946 # <cjk> [2000]
+0xFBE5 U+994D # <cjk> [2000]
+0xFBE6 U+994E # <cjk> [2000]
+0xFBE7 U+995C # <cjk> [2000]
+0xFBE8 U+995F # <cjk> [2000]
+0xFBE9 U+9960 # <cjk> [2000]
+0xFBEA U+99A3 # <cjk> [2000]
+0xFBEB U+99A6 # <cjk> [2000]
+0xFBEC U+99B9 # <cjk> [2000]
+0xFBED U+99BD # <cjk> [2000]
+0xFBEE U+99BF # <cjk> [2000]
+0xFBEF U+99C3 # <cjk> [2000]
+0xFBF0 U+99C9 # <cjk> [2000]
+0xFBF1 U+99D4 # <cjk> [2000]
+0xFBF2 U+99D9 # <cjk> [2000]
+0xFBF3 U+99DE # <cjk> [2000]
+0xFBF4 U+298C6 # <cjk> [2000] [Unicode3.1]
+0xFBF5 U+99F0 # <cjk> [2000]
+0xFBF6 U+99F9 # <cjk> [2000]
+0xFBF7 U+99FC # <cjk> [2000]
+0xFBF8 U+9A0A # <cjk> [2000]
+0xFBF9 U+9A11 # <cjk> [2000]
+0xFBFA U+9A16 # <cjk> [2000]
+0xFBFB U+9A1A # <cjk> [2000]
+0xFBFC U+9A20 # <cjk> [2000]
+0xFC40 U+9A31 # <cjk> [2000]
+0xFC41 U+9A36 # <cjk> [2000]
+0xFC42 U+9A44 # <cjk> [2000]
+0xFC43 U+9A4C # <cjk> [2000]
+0xFC44 U+9A58 # <cjk> [2000]
+0xFC45 U+4BC2 # <cjk> [2000]
+0xFC46 U+9AAF # <cjk> [2000]
+0xFC47 U+4BCA # <cjk> [2000]
+0xFC48 U+9AB7 # <cjk> [2000]
+0xFC49 U+4BD2 # <cjk> [2000]
+0xFC4A U+9AB9 # <cjk> [2000]
+0xFC4B U+29A72 # <cjk> [2000] [Unicode3.1]
+0xFC4C U+9AC6 # <cjk> [2000]
+0xFC4D U+9AD0 # <cjk> [2000]
+0xFC4E U+9AD2 # <cjk> [2000]
+0xFC4F U+9AD5 # <cjk> [2000]
+0xFC50 U+4BE8 # <cjk> [2000]
+0xFC51 U+9ADC # <cjk> [2000]
+0xFC52 U+9AE0 # <cjk> [2000]
+0xFC53 U+9AE5 # <cjk> [2000]
+0xFC54 U+9AE9 # <cjk> [2000]
+0xFC55 U+9B03 # <cjk> [2000]
+0xFC56 U+9B0C # <cjk> [2000]
+0xFC57 U+9B10 # <cjk> [2000]
+0xFC58 U+9B12 # <cjk> [2000]
+0xFC59 U+9B16 # <cjk> [2000]
+0xFC5A U+9B1C # <cjk> [2000]
+0xFC5B U+9B2B # <cjk> [2000]
+0xFC5C U+9B33 # <cjk> [2000]
+0xFC5D U+9B3D # <cjk> [2000]
+0xFC5E U+4C20 # <cjk> [2000]
+0xFC5F U+9B4B # <cjk> [2000]
+0xFC60 U+9B63 # <cjk> [2000]
+0xFC61 U+9B65 # <cjk> [2000]
+0xFC62 U+9B6B # <cjk> [2000]
+0xFC63 U+9B6C # <cjk> [2000]
+0xFC64 U+9B73 # <cjk> [2000]
+0xFC65 U+9B76 # <cjk> [2000]
+0xFC66 U+9B77 # <cjk> [2000]
+0xFC67 U+9BA6 # <cjk> [2000]
+0xFC68 U+9BAC # <cjk> [2000]
+0xFC69 U+9BB1 # <cjk> [2000]
+0xFC6A U+29DDB # <cjk> [2000] [Unicode3.1]
+0xFC6B U+29E3D # <cjk> [2000] [Unicode3.1]
+0xFC6C U+9BB2 # <cjk> [2000]
+0xFC6D U+9BB8 # <cjk> [2000]
+0xFC6E U+9BBE # <cjk> [2000]
+0xFC6F U+9BC7 # <cjk> [2000]
+0xFC70 U+9BF3 # <cjk> [2000]
+0xFC71 U+9BD8 # <cjk> [2000]
+0xFC72 U+9BDD # <cjk> [2000]
+0xFC73 U+9BE7 # <cjk> [2000]
+0xFC74 U+9BEA # <cjk> [2000]
+0xFC75 U+9BEB # <cjk> [2000]
+0xFC76 U+9BEF # <cjk> [2000]
+0xFC77 U+9BEE # <cjk> [2000]
+0xFC78 U+29E15 # <cjk> [2000] [Unicode3.1]
+0xFC79 U+9BFA # <cjk> [2000]
+0xFC7A U+29E8A # <cjk> [2000] [Unicode3.1]
+0xFC7B U+9BF7 # <cjk> [2000]
+0xFC7C U+29E49 # <cjk> [2000] [Unicode3.1]
+0xFC7D U+9C16 # <cjk> [2000]
+0xFC7E U+9C18 # <cjk> [2000]
+0xFC80 U+9C19 # <cjk> [2000]
+0xFC81 U+9C1A # <cjk> [2000]
+0xFC82 U+9C1D # <cjk> [2000]
+0xFC83 U+9C22 # <cjk> [2000]
+0xFC84 U+9C27 # <cjk> [2000]
+0xFC85 U+9C29 # <cjk> [2000]
+0xFC86 U+9C2A # <cjk> [2000]
+0xFC87 U+29EC4 # <cjk> [2000] [Unicode3.1]
+0xFC88 U+9C31 # <cjk> [2000]
+0xFC89 U+9C36 # <cjk> [2000]
+0xFC8A U+9C37 # <cjk> [2000]
+0xFC8B U+9C45 # <cjk> [2000]
+0xFC8C U+9C5C # <cjk> [2000]
+0xFC8D U+29EE9 # <cjk> [2000] [Unicode3.1]
+0xFC8E U+9C49 # <cjk> [2000]
+0xFC8F U+9C4A # <cjk> [2000]
+0xFC90 U+29EDB # <cjk> [2000] [Unicode3.1]
+0xFC91 U+9C54 # <cjk> [2000]
+0xFC92 U+9C58 # <cjk> [2000]
+0xFC93 U+9C5B # <cjk> [2000]
+0xFC94 U+9C5D # <cjk> [2000]
+0xFC95 U+9C5F # <cjk> [2000]
+0xFC96 U+9C69 # <cjk> [2000]
+0xFC97 U+9C6A # <cjk> [2000]
+0xFC98 U+9C6B # <cjk> [2000]
+0xFC99 U+9C6D # <cjk> [2000]
+0xFC9A U+9C6E # <cjk> [2000]
+0xFC9B U+9C70 # <cjk> [2000]
+0xFC9C U+9C72 # <cjk> [2000]
+0xFC9D U+9C75 # <cjk> [2000]
+0xFC9E U+9C7A # <cjk> [2000]
+0xFC9F U+9CE6 # <cjk> [2000]
+0xFCA0 U+9CF2 # <cjk> [2000]
+0xFCA1 U+9D0B # <cjk> [2000]
+0xFCA2 U+9D02 # <cjk> [2000]
+0xFCA3 U+29FCE # <cjk> [2000] [Unicode3.1]
+0xFCA4 U+9D11 # <cjk> [2000]
+0xFCA5 U+9D17 # <cjk> [2000]
+0xFCA6 U+9D18 # <cjk> [2000]
+0xFCA7 U+2A02F # <cjk> [2000] [Unicode3.1]
+0xFCA8 U+4CC4 # <cjk> [2000]
+0xFCA9 U+2A01A # <cjk> [2000] [Unicode3.1]
+0xFCAA U+9D32 # <cjk> [2000]
+0xFCAB U+4CD1 # <cjk> [2000]
+0xFCAC U+9D42 # <cjk> [2000]
+0xFCAD U+9D4A # <cjk> [2000]
+0xFCAE U+9D5F # <cjk> [2000]
+0xFCAF U+9D62 # <cjk> [2000]
+0xFCB0 U+2A0F9 # <cjk> [2000] [Unicode3.1]
+0xFCB1 U+9D69 # <cjk> [2000]
+0xFCB2 U+9D6B # <cjk> [2000]
+0xFCB3 U+2A082 # <cjk> [2000] [Unicode3.1]
+0xFCB4 U+9D73 # <cjk> [2000]
+0xFCB5 U+9D76 # <cjk> [2000]
+0xFCB6 U+9D77 # <cjk> [2000]
+0xFCB7 U+9D7E # <cjk> [2000]
+0xFCB8 U+9D84 # <cjk> [2000]
+0xFCB9 U+9D8D # <cjk> [2000]
+0xFCBA U+9D99 # <cjk> [2000]
+0xFCBB U+9DA1 # <cjk> [2000]
+0xFCBC U+9DBF # <cjk> [2000]
+0xFCBD U+9DB5 # <cjk> [2000]
+0xFCBE U+9DB9 # <cjk> [2000]
+0xFCBF U+9DBD # <cjk> [2000]
+0xFCC0 U+9DC3 # <cjk> [2000]
+0xFCC1 U+9DC7 # <cjk> [2000]
+0xFCC2 U+9DC9 # <cjk> [2000]
+0xFCC3 U+9DD6 # <cjk> [2000]
+0xFCC4 U+9DDA # <cjk> [2000]
+0xFCC5 U+9DDF # <cjk> [2000]
+0xFCC6 U+9DE0 # <cjk> [2000]
+0xFCC7 U+9DE3 # <cjk> [2000]
+0xFCC8 U+9DF4 # <cjk> [2000]
+0xFCC9 U+4D07 # <cjk> [2000]
+0xFCCA U+9E0A # <cjk> [2000]
+0xFCCB U+9E02 # <cjk> [2000]
+0xFCCC U+9E0D # <cjk> [2000]
+0xFCCD U+9E19 # <cjk> [2000]
+0xFCCE U+9E1C # <cjk> [2000]
+0xFCCF U+9E1D # <cjk> [2000]
+0xFCD0 U+9E7B # <cjk> [2000]
+0xFCD1 U+22218 # <cjk> [2000] [Unicode3.1]
+0xFCD2 U+9E80 # <cjk> [2000]
+0xFCD3 U+9E85 # <cjk> [2000]
+0xFCD4 U+9E9B # <cjk> [2000]
+0xFCD5 U+9EA8 # <cjk> [2000]
+0xFCD6 U+2A38C # <cjk> [2000] [Unicode3.1]
+0xFCD7 U+9EBD # <cjk> [2000]
+0xFCD8 U+2A437 # <cjk> [2000] [Unicode3.1]
+0xFCD9 U+9EDF # <cjk> [2000]
+0xFCDA U+9EE7 # <cjk> [2000]
+0xFCDB U+9EEE # <cjk> [2000]
+0xFCDC U+9EFF # <cjk> [2000]
+0xFCDD U+9F02 # <cjk> [2000]
+0xFCDE U+4D77 # <cjk> [2000]
+0xFCDF U+9F03 # <cjk> [2000]
+0xFCE0 U+9F17 # <cjk> [2000]
+0xFCE1 U+9F19 # <cjk> [2000]
+0xFCE2 U+9F2F # <cjk> [2000]
+0xFCE3 U+9F37 # <cjk> [2000]
+0xFCE4 U+9F3A # <cjk> [2000]
+0xFCE5 U+9F3D # <cjk> [2000]
+0xFCE6 U+9F41 # <cjk> [2000]
+0xFCE7 U+9F45 # <cjk> [2000]
+0xFCE8 U+9F46 # <cjk> [2000]
+0xFCE9 U+9F53 # <cjk> [2000]
+0xFCEA U+9F55 # <cjk> [2000]
+0xFCEB U+9F58 # <cjk> [2000]
+0xFCEC U+2A5F1 # <cjk> [2000] [Unicode3.1]
+0xFCED U+9F5D # <cjk> [2000]
+0xFCEE U+2A602 # <cjk> [2000] [Unicode3.1]
+0xFCEF U+9F69 # <cjk> [2000]
+0xFCF0 U+2A61A # <cjk> [2000] [Unicode3.1]
+0xFCF1 U+9F6D # <cjk> [2000]
+0xFCF2 U+9F70 # <cjk> [2000]
+0xFCF3 U+9F75 # <cjk> [2000]
+0xFCF4 U+2A6B2 # <cjk> [2000] [Unicode3.1]
diff --git a/ext/mbstring/tests/encoding_tests.inc b/ext/mbstring/tests/encoding_tests.inc
new file mode 100644
index 0000000000..e95bc8fd09
--- /dev/null
+++ b/ext/mbstring/tests/encoding_tests.inc
@@ -0,0 +1,225 @@
+<?php
+
+// Common code for tests which focus on conversion and verification of text
+// in some specific encoding
+
+// Read a file with one character and its equivalent Unicode codepoint on each
+// line, delimited by tabs
+function readConversionTable($path, &$from, &$to, $utf32 = false) {
+ $from = array();
+ $to = array();
+
+ $fp = fopen($path, 'r+');
+ while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+ if (sscanf($line, "0x%x\t0x%x", $char, $codepoint) == 2) {
+ $codepoint = $utf32 ? pack('N', $codepoint) : pack('n', $codepoint);
+ if ($char <= 0xFF)
+ $char = chr($char); // hex codes must not have leading zero bytes
+ else if ($char <= 0xFFFF)
+ $char = pack('n', $char);
+ else if ($char <= 0xFFFFFF)
+ $char = chr($char >> 16) . pack('n', $char & 0xFFFF);
+ else
+ $char = pack('N', $char);
+ $from[$char] = $codepoint;
+ $to[$codepoint] = $char;
+ }
+ }
+}
+
+function dbgPrint($str) {
+ $result = '';
+ if (mb_check_encoding($str, 'ASCII'))
+ $result .= '"' . $str . '" ';
+ return $result . "(" . bin2hex($str) . ")";
+}
+
+function identifyValidString($goodString, $encoding) {
+ $result = mb_check_encoding($goodString, $encoding);
+ if (!$result)
+ die("mb_check_encoding failed on good $encoding string: " . dbgPrint($goodString));
+}
+
+function identifyInvalidString($badString, $encoding) {
+ $result = mb_check_encoding($badString, $encoding);
+ if ($result)
+ die("mb_check_encoding passed on bad $encoding string: " . dbgPrint($badString));
+}
+
+function testConversion($fromString, $toString, $fromEncoding, $toEncoding) {
+ $result = mb_convert_encoding($fromString, $toEncoding, $fromEncoding);
+ if ($result !== $toString)
+ die("mb_convert_encoding not working on $fromEncoding input: " . dbgPrint($fromString) . "\nExpected $toEncoding: " . dbgPrint($toString) . "\nActually got: " . dbgPrint($result));
+}
+
+function testValidConversion($fromString, $toString, $fromEncoding, $toEncoding) {
+ $illegalChars = mb_get_info('illegal_chars');
+ testConversion($fromString, $toString, $fromEncoding, $toEncoding);
+ if (mb_get_info('illegal_chars') !== $illegalChars)
+ die("mb_convert_encoding incremented illegal_chars on valid $fromEncoding string: " . dbgPrint($fromString) . " when converting to $toEncoding");
+}
+
+function convertValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays = true) {
+ testValidConversion($fromString, $toString, $fromEncoding, $toEncoding);
+ if ($bothWays)
+ testValidConversion($toString, $fromString, $toEncoding, $fromEncoding);
+}
+
+function convertInvalidString($fromString, $toString, $fromEncoding, $toEncoding) {
+ $illegalChars = mb_get_info('illegal_chars');
+ testConversion($fromString, $toString, $fromEncoding, $toEncoding);
+ if (mb_get_info('illegal_chars') <= $illegalChars)
+ die("mb_convert_encoding did not increment illegal_chars on invalid $fromEncoding string: " . dbgPrint($fromString) . " when converting to $toEncoding");
+}
+
+function testValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays = true) {
+ identifyValidString($fromString, $fromEncoding);
+ convertValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays);
+}
+
+function testInvalidString($fromString, $toString, $fromEncoding, $toEncoding) {
+ identifyInvalidString($fromString, $fromEncoding);
+ convertInvalidString($fromString, $toString, $fromEncoding, $toEncoding);
+}
+
+// Only for encodings where valid characters can be concatenated together in any
+// way, without any escape sequences
+function testAllValidChars($charMap, $fromEncoding, $toEncoding, $bothWays = true) {
+ $goodChars = array_keys($charMap);
+ shuffle($goodChars);
+ while (!empty($goodChars)) {
+ $length = min(rand(5,10), count($goodChars));
+ $fromString = $toString = '';
+ while ($length--) {
+ $goodChar = array_pop($goodChars);
+ $fromString .= $goodChar;
+ $toString .= $charMap[$goodChar];
+ }
+
+ testValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays);
+ }
+}
+
+function testAllInvalidChars($badChars, $charMap, $fromEncoding, $toEncoding, $replacement) {
+ $badChars = array_keys($badChars);
+ $goodChars = array();
+ while (!empty($badChars)) {
+ if (empty($goodChars)) {
+ $goodChars = array_keys($charMap);
+ shuffle($goodChars);
+ }
+ $goodChar = array_pop($goodChars);
+ $fromString = array_pop($badChars) . $goodChar;
+ $toString = $replacement . $charMap[$goodChar];
+
+ testInvalidString($fromString, $toString, $fromEncoding, $toEncoding);
+ }
+}
+
+function convertAllInvalidChars($badChars, $charMap, $fromEncoding, $toEncoding, $replacement) {
+ $badChars = array_keys($badChars);
+ $goodChars = array();
+ while (!empty($badChars)) {
+ if (empty($goodChars)) {
+ $goodChars = array_keys($charMap);
+ shuffle($goodChars);
+ }
+ $goodChar = array_pop($goodChars);
+ $fromString = array_pop($badChars) . $goodChar;
+ $toString = $replacement . $charMap[$goodChar];
+
+ convertInvalidString($fromString, $toString, $fromEncoding, $toEncoding);
+ }
+}
+
+function testTruncatedChars($truncated, $fromEncoding, $toEncoding, $replacement) {
+ $truncatedChars = array_keys($truncated);
+ foreach ($truncatedChars as $truncatedChar) {
+ testInvalidString($truncatedChar, $replacement, $fromEncoding, $toEncoding);
+ }
+}
+
+// For variable-width encodings, where we have an exhaustive list of
+// all valid characters of any width
+//
+// `$startBytes` maps from first-byte values to the corresponding character length
+// (For encodings where the first byte can tell you the length of a multi-byte
+// character)
+// Note that `$startBytes` can be partial!
+function findInvalidChars($valid, &$invalid, &$truncated, $startBytes = array()) {
+ $invalid = array();
+ $truncated = array();
+ $prefixes = array(); /* All sequences which are not (but can start) a valid character */
+
+ foreach ($valid as $char => $unicode) {
+ for ($len = 1; $len < strlen($char); $len++)
+ $prefixes[substr($char, 0, $len)] = true;
+ }
+
+ $varLength = function($prefix) use($valid, &$invalid, &$truncated) {
+ for ($byte = 0; $byte < 256; $byte++) {
+ $str = $prefix . chr($byte);
+ if (!isset($valid[$str])) {
+ if (isset($prefixes[$str])) {
+ $truncated[$str] = true;
+ $varLength($str);
+ } else {
+ $invalid[$str] = true;
+ }
+ }
+ }
+ };
+
+ $fixedLength = function($prefix, $remaining) use($valid, &$invalid, &$truncated, &$fixedLength) {
+ if ($remaining == 0) {
+ if (!isset($valid[$prefix]))
+ $invalid[$prefix] = true;
+ } else if ($remaining == 1) {
+ $truncated[$prefix] = true;
+ for ($i = 0; $i < 256; $i++) {
+ $str = $prefix . chr($i);
+ if (!isset($valid[$str]))
+ $invalid[$str] = true;
+ }
+ } else {
+ $truncated[$prefix] = true;
+ for ($i = 0; $i < 256; $i++)
+ $fixedLength($prefix . chr($i), $remaining - 1);
+ }
+ };
+
+ for ($byte = 0; $byte < 256; $byte++) {
+ if (isset($startBytes[$byte])) {
+ $fixedLength(chr($byte), $startBytes[$byte] - 1);
+ } else {
+ $str = chr($byte);
+ if (!isset($valid[$str])) {
+ if (isset($prefixes[$str])) {
+ $truncated[$str] = true;
+ $varLength($str);
+ } else {
+ $invalid[$str] = true;
+ }
+ }
+ }
+ }
+}
+
+function testEncodingFromUTF16ConversionTable($path, $encoding, $replacement = '%', $startBytes = array()) {
+ srand(1000); // Make results consistent
+ mb_substitute_character(0x25); // '%'
+ readConversionTable($path, $toUnicode, $fromUnicode);
+
+ findInvalidChars($toUnicode, $invalid, $truncated, $startBytes);
+ testAllValidChars($toUnicode, $encoding, 'UTF-16BE');
+ testAllInvalidChars($invalid, $toUnicode, $encoding, 'UTF-16BE', "\x00%");
+ testTruncatedChars($truncated, $encoding, 'UTF-16BE', "\x00%");
+ echo "Tested $encoding -> UTF-16BE\n";
+
+ findInvalidChars($fromUnicode, $invalid, $unused, array_fill_keys(range(0,0xFF), 2));
+ convertAllInvalidChars($invalid, $fromUnicode, 'UTF-16BE', $encoding, $replacement);
+ echo "Tested UTF-16BE -> $encoding\n";
+}
+?>
diff --git a/ext/mbstring/tests/eucjp_encoding.phpt b/ext/mbstring/tests/eucjp_encoding.phpt
new file mode 100644
index 0000000000..dc321d3bae
--- /dev/null
+++ b/ext/mbstring/tests/eucjp_encoding.phpt
@@ -0,0 +1,81 @@
+--TEST--
+Exhaustive test of EUC-JP encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(555); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in EUC-JP */
+readConversionTable(__DIR__ . '/data/EUC-JP.txt', $validChars, $fromUnicode, true);
+
+/* The JIS X 0208 character set does not have a single, straightforward
+ * mapping to the Unicode character set */
+
+/* Kuten code 0x2140 (EUC-JP 0xA1C0) is a backslash; this can be mapped to
+ * 0x005C for an ordinary backslash, or 0xFF3C for a _fullwidth_ one
+ * We go with fullwidth */
+$validChars["\xA1\xC0"] = "\x00\x00\xFF\x3C";
+$fromUnicode["\x00\x00\xFF\x3C"] = "\xA1\xC0";
+
+/* Unicode has both halfwidth and fullwidth NOT SIGN; convert both of them
+ * to JIS X 0208 NOT SIGN */
+$fromUnicode["\x00\x00\xFF\xE2"] = "\xA2\xCC";
+/* Likewise for fullwidth and halfwidth POUND SIGN */
+$fromUnicode["\x00\x00\xFF\xE1"] = "\xA1\xF2";
+/* Likewise for fullwidth and halfwidth CENT SIGN */
+$fromUnicode["\x00\x00\xFF\xE0"] = "\xA1\xF1";
+/* Convert Unicode FULLWIDTH TILDE to JIS X 0208 WAVE DASH */
+$fromUnicode["\x00\x00\xFF\x5E"] = "\xA1\xC1";
+/* Convert Unicode FULLWIDTH HYPHEN-MINUS to JIS X 0208 MINUS SIGN */
+$fromUnicode["\x00\x00\xFF\x0D"] = "\xA1\xDD";
+/* Convert Unicode PARALLEL TO to JIS X 0208 DOUBLE VERTICAL LINE */
+$fromUnicode["\x00\x00\x22\x25"] = "\xA1\xC2";
+
+/* Unicode 0x007E (tilde) can be represented in two different ways in EUC-JP
+ * When converting Unicode to EUC-JP, use the simpler representation */
+$fromUnicode["\x00\x00\x00\x7E"] = "\x7E";
+/* Likewise with 0x005C */
+$fromUnicode["\x00\x00\x00\x5C"] = "\x5C";
+
+findInvalidChars($validChars, $invalidChars, $truncated, array_fill_keys(range(0xA1, 0xFE), 2) + array(0x8E => 2, 0x8F => 3));
+
+/* In the JIS X 0212 character set, kuten code 0x2237 (EUC-JP 0x8FA2B7)
+ * is an ordinary tilde character
+ * This mapping is not reversible, because ASCII 0x7E also represents
+ * the same character */
+unset($validChars["\x8F\xA2\xB7"]);
+
+testAllValidChars($validChars, 'EUC-JP', 'UTF-32BE');
+echo "Encoding verification and conversion work for all valid characters\n";
+
+testAllInvalidChars($invalidChars, $validChars, 'EUC-JP', 'UTF-32BE', "\x00\x00\x00%");
+testTruncatedChars($truncated, 'EUC-JP', 'UTF-32BE', "\x00\x00\x00%");
+echo "Encoding verification and conversion work for all invalid characters\n";
+
+testValidString("\x8F\xA2\xB7", "\x00\x00\x00~", 'EUC-JP', 'UTF-32BE', false);
+echo "Irreversible mapping of 0x8FA2B7 follows JIS X 0212 correctly\n";
+
+testAllValidChars($fromUnicode, 'UTF-32BE', 'EUC-JP', false);
+echo "Unicode -> EUC-JP conversion works on all valid characters\n";
+
+$invalidChars = array();
+for ($cp = 0; $cp <= 0xFFFF; $cp++) {
+ $char = pack('N', $cp);
+ if (!isset($fromUnicode[$char]))
+ $invalidChars[$char] = true;
+}
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-32BE', 'EUC-JP', '%');
+echo "Unicode -> EUC-JP conversion works on all invalid characters\n";
+?>
+--EXPECT--
+Encoding verification and conversion work for all valid characters
+Encoding verification and conversion work for all invalid characters
+Irreversible mapping of 0x8FA2B7 follows JIS X 0212 correctly
+Unicode -> EUC-JP conversion works on all valid characters
+Unicode -> EUC-JP conversion works on all invalid characters
diff --git a/ext/mbstring/tests/illformed_utf_sequences.phpt b/ext/mbstring/tests/illformed_utf_sequences.phpt
index 3b7d431a0e..8f3b97e8ec 100644
--- a/ext/mbstring/tests/illformed_utf_sequences.phpt
+++ b/ext/mbstring/tests/illformed_utf_sequences.phpt
@@ -4,12 +4,9 @@ Unicode standard conformance test (ill-formed UTF sequences.)
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--FILE--
<?php
-function chk_enc($str, $n, $enc = "UTF-8", $with_bom = false) {
+function chk_enc($str, $n, $enc = "UTF-8") {
$src = bin2hex(mb_convert_encoding($str, "UCS-4BE", $enc));
$dst = str_repeat("0000fffd", $n);
- if ($with_bom) {
- $dst = "0000feff" . $dst;
- }
if ($dst == $src) {
return false;
} else {
@@ -129,7 +126,7 @@ $out = '';
$cnt = 0;
for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
$s = chk_enc("\x00\x00\xfe\xff". pack('C4', $i >> 24, ($i >> 16) & 0xff, ($i >> 8) & 0xff, $i & 0xff),
- 1, "UTF-32", true);
+ 1, "UTF-32");
if ($s === false) {
$cnt++;
} else {
@@ -137,13 +134,13 @@ for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
}
}
var_dump($cnt);
-var_dump(str_replace("0000feff","",$out));
+var_dump($out);
$out = '';
$cnt = 0;
for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
$s = chk_enc("\xff\xfe\x00\x00". pack('C4', $i & 0xff, ($i >> 8) & 0xff, ($i >> 16) & 0xff, ($i >> 24) & 0xff),
- 1, "UTF-32", true);
+ 1, "UTF-32");
if ($s === false) {
$cnt++;
} else {
@@ -151,7 +148,7 @@ for ($i = 0xd7ff; $i <= 0xe000; ++$i) {
}
}
var_dump($cnt);
-var_dump(str_replace("0000feff","",$out));
+var_dump($out);
?>
--EXPECT--
@@ -199,10 +196,10 @@ bool(false)
string(8) "0010ffff"
bool(false)
string(8) "0010ffff"
-string(16) "0000feff0000fffd"
-string(16) "0000feff0010ffff"
-string(16) "0000feff0000fffd"
-string(16) "0000feff0010ffff"
+string(8) "0000fffd"
+string(8) "0010ffff"
+string(8) "0000fffd"
+string(8) "0010ffff"
UTF-32 and surrogates area
int(2048)
string(16) "0000d7ff0000e000"
diff --git a/ext/mbstring/tests/iso8859_encodings.phpt b/ext/mbstring/tests/iso8859_encodings.phpt
new file mode 100644
index 0000000000..bbc70dfe3d
--- /dev/null
+++ b/ext/mbstring/tests/iso8859_encodings.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Exhaustive test of verification and conversion of ISO-8859-X text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+
+for ($n = 1; $n <= 16; $n++) {
+ if ($n == 11 || $n == 12)
+ continue;
+ testEncodingFromUTF16ConversionTable(__DIR__ . "/data/8859-$n.txt", "ISO-8859-{$n}");
+}
+?>
+--EXPECT--
+Tested ISO-8859-1 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-1
+Tested ISO-8859-2 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-2
+Tested ISO-8859-3 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-3
+Tested ISO-8859-4 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-4
+Tested ISO-8859-5 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-5
+Tested ISO-8859-6 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-6
+Tested ISO-8859-7 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-7
+Tested ISO-8859-8 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-8
+Tested ISO-8859-9 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-9
+Tested ISO-8859-10 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-10
+Tested ISO-8859-13 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-13
+Tested ISO-8859-14 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-14
+Tested ISO-8859-15 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-15
+Tested ISO-8859-16 -> UTF-16BE
+Tested UTF-16BE -> ISO-8859-16
diff --git a/ext/mbstring/tests/koi8r_encoding.phpt b/ext/mbstring/tests/koi8r_encoding.phpt
new file mode 100644
index 0000000000..368de514e2
--- /dev/null
+++ b/ext/mbstring/tests/koi8r_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of KOI8-R text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/KOI8-R.txt', 'KOI8-R');
+?>
+--EXPECT--
+Tested KOI8-R -> UTF-16BE
+Tested UTF-16BE -> KOI8-R
diff --git a/ext/mbstring/tests/koi8u_encoding.phpt b/ext/mbstring/tests/koi8u_encoding.phpt
new file mode 100644
index 0000000000..499009225c
--- /dev/null
+++ b/ext/mbstring/tests/koi8u_encoding.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Exhaustive test of verification and conversion of KOI8-U text
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+include('encoding_tests.inc');
+testEncodingFromUTF16ConversionTable(__DIR__ . '/data/KOI8-U.txt', 'KOI8-U');
+?>
+--EXPECT--
+Tested KOI8-U -> UTF-16BE
+Tested UTF-16BE -> KOI8-U
diff --git a/ext/mbstring/tests/mb_convert_encoding.phpt b/ext/mbstring/tests/mb_convert_encoding.phpt
index 1f39d21b15..5ea4440049 100644
--- a/ext/mbstring/tests/mb_convert_encoding.phpt
+++ b/ext/mbstring/tests/mb_convert_encoding.phpt
@@ -20,11 +20,11 @@ $euc_jp = 'ÆüËÜ¸ì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£';
// Note: For some reason it complains, results are different. Not researched.
echo "== BASIC TEST ==\n";
$s = $sjis;
-$s = mb_convert_encoding($s, 'EUC-JP', 'SJIS');
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', 'SJIS'));
print("EUC-JP: $s\n"); // EUC-JP
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', 'JIS');
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', 'JIS'));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -41,7 +41,7 @@ echo "== STRING ENCODING LIST ==\n";
$a = 'JIS,UTF-8,EUC-JP,SJIS';
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', $a);
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', $a));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -58,7 +58,7 @@ echo "== ARRAY ENCODING LIST ==\n";
$a = array(0=>'JIS', 1=>'UTF-8', 2=>'EUC-JP', 3=>'SJIS');
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', $a);
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', $a));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -74,7 +74,7 @@ print("JIS: ".base64_encode($s)."\n"); // JIS
echo "== DETECT ORDER ==\n";
$s = $jis;
-$s = mb_convert_encoding($s, 'EUC-JP', 'auto');
+$s = bin2hex(mb_convert_encoding($s, 'EUC-JP', 'auto'));
print("EUC-JP: $s\n"); // EUC-JP
$s = $euc_jp;
@@ -86,18 +86,18 @@ $s = mb_convert_encoding($s, 'JIS', 'auto');
print("JIS: ".base64_encode($s)."\n"); // JIS
-// Invalid(?) Parameters
+// Invalid Parameters
echo "== INVALID PARAMETER ==\n";
$s = mb_convert_encoding(1234, 'EUC-JP');
-print("INT: $s\n"); // EUC-JP
+print("INT: $s\n");
$s = mb_convert_encoding('', 'EUC-JP');
print("EUC-JP: $s\n"); // SJIS
$s = $euc_jp;
try {
- var_dump( mb_convert_encoding($s, 'BAD') );
+ var_dump(mb_convert_encoding($s, 'BAD'));
} catch (\ValueError $e) {
echo $e->getMessage() . \PHP_EOL;
}
@@ -105,20 +105,20 @@ try {
?>
--EXPECT--
== BASIC TEST ==
-EUC-JP: ÆüËÜ¸ì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
-EUC-JP: ÆüËÜ¸ì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== STRING ENCODING LIST ==
-EUC-JP: ÆüËÜ¸ì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== ARRAY ENCODING LIST ==
-EUC-JP: ÆüËÜ¸ì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== DETECT ORDER ==
-EUC-JP: ÆüËÜ¸ì¥Æ¥­¥¹¥È¤Ç¤¹¡£01234£µ£¶£·£¸£¹¡£
+EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3
SJIS: k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg==
JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg==
== INVALID PARAMETER ==
diff --git a/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt b/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt
index b3c8ba10bb..45efe28766 100644
--- a/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt
+++ b/ext/mbstring/tests/mb_convert_encoding_failed_detection.phpt
@@ -1,5 +1,7 @@
--TEST--
mb_convert_encoding() when encoding detection fails
+--INI--
+mbstring.strict_detection=1
--FILE--
<?php
diff --git a/ext/mbstring/tests/mb_detect_encoding.phpt b/ext/mbstring/tests/mb_detect_encoding.phpt
index 71c44c1642..b3db5f8825 100644
--- a/ext/mbstring/tests/mb_detect_encoding.phpt
+++ b/ext/mbstring/tests/mb_detect_encoding.phpt
@@ -41,7 +41,6 @@ echo "== ARRAY ENCODING LIST ==\n";
$a = array(0=>'UTF-8',1=>'EUC-JP', 2=>'SJIS', 3=>'JIS');
-// Note: Due to detect order, detected as UTF-8
$s = $jis;
$s = mb_detect_encoding($s, $a);
print("JIS: $s\n");
@@ -98,7 +97,7 @@ JIS: JIS
EUC-JP: EUC-JP
EUC-JP: EUC-JP
== ARRAY ENCODING LIST ==
-JIS: UTF-8
+JIS: JIS
EUC-JP: EUC-JP
SJIS: SJIS
== DETECT ORDER ==
diff --git a/ext/mbstring/tests/mb_internal_encoding_variation2.phpt b/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
index df38a9876b..ccf06802ba 100644
--- a/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
+++ b/ext/mbstring/tests/mb_internal_encoding_variation2.phpt
@@ -50,10 +50,6 @@ $encoding = array('UCS-4', /*1*/
'ISO-8859-13',
'ISO-8859-14',
'ISO-8859-15', /*35*/
- 'byte2be',
- 'byte2le',
- 'byte4be',
- 'byte4le',
'BASE64', /*40*/
'HTML-ENTITIES',
'7bit',
@@ -263,104 +259,84 @@ string(11) "ISO-8859-15"
-- Iteration 36 --
string(11) "ISO-8859-15"
bool(true)
-string(7) "byte2be"
-
--- Iteration 37 --
-string(7) "byte2be"
-bool(true)
-string(7) "byte2le"
-
--- Iteration 38 --
-string(7) "byte2le"
-bool(true)
-string(7) "byte4be"
-
--- Iteration 39 --
-string(7) "byte4be"
-bool(true)
-string(7) "byte4le"
-
--- Iteration 40 --
-string(7) "byte4le"
-bool(true)
string(6) "BASE64"
--- Iteration 41 --
+-- Iteration 37 --
string(6) "BASE64"
bool(true)
string(13) "HTML-ENTITIES"
--- Iteration 42 --
+-- Iteration 38 --
string(13) "HTML-ENTITIES"
bool(true)
string(4) "7bit"
--- Iteration 43 --
+-- Iteration 39 --
string(4) "7bit"
bool(true)
string(4) "8bit"
--- Iteration 44 --
+-- Iteration 40 --
string(4) "8bit"
bool(true)
string(6) "EUC-CN"
--- Iteration 45 --
+-- Iteration 41 --
string(6) "EUC-CN"
bool(true)
string(5) "CP936"
--- Iteration 46 --
+-- Iteration 42 --
string(5) "CP936"
bool(true)
string(2) "HZ"
--- Iteration 47 --
+-- Iteration 43 --
string(2) "HZ"
bool(true)
string(6) "EUC-TW"
--- Iteration 48 --
+-- Iteration 44 --
string(6) "EUC-TW"
bool(true)
string(5) "CP950"
--- Iteration 49 --
+-- Iteration 45 --
string(5) "CP950"
bool(true)
string(5) "BIG-5"
--- Iteration 50 --
+-- Iteration 46 --
string(5) "BIG-5"
bool(true)
string(6) "EUC-KR"
--- Iteration 51 --
+-- Iteration 47 --
string(6) "EUC-KR"
bool(true)
string(3) "UHC"
--- Iteration 52 --
+-- Iteration 48 --
string(3) "UHC"
bool(true)
string(11) "ISO-2022-KR"
--- Iteration 53 --
+-- Iteration 49 --
string(11) "ISO-2022-KR"
bool(true)
string(12) "Windows-1251"
--- Iteration 54 --
+-- Iteration 50 --
string(12) "Windows-1251"
bool(true)
string(12) "Windows-1252"
--- Iteration 55 --
+-- Iteration 51 --
string(12) "Windows-1252"
bool(true)
string(5) "CP866"
--- Iteration 56 --
+-- Iteration 52 --
string(5) "CP866"
bool(true)
string(6) "KOI8-R"
diff --git a/ext/mbstring/tests/sjis2004_encoding.phpt b/ext/mbstring/tests/sjis2004_encoding.phpt
new file mode 100644
index 0000000000..cf9ef7a91a
--- /dev/null
+++ b/ext/mbstring/tests/sjis2004_encoding.phpt
@@ -0,0 +1,62 @@
+--TEST--
+Exhaustive test of SJIS-2004 encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(101); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in SJIS-2004 */
+$validChars = array(); /* SJIS-2004 string -> UTF-32BE string */
+$fromUnicode = array(); /* UTF-16BE -> SJIS-2004 */
+$fp = fopen(__DIR__ . '/data/SJIS-2004.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ $codepoint2 = null;
+ if (sscanf($line, "0x%x\tU+%x+%x", $bytes, $codepoint1, $codepoint2) >= 2) {
+ $sjis = ($bytes < 256) ? chr($bytes) : pack('n', $bytes);
+ if ($codepoint2) {
+ $validChars[$sjis] = pack('NN', $codepoint1, $codepoint2);
+ } else {
+ /* Two input byte sequences can translate to either a 'halfwidth' or a
+ * 'fullwidth' version of a character; our implementation of SJIS-2004
+ * translates them to the fullwidth versions */
+ if (preg_match('/Fullwidth: U\+([0-9A-F]+)/', $line, $match))
+ $codepoint1 = hexdec($match[1]);
+ $validChars[$sjis] = pack('N', $codepoint1);
+ if ($codepoint1 <= 0xFFFF)
+ $fromUnicode[pack('n', $codepoint1)] = $sjis;
+ }
+ }
+}
+$fromUnicode["\x00\x7E"] = "\x7E"; /* Not reversible; SJIS 0x7E -> U+203E */
+$fromUnicode["\x00\x5C"] = "\x5C"; /* Not reversible; SJIS 0x5C -> U+00A5 */
+
+testAllValidChars($validChars, 'SJIS-2004', 'UTF-32BE');
+echo "SJIS-2004 verification and conversion works for all valid characters\n";
+
+findInvalidChars($validChars, $invalidChars, $truncated,
+ array_fill_keys(range(0x81, 0x9F), 2) + array_fill_keys(range(0xE0, 0xFC), 2));
+testAllInvalidChars($invalidChars, $validChars, 'SJIS-2004', 'UTF-32BE', "\x00\x00\x00%");
+testTruncatedChars($truncated, 'SJIS-2004', 'UTF-32BE', "\x00\x00\x00%");
+echo "SJIS-2004 verification and conversion rejects all invalid characters\n";
+
+testAllValidChars($fromUnicode, 'UTF-16BE', 'SJIS-2004', false);
+echo "Unicode -> SJIS-2004 conversion works on all valid characters\n";
+
+findInvalidChars($fromUnicode, $invalidChars, $unused, array_fill_keys(range(0, 0xFF), 2));
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-16BE', 'SJIS-2004', '%');
+echo "Unicode -> SJIS-2004 conversion works on all invalid characters\n";
+?>
+--EXPECT--
+SJIS-2004 verification and conversion works for all valid characters
+SJIS-2004 verification and conversion rejects all invalid characters
+Unicode -> SJIS-2004 conversion works on all valid characters
+Unicode -> SJIS-2004 conversion works on all invalid characters
diff --git a/ext/mbstring/tests/sjis_encoding.phpt b/ext/mbstring/tests/sjis_encoding.phpt
new file mode 100644
index 0000000000..a75ce85a4f
--- /dev/null
+++ b/ext/mbstring/tests/sjis_encoding.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Exhaustive test of Shift-JIS encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(999); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in Shift-JIS */
+readConversionTable(__DIR__ . '/data/SHIFTJIS.txt', $validChars, $fromUnicode);
+
+for ($i = 0; $i < 0x20; $i++) {
+ $validChars[chr($i)] = "\x00" . chr($i);
+ $fromUnicode["\x00" . chr($i)] = chr($i);
+}
+
+/* DEL character */
+$validChars["\x7F"] = "\x00\x7F";
+$fromUnicode["\x00\x7F"] = "\x7F";
+/* Although Shift-JIS uses 0x7E for an overline, we will map Unicode 0x7E
+ * (tilde) to Shift-JIS 0x7E (as iconv does) */
+$fromUnicode["\x00\x7E"] = "\x7E";
+/* Use fullwidth reverse solidus, not (halfwidth) backslash (0x5C) */
+$validChars["\x81\x5F"] = "\xFF\x3C";
+$fromUnicode["\xFF\x3C"] = "\x81\x5F";
+/* Unicode has both halfwidth and fullwidth NOT SIGN; convert both of them
+ * to JIS X 0208 NOT SIGN */
+$fromUnicode["\xFF\xE2"] = "\x81\xCA";
+/* Likewise for fullwidth and halfwidth POUND SIGN */
+$fromUnicode["\xFF\xE1"] = "\x81\x92";
+/* Likewise for fullwidth and halfwidth CENT SIGN */
+$fromUnicode["\xFF\xE0"] = "\x81\x91";
+/* Convert Unicode FULLWIDTH TILDE to JIS X 0208 WAVE DASH */
+$fromUnicode["\xFF\x5E"] = "\x81\x60";
+/* Convert Unicode FULLWIDTH HYPHEN-MINUS to JIS X 0208 MINUS SIGN */
+$fromUnicode["\xFF\x0D"] = "\x81\x7C";
+/* Convert Unicode PARALLEL TO to JIS X 0208 DOUBLE VERTICAL LINE */
+$fromUnicode["\x22\x25"] = "\x81\x61";
+
+testAllValidChars($validChars, 'Shift-JIS', 'UTF-16BE');
+echo "SJIS verification and conversion works on all valid characters\n";
+
+findInvalidChars($validChars, $invalidChars, $truncated,
+ array_fill_keys(range(0x81, 0x9F), 2) + array_fill_keys(range(0xE0, 0xEF), 2));
+testAllInvalidChars($invalidChars, $validChars, 'Shift-JIS', 'UTF-16BE', "\x00%");
+testTruncatedChars($truncated, 'Shift-JIS', 'UTF-16BE', "\x00%");
+echo "SJIS verification and conversion works on all invalid characters\n";
+
+testAllValidChars($fromUnicode, 'UTF-16BE', 'Shift-JIS', false);
+echo "Unicode -> SJIS conversion works on all valid characters\n";
+
+findInvalidChars($fromUnicode, $invalidChars, $unused, array_fill_keys(range(0, 0xFF), 2));
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-16BE', 'Shift-JIS', '%');
+echo "Unicode -> SJIS conversion works on all invalid characters\n";
+?>
+--EXPECT--
+SJIS verification and conversion works on all valid characters
+SJIS verification and conversion works on all invalid characters
+Unicode -> SJIS conversion works on all valid characters
+Unicode -> SJIS conversion works on all invalid characters
diff --git a/ext/mbstring/tests/sjismac_encoding.phpt b/ext/mbstring/tests/sjismac_encoding.phpt
new file mode 100644
index 0000000000..2dedfa7970
--- /dev/null
+++ b/ext/mbstring/tests/sjismac_encoding.phpt
@@ -0,0 +1,85 @@
+--TEST--
+Exhaustive test of MacJapanese encoding verification and conversion
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip mbstring not available');
+if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+?>
+--FILE--
+<?php
+srand(300); /* Make results consistent */
+include('encoding_tests.inc');
+mb_substitute_character(0x25); // '%'
+
+/* Read in the table of all characters in MacJapanese */
+$validChars = array(); /* MacJapanese string -> UTF-32BE string */
+$fromUnicode = array(); /* UTF-16BE -> MacJapanese */
+$fp = fopen(__DIR__ . '/data/MacJapanese-SJIS.txt', 'r+');
+while ($line = fgets($fp, 256)) {
+ if ($line[0] == '#')
+ continue;
+
+ $cp1 = $cp2 = $cp3 = $cp4 = $cp5 = null;
+ if (sscanf($line, "0x%x\t0x%x+0x%x+0x%x+0x%x+0x%x", $bytes, $cp1, $cp2, $cp3, $cp4, $cp5) >= 2) {
+ if ($bytes < 256) {
+ $macJap = chr($bytes);
+ } else {
+ $macJap = pack('n', $bytes);
+ }
+
+ if ($cp5) {
+ $validChars[$macJap] = pack('NNNNN', $cp1, $cp2, $cp3, $cp4, $cp5);
+ $fromUnicode[pack('nnnnn', $cp1, $cp2, $cp3, $cp4, $cp5)] = $macJap;
+ } else if ($cp4) {
+ $validChars[$macJap] = pack('NNNN', $cp1, $cp2, $cp3, $cp4);
+ $fromUnicode[pack('nnnn', $cp1, $cp2, $cp3, $cp4)] = $macJap;
+ } else if ($cp3) {
+ $validChars[$macJap] = pack('NNN', $cp1, $cp2, $cp3);
+ $fromUnicode[pack('nnn', $cp1, $cp2, $cp3)] = $macJap;
+ } else if ($cp2) {
+ $validChars[$macJap] = pack('NN', $cp1, $cp2);
+ $fromUnicode[pack('nn', $cp1, $cp2)] = $macJap;
+ } else {
+ $validChars[$macJap] = pack('N', $cp1);
+ $fromUnicode[pack('n', $cp1)] = $macJap;
+ }
+ }
+}
+/* Although not included in the table, 0x0-0x1F and 0x7F are valid;
+ * these are 'control characters' */
+for ($i = 0; $i < 0x20; $i++) {
+ $validChars[chr($i)] = pack('N', $i);
+ $fromUnicode[pack('n', $i)] = chr($i);
+}
+$validChars["\x7F"] = pack('N', 0x7F);
+$fromUnicode["\x00\x7F"] = "\x7F";
+
+/* While Shift-JIS 0x815C normally corresponds to U+2015 (HORIZONTAL BAR),
+ * for MacJapanese we convert 0x815C to U+2014 (EM DASH)
+ * (See recommendations in JAPANESE.txt from the Unicode Consortium, under
+ * 'Unicode mapping issues', point 3)
+ * However, when converting Unicode -> MacJapanese, we accept both U+2014
+ * and U+2015 */
+$fromUnicode["\x20\x15"] = "\x81\x5C";
+
+testAllValidChars($validChars, 'SJIS-mac', 'UTF-32BE');
+echo "MacJapanese verification and conversion works on all valid characters\n";
+
+findInvalidChars($validChars, $invalidChars, $truncated,
+ array_fill_keys(range(0x81, 0x9F), 2) + array_fill_keys(range(0xE0, 0xED), 2));
+testAllInvalidChars($invalidChars, $validChars, 'SJIS-mac', 'UTF-32BE', "\x00\x00\x00%");
+testTruncatedChars($truncated, 'SJIS-mac', 'UTF-32BE', "\x00\x00\x00%");
+echo "MacJapanese verification and conversion rejects all invalid characters\n";
+
+testAllValidChars($fromUnicode, 'UTF-16BE', 'SJIS-mac', false);
+echo "Unicode -> SJIS-mac conversion works on all valid characters\n";
+
+findInvalidChars($fromUnicode, $invalidChars, $unused, array_fill_keys(range(0, 0xFF), 2));
+convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-16BE', 'SJIS-mac', '%');
+echo "Unicode -> SJIS-mac conversion works on all invalid characters\n";
+?>
+--EXPECT--
+MacJapanese verification and conversion works on all valid characters
+MacJapanese verification and conversion rejects all invalid characters
+Unicode -> SJIS-mac conversion works on all valid characters
+Unicode -> SJIS-mac conversion works on all invalid characters
diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c
index 10f20eede8..55da87fdf0 100644
--- a/ext/mysqlnd/mysqlnd_ps.c
+++ b/ext/mysqlnd/mysqlnd_ps.c
@@ -109,7 +109,7 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s)
}
/* Position at the first row */
set->data_cursor = set->data;
- } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_ZVAL) {
+ } else if (result->stored_data->type == MYSQLND_BUFFERED_TYPE_C) {
/*TODO*/
}
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 7eee9819ce..c8ee9b9da6 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -802,7 +802,7 @@ static inline void kill_all_lockers(struct flock *mem_usage_check)
/* errno is not ESRCH or we ran out of tries to kill the locker */
ZCSG(force_restart_time) = time(NULL); /* restore forced restart request */
/* cannot kill the locker, bail out with error */
- zend_accel_error(ACCEL_LOG_ERROR, "Cannot kill process %d!", mem_usage_check->l_pid);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Cannot kill process %d!", mem_usage_check->l_pid);
}
mem_usage_check->l_type = F_WRLCK;
@@ -2639,7 +2639,7 @@ static int zend_accel_init_shm(void)
accel_shared_globals = zend_shared_alloc(sizeof(zend_accel_shared_globals) + sizeof(uint32_t));
}
if (!accel_shared_globals) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
zend_shared_alloc_unlock();
return FAILURE;
}
@@ -2981,7 +2981,7 @@ static zend_result accel_post_startup(void)
page_size = getpagesize();
# endif
if (!page_size || (page_size & (page_size - 1))) {
- zend_accel_error(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can't get page size.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can't get page size.");
abort();
}
jit_size = JIT_G(buffer_size);
@@ -3001,7 +3001,7 @@ static zend_result accel_post_startup(void)
break;
case ALLOC_FAILURE:
accel_startup_ok = 0;
- zend_accel_error(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - probably not enough shared memory.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - probably not enough shared memory.");
return SUCCESS;
case SUCCESSFULLY_REATTACHED:
#if defined(HAVE_JIT) && !defined(ZEND_WIN32)
@@ -3014,7 +3014,7 @@ static zend_result accel_post_startup(void)
break;
case FAILED_REATTACHED:
accel_startup_ok = 0;
- zend_accel_error(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can not reattach to exiting shared memory.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can not reattach to exiting shared memory.");
return SUCCESS;
break;
#if ENABLE_FILE_CACHE_FALLBACK
@@ -3054,7 +3054,7 @@ static zend_result accel_post_startup(void)
SHM_PROTECT();
} else if (!ZCG(accel_directives).file_cache) {
accel_startup_ok = 0;
- zend_accel_error(ACCEL_LOG_FATAL, "opcache.file_cache_only is set without a proper setting of opcache.file_cache");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "opcache.file_cache_only is set without a proper setting of opcache.file_cache");
return SUCCESS;
} else {
accel_shared_globals = calloc(1, sizeof(zend_accel_shared_globals));
@@ -4216,7 +4216,7 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
uint32_t checkpoint;
if (zend_accel_hash_is_full(&ZCSG(hash))) {
- zend_accel_error(ACCEL_LOG_FATAL, "Not enough entries in hash table for preloading. Consider increasing the value for the opcache.max_accelerated_files directive in php.ini.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Not enough entries in hash table for preloading. Consider increasing the value for the opcache.max_accelerated_files directive in php.ini.");
return NULL;
}
@@ -4268,7 +4268,7 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s
}
#endif
if (!ZCG(mem)) {
- zend_accel_error(ACCEL_LOG_FATAL, "Not enough shared memory for preloading. Consider increasing the value for the opcache.memory_consumption directive in php.ini.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Not enough shared memory for preloading. Consider increasing the value for the opcache.memory_consumption directive in php.ini.");
return NULL;
}
@@ -4590,7 +4590,7 @@ static int accel_preload(const char *config, zend_bool in_child)
CG(map_ptr_last) = orig_map_ptr_last;
if (EG(full_tables_cleanup)) {
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading is not compatible with dl() function.");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading is not compatible with dl() function.");
ret = FAILURE;
goto finish;
}
@@ -4673,7 +4673,7 @@ static int accel_preload(const char *config, zend_bool in_child)
zend_hash_sort_ex(&script->script.class_table, preload_sort_classes, NULL, 0);
if (preload_optimize(script) != SUCCESS) {
- zend_accel_error(ACCEL_LOG_FATAL, "Optimization error during preloading!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Optimization error during preloading!");
return FAILURE;
}
@@ -4772,7 +4772,7 @@ static int accel_finish_startup(void)
if (ZCG(accel_directives).preload && *ZCG(accel_directives).preload) {
#ifdef ZEND_WIN32
- zend_accel_error(ACCEL_LOG_ERROR, "Preloading is not supported on Windows");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Preloading is not supported on Windows");
return FAILURE;
#else
int in_child = 0;
@@ -4815,21 +4815,21 @@ static int accel_finish_startup(void)
if (!ZCG(accel_directives).preload_user
|| !*ZCG(accel_directives).preload_user) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "\"opcache.preload_user\" has not been defined");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "\"opcache.preload_user\" has not been defined");
return FAILURE;
}
pw = getpwnam(ZCG(accel_directives).preload_user);
if (pw == NULL) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading failed to getpwnam(\"%s\")", ZCG(accel_directives).preload_user);
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading failed to getpwnam(\"%s\")", ZCG(accel_directives).preload_user);
return FAILURE;
}
pid = fork();
if (pid == -1) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading failed to fork()");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading failed to fork()");
return FAILURE;
} else if (pid == 0) { /* children */
if (setgid(pw->pw_gid) < 0) {
@@ -4850,7 +4850,7 @@ static int accel_finish_startup(void)
if (waitpid(pid, &status, 0) < 0) {
zend_shared_alloc_unlock();
- zend_accel_error(ACCEL_LOG_FATAL, "Preloading failed to waitpid(%d)", pid);
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Preloading failed to waitpid(%d)", pid);
return FAILURE;
}
diff --git a/ext/opcache/tests/bug65915.phpt b/ext/opcache/tests/bug65915.phpt
index c616c4fb5f..b62dbd8ea7 100644
--- a/ext/opcache/tests/bug65915.phpt
+++ b/ext/opcache/tests/bug65915.phpt
@@ -5,7 +5,11 @@ opcache.enable=1
opcache.enable_cli=1
opcache.file_cache_only=0
--SKIPIF--
-<?php require_once('skipif.inc'); ?>
+<?php
+require_once('skipif.inc');
+// We don't invalidate the file after the second write.
+if (getenv('SKIP_REPEAT')) die("skip Not repeatable");
+?>
--FILE--
<?php
$tmp = __DIR__ . "/bug65915.inc.php";
diff --git a/ext/opcache/tests/zzz_basic_logging.phpt b/ext/opcache/tests/zzz_basic_logging.phpt
index bf04b50861..0fbf308a51 100644
--- a/ext/opcache/tests/zzz_basic_logging.phpt
+++ b/ext/opcache/tests/zzz_basic_logging.phpt
@@ -12,7 +12,11 @@ opcache.log_verbosity_level=4
opcache.huge_code_pages=0
opcache.preload=
--SKIPIF--
-<?php require_once('skipif.inc'); ?>
+<?php
+require_once('skipif.inc');
+// Prints "Debug Restarting!" message on next request.
+if (getenv('SKIP_REPEAT')) die("skip Not repeatable");
+?>
--FILE--
<?php
echo "Foo Bar\n";
diff --git a/ext/opcache/zend_accelerator_blacklist.c b/ext/opcache/zend_accelerator_blacklist.c
index 9ae897b521..45ad0b2685 100644
--- a/ext/opcache/zend_accelerator_blacklist.c
+++ b/ext/opcache/zend_accelerator_blacklist.c
@@ -60,7 +60,7 @@ void zend_accel_blacklist_init(zend_blacklist *blacklist)
blacklist->entries = (zend_blacklist_entry *) calloc(sizeof(zend_blacklist_entry), blacklist->size);
if (!blacklist->entries) {
- zend_accel_error(ACCEL_LOG_FATAL, "Blacklist initialization: no memory\n");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Blacklist initialization: no memory\n");
return;
}
blacklist->regexp_list = NULL;
@@ -68,7 +68,7 @@ void zend_accel_blacklist_init(zend_blacklist *blacklist)
static void blacklist_report_regexp_error(const char *pcre_error, int pcre_error_offset)
{
- zend_accel_error(ACCEL_LOG_ERROR, "Blacklist compilation failed (offset: %d), %s\n", pcre_error_offset, pcre_error);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Blacklist compilation failed (offset: %d), %s\n", pcre_error_offset, pcre_error);
}
static void zend_accel_blacklist_update_regexp(zend_blacklist *blacklist)
@@ -163,7 +163,7 @@ static void zend_accel_blacklist_update_regexp(zend_blacklist *blacklist)
if (*c || i == blacklist->pos - 1) {
if (*c) {
if (!backtrack) {
- zend_accel_error(ACCEL_LOG_ERROR, "Too long blacklist entry\n");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Too long blacklist entry\n");
}
p = backtrack;
} else {
@@ -173,7 +173,7 @@ static void zend_accel_blacklist_update_regexp(zend_blacklist *blacklist)
it = (zend_regexp_list*)malloc(sizeof(zend_regexp_list));
if (!it) {
- zend_accel_error(ACCEL_LOG_ERROR, "malloc() failed\n");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "malloc() failed\n");
return;
}
it->next = NULL;
@@ -302,7 +302,7 @@ static void zend_accel_blacklist_loadone(zend_blacklist *blacklist, char *filena
blacklist->entries[blacklist->pos].path_length = path_length;
blacklist->entries[blacklist->pos].path = (char *)malloc(path_length + 1);
if (!blacklist->entries[blacklist->pos].path) {
- zend_accel_error(ACCEL_LOG_ERROR, "malloc() failed\n");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "malloc() failed\n");
fclose(fp);
return;
}
diff --git a/ext/opcache/zend_accelerator_debug.c b/ext/opcache/zend_accelerator_debug.c
index f91c269975..a3db2a7215 100644
--- a/ext/opcache/zend_accelerator_debug.c
+++ b/ext/opcache/zend_accelerator_debug.c
@@ -28,9 +28,8 @@
#endif
#include "ZendAccelerator.h"
-void zend_accel_error(int type, const char *format, ...)
+static void zend_accel_error_va_args(int type, const char *format, va_list args)
{
- va_list args;
time_t timestamp;
char *time_string;
FILE * fLog = NULL;
@@ -77,9 +76,7 @@ void zend_accel_error(int type, const char *format, ...)
break;
}
- va_start(args, format);
vfprintf(fLog, format, args);
- va_end(args);
fprintf(fLog, "\n");
fflush(fLog);
@@ -98,3 +95,22 @@ void zend_accel_error(int type, const char *format, ...)
}
}
+
+void zend_accel_error(int type, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ zend_accel_error_va_args(type, format, args);
+ va_end(args);
+}
+
+ZEND_NORETURN void zend_accel_error_noreturn(int type, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ ZEND_ASSERT(type == ACCEL_LOG_FATAL || type == ACCEL_LOG_ERROR);
+ zend_accel_error_va_args(type, format, args);
+ va_end(args);
+ /* Should never reach this. */
+ abort();
+}
diff --git a/ext/opcache/zend_accelerator_debug.h b/ext/opcache/zend_accelerator_debug.h
index 234d0367de..61456096d1 100644
--- a/ext/opcache/zend_accelerator_debug.h
+++ b/ext/opcache/zend_accelerator_debug.h
@@ -29,5 +29,6 @@
#define ACCEL_LOG_DEBUG 4
void zend_accel_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
+ZEND_NORETURN void zend_accel_error_noreturn(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
#endif /* _ZEND_ACCELERATOR_DEBUG_H */
diff --git a/ext/opcache/zend_accelerator_hash.c b/ext/opcache/zend_accelerator_hash.c
index 7cd9ef1ef4..b0293ae8f2 100644
--- a/ext/opcache/zend_accelerator_hash.c
+++ b/ext/opcache/zend_accelerator_hash.c
@@ -54,14 +54,14 @@ void zend_accel_hash_init(zend_accel_hash *accel_hash, uint32_t hash_size)
/* set up hash pointers table */
accel_hash->hash_table = zend_shared_alloc(sizeof(zend_accel_hash_entry *)*accel_hash->max_num_entries);
if (!accel_hash->hash_table) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return;
}
/* set up hash values table */
accel_hash->hash_entries = zend_shared_alloc(sizeof(zend_accel_hash_entry)*accel_hash->max_num_entries);
if (!accel_hash->hash_entries) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return;
}
memset(accel_hash->hash_table, 0, sizeof(zend_accel_hash_entry *)*accel_hash->max_num_entries);
diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c
index d32a70b7e8..f4cb4f55af 100644
--- a/ext/opcache/zend_shared_alloc.c
+++ b/ext/opcache/zend_shared_alloc.c
@@ -86,7 +86,7 @@ void zend_shared_alloc_create_lock(char *lockfile_path)
fchmod(lock_file, 0666);
if (lock_file == -1) {
- zend_accel_error(ACCEL_LOG_FATAL, "Unable to create lock file: %s (%d)", strerror(errno), errno);
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Unable to create lock file: %s (%d)", strerror(errno), errno);
}
val = fcntl(lock_file, F_GETFD, 0);
val |= FD_CLOEXEC;
@@ -98,7 +98,7 @@ void zend_shared_alloc_create_lock(char *lockfile_path)
static void no_memory_bailout(size_t allocate_size, char *error)
{
- zend_accel_error(ACCEL_LOG_FATAL, "Unable to allocate shared memory segment of %zu bytes: %s: %s (%d)", allocate_size, error?error:"unknown", strerror(errno), errno );
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Unable to allocate shared memory segment of %zu bytes: %s: %s (%d)", allocate_size, error?error:"unknown", strerror(errno), errno );
}
static void copy_shared_segments(void *to, void *from, int count, int size)
@@ -231,14 +231,14 @@ int zend_shared_alloc_startup(size_t requested_size, size_t reserved_size)
p_tmp_shared_globals = (zend_smm_shared_globals *) zend_shared_alloc(sizeof(zend_smm_shared_globals));
if (!p_tmp_shared_globals) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
memset(p_tmp_shared_globals, 0, sizeof(zend_smm_shared_globals));
tmp_shared_segments = zend_shared_alloc(shared_segments_array_size + ZSMMG(shared_segments_count) * sizeof(void *));
if (!tmp_shared_segments) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
@@ -252,7 +252,7 @@ int zend_shared_alloc_startup(size_t requested_size, size_t reserved_size)
ZSMMG(shared_memory_state).positions = (int *)zend_shared_alloc(sizeof(int) * ZSMMG(shared_segments_count));
if (!ZSMMG(shared_memory_state).positions) {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
@@ -263,7 +263,7 @@ int zend_shared_alloc_startup(size_t requested_size, size_t reserved_size)
ZSMMG(reserved) = (char*)ZSMMG(shared_segments)[i]->p + ZSMMG(shared_segments)[i]->end;
ZSMMG(reserved_size) = reserved_size;
} else {
- zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!");
+ zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!");
return ALLOC_FAILURE;
}
}
@@ -340,7 +340,7 @@ void *zend_shared_alloc(size_t size)
#if 1
if (!ZCG(locked)) {
- zend_accel_error(ACCEL_LOG_ERROR, "Shared memory lock not obtained");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Shared memory lock not obtained");
}
#endif
if (block_size > ZSMMG(shared_free)) { /* No hope to find a big-enough block */
@@ -482,7 +482,7 @@ void zend_shared_alloc_lock(void)
if (errno == EINTR) {
continue;
}
- zend_accel_error(ACCEL_LOG_ERROR, "Cannot create lock - %s (%d)", strerror(errno), errno);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Cannot create lock - %s (%d)", strerror(errno), errno);
}
break;
}
@@ -508,7 +508,7 @@ void zend_shared_alloc_unlock(void)
#ifndef ZEND_WIN32
if (fcntl(lock_file, F_SETLK, &mem_write_unlock) == -1) {
- zend_accel_error(ACCEL_LOG_ERROR, "Cannot remove lock - %s (%d)", strerror(errno), errno);
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Cannot remove lock - %s (%d)", strerror(errno), errno);
}
#ifdef ZTS
tsrm_mutex_unlock(zts_lock);
@@ -631,7 +631,7 @@ void zend_accel_shared_protect(int mode)
for (i = 0; i < ZSMMG(shared_segments_count); i++) {
DWORD oldProtect;
if (!VirtualProtect(ZSMMG(shared_segments)[i]->p, ZSMMG(shared_segments)[i]->end, mode, &oldProtect)) {
- zend_accel_error(ACCEL_LOG_ERROR, "Failed to protect memory");
+ zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Failed to protect memory");
}
}
#endif
diff --git a/ext/openssl/config0.m4 b/ext/openssl/config0.m4
index 9df2469363..e08a76897a 100644
--- a/ext/openssl/config0.m4
+++ b/ext/openssl/config0.m4
@@ -1,7 +1,7 @@
PHP_ARG_WITH([openssl],
[for OpenSSL support],
[AS_HELP_STRING([--with-openssl],
- [Include OpenSSL support (requires OpenSSL >= 1.0.1)])])
+ [Include OpenSSL support (requires OpenSSL >= 1.0.2)])])
PHP_ARG_WITH([kerberos],
[for Kerberos support],
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index 18c822ed67..113d0c2ec4 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -1149,13 +1149,6 @@ PHP_MINIT_FUNCTION(openssl)
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();
OpenSSL_add_all_algorithms();
-
-#if !defined(OPENSSL_NO_AES) && defined(EVP_CIPH_CCM_MODE) && OPENSSL_VERSION_NUMBER < 0x100020000
- EVP_add_cipher(EVP_aes_128_ccm());
- EVP_add_cipher(EVP_aes_192_ccm());
- EVP_add_cipher(EVP_aes_256_ccm());
-#endif
-
SSL_load_error_strings();
#else
OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, NULL);
@@ -3671,26 +3664,18 @@ static EVP_PKEY * php_openssl_generate_private_key(struct php_x509_request * req
case OPENSSL_KEYTYPE_RSA:
{
RSA* rsaparam;
-#if OPENSSL_VERSION_NUMBER < 0x10002000L
- /* OpenSSL 1.0.2 deprecates RSA_generate_key */
- PHP_OPENSSL_RAND_ADD_TIME();
- rsaparam = (RSA*)RSA_generate_key(req->priv_key_bits, RSA_F4, NULL, NULL);
-#else
- {
- BIGNUM *bne = (BIGNUM *)BN_new();
- if (BN_set_word(bne, RSA_F4) != 1) {
- BN_free(bne);
- php_error_docref(NULL, E_WARNING, "Failed setting exponent");
- return NULL;
- }
- rsaparam = RSA_new();
- PHP_OPENSSL_RAND_ADD_TIME();
- if (rsaparam == NULL || !RSA_generate_key_ex(rsaparam, req->priv_key_bits, bne, NULL)) {
- php_openssl_store_errors();
- }
+ BIGNUM *bne = (BIGNUM *)BN_new();
+ if (BN_set_word(bne, RSA_F4) != 1) {
BN_free(bne);
+ php_error_docref(NULL, E_WARNING, "Failed setting exponent");
+ return NULL;
}
-#endif
+ rsaparam = RSA_new();
+ PHP_OPENSSL_RAND_ADD_TIME();
+ if (rsaparam == NULL || !RSA_generate_key_ex(rsaparam, req->priv_key_bits, bne, NULL)) {
+ php_openssl_store_errors();
+ }
+ BN_free(bne);
if (rsaparam && EVP_PKEY_assign_RSA(req->priv_key, rsaparam)) {
return_val = req->priv_key;
} else {
diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h
index c674ead34b..838832388c 100644
--- a/ext/openssl/php_openssl.h
+++ b/ext/openssl/php_openssl.h
@@ -35,9 +35,7 @@ extern zend_module_entry openssl_module_entry;
#endif
#else
/* OpenSSL version check */
-#if OPENSSL_VERSION_NUMBER < 0x10002000L
-#define PHP_OPENSSL_API_VERSION 0x10001
-#elif OPENSSL_VERSION_NUMBER < 0x10100000L
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
#define PHP_OPENSSL_API_VERSION 0x10002
#else
#define PHP_OPENSSL_API_VERSION 0x10100
diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
index feb9ee52c1..6fdbf1df16 100644
--- a/ext/openssl/xp_ssl.c
+++ b/ext/openssl/xp_ssl.c
@@ -33,11 +33,8 @@
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#include <openssl/err.h>
-
-#if OPENSSL_VERSION_NUMBER >= 0x10002000L
#include <openssl/bn.h>
#include <openssl/dh.h>
-#endif
#ifdef PHP_WIN32
#include "win32/winutil.h"
@@ -80,10 +77,8 @@
#ifndef OPENSSL_NO_TLSEXT
#define HAVE_TLS_SNI 1
-#if OPENSSL_VERSION_NUMBER >= 0x10002000L
#define HAVE_TLS_ALPN 1
#endif
-#endif
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
#define HAVE_SEC_LEVEL 1
@@ -1294,12 +1289,8 @@ static int php_openssl_set_server_ecdh_curve(php_stream *stream, SSL_CTX *ctx) /
zvcurve = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "ssl", "ecdh_curve");
if (zvcurve == NULL) {
-#if OPENSSL_VERSION_NUMBER >= 0x10002000L
SSL_CTX_set_ecdh_auto(ctx, 1);
return SUCCESS;
-#else
- curve_nid = NID_X9_62_prime256v1;
-#endif
} else {
if (!try_convert_to_string(zvcurve)) {
return FAILURE;
diff --git a/ext/pcntl/tests/002.phpt b/ext/pcntl/tests/002.phpt
index 68b2643092..254da86136 100644
--- a/ext/pcntl/tests/002.phpt
+++ b/ext/pcntl/tests/002.phpt
@@ -7,6 +7,7 @@ pcntl: pcntl_sigprocmask(), pcntl_sigwaitinfo(), pcntl_sigtimedwait()
elseif (!function_exists('pcntl_sigwaitinfo') or !function_exists('pcntl_sigtimedwait')) die('skip required functionality is not available');
elseif (!defined('CLD_EXITED')) die('skip CLD_EXITED not defined');
elseif (getenv('SKIP_ASAN')) die('skip Fails intermittently under asan/msan');
+ elseif (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pcntl/tests/pcntl_unshare_01.phpt b/ext/pcntl/tests/pcntl_unshare_01.phpt
index fcbf112e4d..6eb5a20bdd 100644
--- a/ext/pcntl/tests/pcntl_unshare_01.phpt
+++ b/ext/pcntl/tests/pcntl_unshare_01.phpt
@@ -9,6 +9,7 @@ if (!defined("CLONE_NEWUSER")) die("skip flag unavailable");
if (@pcntl_unshare(CLONE_NEWUSER) == false && pcntl_get_last_error() == PCNTL_EPERM) {
die("skip Insufficient privileges to use CLONE_NEWUSER");
}
+if (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pcntl/tests/pcntl_unshare_02.phpt b/ext/pcntl/tests/pcntl_unshare_02.phpt
index fdf07bc81c..3e90a3920c 100644
--- a/ext/pcntl/tests/pcntl_unshare_02.phpt
+++ b/ext/pcntl/tests/pcntl_unshare_02.phpt
@@ -15,6 +15,7 @@ if (posix_getuid() !== 0 &&
if (@pcntl_unshare(CLONE_NEWPID) == false && pcntl_get_last_error() == PCNTL_EPERM) {
die("skip Insufficient privileges for CLONE_NEWPID");
}
+if (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pcntl/tests/pcntl_unshare_03.phpt b/ext/pcntl/tests/pcntl_unshare_03.phpt
index f82f27b719..8e9bd793e6 100644
--- a/ext/pcntl/tests/pcntl_unshare_03.phpt
+++ b/ext/pcntl/tests/pcntl_unshare_03.phpt
@@ -15,6 +15,7 @@ if (@pcntl_unshare(CLONE_NEWNET) == false && pcntl_get_last_error() == PCNTL_EPE
die("skip Insufficient privileges for CLONE_NEWPID");
}
if (getenv("SKIP_ONLINE_TESTS")) die("skip online test");
+if (getenv("SKIP_REPEAT")) die("skip cannot be repeated");
?>
--FILE--
<?php
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 8917b9b0dc..00d20778e9 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -1293,8 +1293,12 @@ static int dbh_compare(zval *object1, zval *object2)
static HashTable *dbh_get_gc(zend_object *object, zval **gc_data, int *gc_count)
{
pdo_dbh_t *dbh = php_pdo_dbh_fetch_inner(object);
- *gc_data = &dbh->def_stmt_ctor_args;
- *gc_count = 1;
+ zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create();
+ zend_get_gc_buffer_add_zval(gc_buffer, &dbh->def_stmt_ctor_args);
+ if (dbh->methods && dbh->methods->get_gc) {
+ dbh->methods->get_gc(dbh, gc_buffer);
+ }
+ zend_get_gc_buffer_use(gc_buffer, gc_data, gc_count);
return zend_std_get_properties(object);
}
diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h
index 960ddec4ef..974eb0bad0 100644
--- a/ext/pdo/php_pdo_driver.h
+++ b/ext/pdo/php_pdo_driver.h
@@ -286,6 +286,10 @@ typedef int (*pdo_dbh_check_liveness_func)(pdo_dbh_t *dbh);
* scope */
typedef void (*pdo_dbh_request_shutdown)(pdo_dbh_t *dbh);
+/* Called when the PDO handle is scanned for GC. Should populate the get_gc buffer
+ * with any zvals in the driver_data that would be freed if the handle is destroyed. */
+typedef void (*pdo_dbh_get_gc_func)(pdo_dbh_t *dbh, zend_get_gc_buffer *buffer);
+
/* for adding methods to the dbh or stmt objects
pointer to a list of driver specific functions. The convention is
to prefix the function names using the PDO driver name; this will
@@ -316,6 +320,7 @@ struct pdo_dbh_methods {
pdo_dbh_get_driver_methods_func get_driver_methods;
pdo_dbh_request_shutdown persistent_shutdown;
pdo_dbh_txn_func in_transaction;
+ pdo_dbh_get_gc_func get_gc;
};
/* }}} */
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c
index 7f160a402f..e581642037 100644
--- a/ext/pdo_dblib/dblib_driver.c
+++ b/ext/pdo_dblib/dblib_driver.c
@@ -417,7 +417,8 @@ static const struct pdo_dbh_methods dblib_methods = {
NULL, /* check liveness */
NULL, /* get driver methods */
NULL, /* request shutdown */
- NULL /* in transaction */
+ NULL, /* in transaction */
+ NULL /* get gc */
};
static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c
index c27a9e2ed5..c299907f0f 100644
--- a/ext/pdo_firebird/firebird_driver.c
+++ b/ext/pdo_firebird/firebird_driver.c
@@ -1005,7 +1005,11 @@ static const struct pdo_dbh_methods firebird_methods = { /* {{{ */
NULL, /* last_id not supported */
pdo_firebird_fetch_error_func,
firebird_handle_get_attribute,
- NULL /* check_liveness */
+ NULL, /* check_liveness */
+ NULL, /* get driver methods */
+ NULL, /* request shutdown */
+ NULL, /* in transaction */
+ NULL /* get gc */
};
/* }}} */
diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c
index 641a9add1a..a83b12b872 100644
--- a/ext/pdo_mysql/mysql_driver.c
+++ b/ext/pdo_mysql/mysql_driver.c
@@ -577,7 +577,8 @@ static const struct pdo_dbh_methods mysql_methods = {
pdo_mysql_check_liveness,
NULL,
pdo_mysql_request_shutdown,
- pdo_mysql_in_transaction
+ pdo_mysql_in_transaction,
+ NULL /* get_gc */
};
/* }}} */
diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c
index 096a26575e..2c65fc973b 100644
--- a/ext/pdo_oci/oci_driver.c
+++ b/ext/pdo_oci/oci_driver.c
@@ -705,9 +705,10 @@ static const struct pdo_dbh_methods oci_methods = {
pdo_oci_fetch_error_func,
oci_handle_get_attribute,
pdo_oci_check_liveness, /* check_liveness */
- NULL, /* get_driver_methods */
- NULL,
- NULL
+ NULL, /* get_driver_methods */
+ NULL, /* request_shutdown */
+ NULL, /* in_transaction */
+ NULL /* get_gc */
};
static int pdo_oci_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */
diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c
index 9a254553d5..81e4915da5 100644
--- a/ext/pdo_odbc/odbc_driver.c
+++ b/ext/pdo_odbc/odbc_driver.c
@@ -384,7 +384,11 @@ static const struct pdo_dbh_methods odbc_methods = {
NULL, /* last id */
pdo_odbc_fetch_error_func,
odbc_handle_get_attr, /* get attr */
- NULL, /* check_liveness */
+ NULL, /* check_liveness */
+ NULL, /* get_driver_methods */
+ NULL, /* request_shutdown */
+ NULL, /* in_transaction */
+ NULL /* get_gc */
};
static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c
index d800d65a2d..37680b8efa 100644
--- a/ext/pdo_pgsql/pgsql_driver.c
+++ b/ext/pdo_pgsql/pgsql_driver.c
@@ -1179,6 +1179,7 @@ static const struct pdo_dbh_methods pgsql_methods = {
pdo_pgsql_get_driver_methods, /* get_driver_methods */
NULL,
pgsql_handle_in_transaction,
+ NULL /* get_gc */
};
static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */
diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c
index 26fa1c00eb..a8a96c7a13 100644
--- a/ext/pdo_sqlite/sqlite_driver.c
+++ b/ext/pdo_sqlite/sqlite_driver.c
@@ -695,6 +695,25 @@ static void pdo_sqlite_request_shutdown(pdo_dbh_t *dbh)
}
}
+static void pdo_sqlite_get_gc(pdo_dbh_t *dbh, zend_get_gc_buffer *gc_buffer)
+{
+ pdo_sqlite_db_handle *H = dbh->driver_data;
+
+ struct pdo_sqlite_func *func = H->funcs;
+ while (func) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &func->func);
+ zend_get_gc_buffer_add_zval(gc_buffer, &func->step);
+ zend_get_gc_buffer_add_zval(gc_buffer, &func->fini);
+ func = func->next;
+ }
+
+ struct pdo_sqlite_collation *collation = H->collations;
+ while (collation) {
+ zend_get_gc_buffer_add_zval(gc_buffer, &collation->callback);
+ collation = collation->next;
+ }
+}
+
static const struct pdo_dbh_methods sqlite_methods = {
sqlite_handle_closer,
sqlite_handle_preparer,
@@ -710,7 +729,8 @@ static const struct pdo_dbh_methods sqlite_methods = {
NULL, /* check_liveness: not needed */
get_driver_methods,
pdo_sqlite_request_shutdown,
- NULL
+ NULL, /* in_transaction */
+ pdo_sqlite_get_gc
};
static char *make_filename_safe(const char *filename)
diff --git a/ext/pdo_sqlite/tests/gc.phpt b/ext/pdo_sqlite/tests/gc.phpt
new file mode 100644
index 0000000000..25407697e6
--- /dev/null
+++ b/ext/pdo_sqlite/tests/gc.phpt
@@ -0,0 +1,24 @@
+--TEST--
+GC support for PDO Sqlite driver data
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_sqlite')) print 'skip not loaded';
+?>
+--FILE--
+<?php
+
+class Obj {
+ public $a;
+ public function callback() { }
+}
+
+$obj = new Obj;
+$obj->a = new PDO('sqlite::memory:');
+$obj->a->sqliteCreateFunction('func1', function() use ($obj) {}, 1);
+$obj->a->sqliteCreateAggregate('func2', function() use ($obj) {}, function() use($obj) {});
+$obj->a->sqliteCreateCollation('col', function() use ($obj) {});
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/ext/pgsql/tests/skipif.inc b/ext/pgsql/tests/skipif.inc
index 38c2888afa..92712f3e05 100644
--- a/ext/pgsql/tests/skipif.inc
+++ b/ext/pgsql/tests/skipif.inc
@@ -12,6 +12,11 @@ include("lcmess.inc");
if (!extension_loaded("pgsql")) {
die("skip pgsql extension not loaded\n");
}
+if (getenv("SKIP_REPEAT")) {
+ // pgsql tests are order-dependent.
+ // We should probably change that, but in the meantime do not allow repetition.
+ die("skip Cannot repeat pgsql tests");
+}
$conn = @pg_connect($conn_str);
if (!is_resource($conn)) {
die("skip could not connect\n");
diff --git a/ext/pspell/pspell.c b/ext/pspell/pspell.c
index 63732b77b0..4253f5f159 100644
--- a/ext/pspell/pspell.c
+++ b/ext/pspell/pspell.c
@@ -19,6 +19,7 @@
#endif
#include "php.h"
+#include "zend_interfaces.h"
#include <stdlib.h>
#include <ctype.h>
@@ -48,58 +49,139 @@
static PHP_MINIT_FUNCTION(pspell);
static PHP_MINFO_FUNCTION(pspell);
-static int le_pspell, le_pspell_config;
+static zend_class_entry *php_pspell_ce = NULL;
+static zend_object_handlers php_pspell_handlers;
+static zend_class_entry *php_pspell_config_ce = NULL;
+static zend_object_handlers php_pspell_config_handlers;
zend_module_entry pspell_module_entry = {
STANDARD_MODULE_HEADER,
- "pspell", ext_functions, PHP_MINIT(pspell), NULL, NULL, NULL, PHP_MINFO(pspell), PHP_PSPELL_VERSION, STANDARD_MODULE_PROPERTIES
+ "pspell",
+ ext_functions,
+ PHP_MINIT(pspell),
+ NULL,
+ NULL,
+ NULL,
+ PHP_MINFO(pspell),
+ PHP_PSPELL_VERSION,
+ STANDARD_MODULE_PROPERTIES,
};
#ifdef COMPILE_DL_PSPELL
ZEND_GET_MODULE(pspell)
#endif
-static void php_pspell_close(zend_resource *rsrc)
+/* class PSpell */
+
+typedef struct _php_pspell_object {
+ PspellManager *mgr;
+ zend_object std;
+} php_pspell_object;
+
+static php_pspell_object *php_pspell_object_from_zend_object(zend_object *zobj) {
+ return ((php_pspell_object*)(zobj + 1)) - 1;
+}
+
+static zend_object *php_pspell_object_to_zend_object(php_pspell_object *obj) {
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static zend_function *php_pspell_object_get_constructor(zend_object *object)
{
- PspellManager *manager = (PspellManager *)rsrc->ptr;
+ zend_throw_error(NULL, "You cannot initialize a PSpell object except through helper functions");
+ return NULL;
+}
+
+static zend_object *php_pspell_object_create(zend_class_entry *ce)
+{
+ php_pspell_object *obj = zend_object_alloc(sizeof(php_pspell_object), ce);
+ zend_object *zobj = php_pspell_object_to_zend_object(obj);
+
+ obj->mgr = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &php_pspell_handlers;
+
+ return zobj;
+}
+
+static void php_pspell_object_free(zend_object *zobj) {
+ delete_pspell_manager(php_pspell_object_from_zend_object(zobj)->mgr);
+}
- delete_pspell_manager(manager);
+/* class PSpellConfig */
+
+typedef struct _php_pspell_config_object {
+ PspellConfig *cfg;
+ zend_object std;
+} php_pspell_config_object;
+
+static php_pspell_config_object *php_pspell_config_object_from_zend_object(zend_object *zobj) {
+ return ((php_pspell_config_object*)(zobj + 1)) - 1;
}
-static void php_pspell_close_config(zend_resource *rsrc)
+static zend_object *php_pspell_config_object_to_zend_object(php_pspell_config_object *obj) {
+ return ((zend_object*)(obj + 1)) - 1;
+}
+
+static zend_function *php_pspell_config_object_get_constructor(zend_object *object)
{
- PspellConfig *config = (PspellConfig *)rsrc->ptr;
+ zend_throw_error(NULL, "You cannot initialize a PSpellConfig object except through helper functions");
+ return NULL;
+}
- delete_pspell_config(config);
+static zend_object *php_pspell_config_object_create(zend_class_entry *ce)
+{
+ php_pspell_config_object *obj = zend_object_alloc(sizeof(php_pspell_config_object), ce);
+ zend_object *zobj = php_pspell_config_object_to_zend_object(obj);
+
+ obj->cfg = NULL;
+ zend_object_std_init(zobj, ce);
+ object_properties_init(zobj, ce);
+ zobj->handlers = &php_pspell_config_handlers;
+
+ return zobj;
}
-#define PSPELL_FETCH_CONFIG do { \
- zval *res = zend_hash_index_find(&EG(regular_list), conf); \
- if (res == NULL || Z_RES_P(res)->type != le_pspell_config) { \
- zend_throw_error(NULL, "%s(): " ZEND_LONG_FMT " is not a PSPELL config index", get_active_function_name(), conf); \
- RETURN_THROWS(); \
- } \
- config = (PspellConfig *)Z_RES_P(res)->ptr; \
-} while (0)
-
-#define PSPELL_FETCH_MANAGER do { \
- zval *res = zend_hash_index_find(&EG(regular_list), scin); \
- if (res == NULL || Z_RES_P(res)->type != le_pspell) { \
- zend_throw_error(NULL, "%s(): " ZEND_LONG_FMT " is not a PSPELL result index", get_active_function_name(), scin); \
- RETURN_THROWS(); \
- } \
- manager = (PspellManager *)Z_RES_P(res)->ptr; \
-} while (0);
+static void php_pspell_config_object_free(zend_object *zobj) {
+ delete_pspell_config(php_pspell_config_object_from_zend_object(zobj)->cfg);
+}
/* {{{ PHP_MINIT_FUNCTION */
static PHP_MINIT_FUNCTION(pspell)
{
+ zend_class_entry ce;
+ INIT_CLASS_ENTRY(ce, "PSpell", class_PSpell_methods);
+ php_pspell_ce = zend_register_internal_class(&ce);
+ php_pspell_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ php_pspell_ce->create_object = php_pspell_object_create;
+ php_pspell_ce->serialize = zend_class_serialize_deny;
+ php_pspell_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&php_pspell_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ php_pspell_handlers.clone_obj = NULL;
+ php_pspell_handlers.free_obj = php_pspell_object_free;
+ php_pspell_handlers.get_constructor = php_pspell_object_get_constructor;
+ php_pspell_handlers.offset = XtOffsetOf(php_pspell_object, std);
+
+ INIT_CLASS_ENTRY(ce, "PSpellConfig", class_PSpellConfig_methods);
+ php_pspell_config_ce = zend_register_internal_class(&ce);
+ php_pspell_config_ce->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+ php_pspell_config_ce->create_object = php_pspell_config_object_create;
+ php_pspell_config_ce->serialize = zend_class_serialize_deny;
+ php_pspell_config_ce->unserialize = zend_class_unserialize_deny;
+
+ memcpy(&php_pspell_config_handlers, &std_object_handlers, sizeof(zend_object_handlers));
+ php_pspell_config_handlers.clone_obj = NULL;
+ php_pspell_config_handlers.free_obj = php_pspell_config_object_free;
+ php_pspell_config_handlers.get_constructor = php_pspell_config_object_get_constructor;
+ php_pspell_config_handlers.offset = XtOffsetOf(php_pspell_config_object, std);
+
REGISTER_LONG_CONSTANT("PSPELL_FAST", PSPELL_FAST, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("PSPELL_NORMAL", PSPELL_NORMAL, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("PSPELL_BAD_SPELLERS", PSPELL_BAD_SPELLERS, CONST_PERSISTENT | CONST_CS);
REGISTER_LONG_CONSTANT("PSPELL_RUN_TOGETHER", PSPELL_RUN_TOGETHER, CONST_PERSISTENT | CONST_CS);
- le_pspell = zend_register_list_destructors_ex(php_pspell_close, NULL, "pspell", module_number);
- le_pspell_config = zend_register_list_destructors_ex(php_pspell_close_config, NULL, "pspell config", module_number);
+
return SUCCESS;
}
/* }}} */
@@ -111,7 +193,6 @@ PHP_FUNCTION(pspell_new)
size_t language_len, spelling_len = 0, jargon_len = 0, encoding_len = 0;
zend_long mode = Z_L(0), speed = Z_L(0);
int argc = ZEND_NUM_ARGS();
- zval *ind;
#ifdef PHP_WIN32
TCHAR aspell_dir[200];
@@ -122,7 +203,6 @@ PHP_FUNCTION(pspell_new)
#endif
PspellCanHaveError *ret;
- PspellManager *manager;
PspellConfig *config;
if (zend_parse_parameters(argc, "s|sssl", &language, &language_len, &spelling, &spelling_len,
@@ -194,9 +274,8 @@ PHP_FUNCTION(pspell_new)
RETURN_FALSE;
}
- manager = to_pspell_manager(ret);
- ind = zend_list_insert(manager, le_pspell);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_ce);
+ php_pspell_object_from_zend_object(Z_OBJ_P(return_value))->mgr = to_pspell_manager(ret);
}
/* }}} */
@@ -207,7 +286,6 @@ PHP_FUNCTION(pspell_new_personal)
size_t personal_len, language_len, spelling_len = 0, jargon_len = 0, encoding_len = 0;
zend_long mode = Z_L(0), speed = Z_L(0);
int argc = ZEND_NUM_ARGS();
- zval *ind;
#ifdef PHP_WIN32
TCHAR aspell_dir[200];
@@ -218,7 +296,6 @@ PHP_FUNCTION(pspell_new_personal)
#endif
PspellCanHaveError *ret;
- PspellManager *manager;
PspellConfig *config;
if (zend_parse_parameters(argc, "ps|sssl", &personal, &personal_len, &language, &language_len,
@@ -298,26 +375,22 @@ PHP_FUNCTION(pspell_new_personal)
RETURN_FALSE;
}
- manager = to_pspell_manager(ret);
- ind = zend_list_insert(manager, le_pspell);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_ce);
+ php_pspell_object_from_zend_object(Z_OBJ_P(return_value))->mgr = to_pspell_manager(ret);
}
/* }}} */
/* {{{ Load a dictionary based on the given config */
PHP_FUNCTION(pspell_new_config)
{
- zend_long conf;
- zval *ind;
+ zval *zcfg;
PspellCanHaveError *ret;
- PspellManager *manager;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &conf) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zcfg, php_pspell_config_ce) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
ret = new_pspell_manager(config);
@@ -327,27 +400,24 @@ PHP_FUNCTION(pspell_new_config)
RETURN_FALSE;
}
- manager = to_pspell_manager(ret);
- ind = zend_list_insert(manager, le_pspell);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_ce);
+ php_pspell_object_from_zend_object(Z_OBJ_P(return_value))->mgr = to_pspell_manager(ret);
}
/* }}} */
/* {{{ Returns true if word is valid */
PHP_FUNCTION(pspell_check)
{
- size_t word_len;
- zend_long scin;
- char *word;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
- PSPELL_FETCH_MANAGER;
-
- if (pspell_manager_check(manager, word)) {
+ if (pspell_manager_check(manager, ZSTR_VAL(word))) {
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -358,22 +428,20 @@ PHP_FUNCTION(pspell_check)
/* {{{ Returns array of suggestions */
PHP_FUNCTION(pspell_suggest)
{
- zend_long scin;
- char *word;
- size_t word_len;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
const PspellWordList *wl;
const char *sug;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
array_init(return_value);
- wl = pspell_manager_suggest(manager, word);
+ wl = pspell_manager_suggest(manager, ZSTR_VAL(word));
if (wl) {
PspellStringEmulation *els = pspell_word_list_elements(wl);
while ((sug = pspell_string_emulation_next(els)) != 0) {
@@ -390,18 +458,16 @@ PHP_FUNCTION(pspell_suggest)
/* {{{ Notify the dictionary of a user-selected replacement */
PHP_FUNCTION(pspell_store_replacement)
{
- size_t miss_len, corr_len;
- zend_long scin;
- char *miss, *corr;
+ zval *zmgr;
+ zend_string *miss, *corr;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lss", &scin, &miss, &miss_len, &corr, &corr_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OSS", &zmgr, php_pspell_ce, &miss, &corr) == FAILURE) {
RETURN_THROWS();
}
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
- PSPELL_FETCH_MANAGER;
-
- pspell_manager_store_replacement(manager, miss, corr);
+ pspell_manager_store_replacement(manager, ZSTR_VAL(miss), ZSTR_VAL(corr));
if (pspell_manager_error_number(manager) == 0) {
RETURN_TRUE;
} else {
@@ -414,23 +480,21 @@ PHP_FUNCTION(pspell_store_replacement)
/* {{{ Adds a word to a personal list */
PHP_FUNCTION(pspell_add_to_personal)
{
- size_t word_len;
- zend_long scin;
- char *word;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
/*If the word is empty, we have to return; otherwise we'll segfault! ouch!*/
- if (word_len == 0) {
+ if (ZSTR_LEN(word) == 0) {
RETURN_FALSE;
}
- pspell_manager_add_to_personal(manager, word);
+ pspell_manager_add_to_personal(manager, ZSTR_VAL(word));
if (pspell_manager_error_number(manager) == 0) {
RETURN_TRUE;
} else {
@@ -443,23 +507,21 @@ PHP_FUNCTION(pspell_add_to_personal)
/* {{{ Adds a word to the current session */
PHP_FUNCTION(pspell_add_to_session)
{
- size_t word_len;
- zend_long scin;
- char *word;
+ zval *zmgr;
+ zend_string *word;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ls", &scin, &word, &word_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS", &zmgr, php_pspell_ce, &word) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
/*If the word is empty, we have to return; otherwise we'll segfault! ouch!*/
- if (word_len == 0) {
+ if (ZSTR_LEN(word) == 0) {
RETURN_FALSE;
}
- pspell_manager_add_to_session(manager, word);
+ pspell_manager_add_to_session(manager, ZSTR_VAL(word));
if (pspell_manager_error_number(manager) == 0) {
RETURN_TRUE;
} else {
@@ -472,14 +534,13 @@ PHP_FUNCTION(pspell_add_to_session)
/* {{{ Clears the current session */
PHP_FUNCTION(pspell_clear_session)
{
- zend_long scin;
+ zval *zmgr;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &scin) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zmgr, php_pspell_ce) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
pspell_manager_clear_session(manager);
if (pspell_manager_error_number(manager) == 0) {
@@ -494,14 +555,13 @@ PHP_FUNCTION(pspell_clear_session)
/* {{{ Saves the current (personal) wordlist */
PHP_FUNCTION(pspell_save_wordlist)
{
- zend_long scin;
+ zval *zmgr;
PspellManager *manager;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &scin) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zmgr, php_pspell_ce) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_MANAGER;
+ manager = php_pspell_object_from_zend_object(Z_OBJ_P(zmgr))->mgr;
pspell_manager_save_all_word_lists(manager);
@@ -520,7 +580,6 @@ PHP_FUNCTION(pspell_config_create)
{
char *language, *spelling = NULL, *jargon = NULL, *encoding = NULL;
size_t language_len, spelling_len = 0, jargon_len = 0, encoding_len = 0;
- zval *ind;
PspellConfig *config;
#ifdef PHP_WIN32
@@ -577,23 +636,22 @@ PHP_FUNCTION(pspell_config_create)
which is not what we want */
pspell_config_replace(config, "save-repl", "false");
- ind = zend_list_insert(config, le_pspell_config);
- RETURN_LONG(Z_RES_HANDLE_P(ind));
+ object_init_ex(return_value, php_pspell_config_ce);
+ php_pspell_config_object_from_zend_object(Z_OBJ_P(return_value))->cfg = config;
}
/* }}} */
/* {{{ Consider run-together words as valid components */
PHP_FUNCTION(pspell_config_runtogether)
{
- zend_long conf;
+ zval *zcfg;
zend_bool runtogether;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lb", &conf, &runtogether) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &zcfg, php_pspell_config_ce, &runtogether) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
pspell_config_replace(config, "run-together", runtogether ? "true" : "false");
@@ -604,14 +662,14 @@ PHP_FUNCTION(pspell_config_runtogether)
/* {{{ Select mode for config (PSPELL_FAST, PSPELL_NORMAL or PSPELL_BAD_SPELLERS) */
PHP_FUNCTION(pspell_config_mode)
{
- zend_long conf, mode;
+ zval *zcfg;
+ zend_long mode;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &conf, &mode) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &zcfg, php_pspell_config_ce, &mode) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
/* First check what mode we want (how many suggestions) */
if (mode == PSPELL_FAST) {
@@ -630,14 +688,14 @@ PHP_FUNCTION(pspell_config_mode)
PHP_FUNCTION(pspell_config_ignore)
{
char ignore_str[MAX_LENGTH_OF_LONG + 1];
- zend_long conf, ignore = 0L;
+ zval *zcfg;
+ zend_long ignore = 0L;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &conf, &ignore) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &zcfg, php_pspell_config_ce, &ignore) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
snprintf(ignore_str, sizeof(ignore_str), ZEND_LONG_FMT, ignore);
@@ -648,22 +706,20 @@ PHP_FUNCTION(pspell_config_ignore)
static void pspell_config_path(INTERNAL_FUNCTION_PARAMETERS, char *option)
{
- zend_long conf;
- char *value;
- size_t value_len;
+ zval *zcfg;
+ zend_string *value;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lp", &conf, &value, &value_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OP", &zcfg, php_pspell_config_ce, &value) == FAILURE) {
RETURN_THROWS();
}
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
- PSPELL_FETCH_CONFIG;
-
- if (php_check_open_basedir(value)) {
+ if (php_check_open_basedir(ZSTR_VAL(value))) {
RETURN_FALSE;
}
- pspell_config_replace(config, option, value);
+ pspell_config_replace(config, option, ZSTR_VAL(value));
RETURN_TRUE;
}
@@ -692,24 +748,22 @@ PHP_FUNCTION(pspell_config_data_dir)
/* {{{ Use a personal dictionary with replacement pairs for this config */
PHP_FUNCTION(pspell_config_repl)
{
- zend_long conf;
- char *repl;
- size_t repl_len;
+ zval *zcfg;
+ zend_string *repl;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lp", &conf, &repl, &repl_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "OP", &zcfg, php_pspell_config_ce, &repl) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
pspell_config_replace(config, "save-repl", "true");
- if (php_check_open_basedir(repl)) {
+ if (php_check_open_basedir(ZSTR_VAL(repl))) {
RETURN_FALSE;
}
- pspell_config_replace(config, "repl", repl);
+ pspell_config_replace(config, "repl", ZSTR_VAL(repl));
RETURN_TRUE;
}
@@ -718,15 +772,14 @@ PHP_FUNCTION(pspell_config_repl)
/* {{{ Save replacement pairs when personal list is saved for this config */
PHP_FUNCTION(pspell_config_save_repl)
{
- zend_long conf;
+ zval *zcfg;
zend_bool save;
PspellConfig *config;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "lb", &conf, &save) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ob", &zcfg, php_pspell_config_ce, &save) == FAILURE) {
RETURN_THROWS();
}
-
- PSPELL_FETCH_CONFIG;
+ config = php_pspell_config_object_from_zend_object(Z_OBJ_P(zcfg))->cfg;
pspell_config_replace(config, "save-repl", save ? "true" : "false");
diff --git a/ext/pspell/pspell.stub.php b/ext/pspell/pspell.stub.php
index cf15fb35eb..a10de4b9f9 100644
--- a/ext/pspell/pspell.stub.php
+++ b/ext/pspell/pspell.stub.php
@@ -2,7 +2,10 @@
/** @generate-function-entries */
-function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): int|false {}
+final class PSpell {}
+final class PSpellConfig {}
+
+function pspell_new(string $language, string $spelling = "", string $jargon = "", string $encoding = "", int $mode = 0): PSpell|false {}
function pspell_new_personal(
string $filename,
@@ -11,38 +14,24 @@ function pspell_new_personal(
string $jargon = "",
string $encoding = "",
int $mode = 0
-): int|false {}
-
-function pspell_new_config(int $config): int|false {}
-
-function pspell_check(int $dictionary, string $word): bool {}
-
-function pspell_suggest(int $dictionary, string $word): array|false {}
-
-function pspell_store_replacement(int $dictionary, string $misspelled, string $correct): bool {}
-
-function pspell_add_to_personal(int $dictionary, string $word): bool {}
-
-function pspell_add_to_session(int $dictionary, string $word): bool {}
-
-function pspell_clear_session(int $dictionary): bool {}
-
-function pspell_save_wordlist(int $dictionary): bool {}
-
-function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): int {}
-
-function pspell_config_runtogether(int $config, bool $allow): bool {}
-
-function pspell_config_mode(int $config, int $mode): bool {}
-
-function pspell_config_ignore(int $config, int $min_length): bool {}
-
-function pspell_config_personal(int $config, string $filename): bool {}
-
-function pspell_config_dict_dir(int $config, string $directory): bool {}
-
-function pspell_config_data_dir(int $config, string $directory): bool {}
-
-function pspell_config_repl(int $config, string $filename): bool {}
-
-function pspell_config_save_repl(int $config, bool $save): bool {}
+): PSpell|false {}
+
+function pspell_new_config(PSpellConfig $config): PSpell|false {}
+
+function pspell_check(PSpell $dictionary, string $word): bool {}
+function pspell_suggest(PSpell $dictionary, string $word): array|false {}
+function pspell_store_replacement(PSpell $dictionary, string $misspelled, string $correct): bool {}
+function pspell_add_to_personal(PSpell $dictionary, string $word): bool {}
+function pspell_add_to_session(PSpell $dictionary, string $word): bool {}
+function pspell_clear_session(PSpell $dictionary): bool {}
+function pspell_save_wordlist(PSpell $dictionary): bool {}
+
+function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): PSpellConfig {}
+function pspell_config_runtogether(PSpellConfig $config, bool $allow): bool {}
+function pspell_config_mode(PSpellConfig $config, int $mode): bool {}
+function pspell_config_ignore(PSpellConfig $config, int $min_length): bool {}
+function pspell_config_personal(PSpellConfig $config, string $filename): bool {}
+function pspell_config_dict_dir(PSpellConfig $config, string $directory): bool {}
+function pspell_config_data_dir(PSpellConfig $config, string $directory): bool {}
+function pspell_config_repl(PSpellConfig $config, string $filename): bool {}
+function pspell_config_save_repl(PSpellConfig $config, bool $save): bool {}
diff --git a/ext/pspell/pspell_arginfo.h b/ext/pspell/pspell_arginfo.h
index 102907461c..f3b7b55310 100644
--- a/ext/pspell/pspell_arginfo.h
+++ b/ext/pspell/pspell_arginfo.h
@@ -1,7 +1,7 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 1d201126072be285aa2dd3c0136cb7cc261f5841 */
+ * Stub hash: efc4c20a1507cfba58ec265a2fe6f61b1e0f8a61 */
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pspell_new, 0, 1, PSpell, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, language, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spelling, IS_STRING, 0, "\"\"")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, jargon, IS_STRING, 0, "\"\"")
@@ -9,7 +9,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new, 0, 1, MAY_BE_LONG|MA
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new_personal, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pspell_new_personal, 0, 2, PSpell, MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, language, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spelling, IS_STRING, 0, "\"\"")
@@ -18,22 +18,22 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new_personal, 0, 2, MAY_B
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_new_config, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pspell_new_config, 0, 1, PSpell, MAY_BE_FALSE)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_check, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pspell_suggest, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_store_replacement, 0, 3, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_ARG_TYPE_INFO(0, misspelled, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, correct, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -43,12 +43,12 @@ ZEND_END_ARG_INFO()
#define arginfo_pspell_add_to_session arginfo_pspell_check
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_clear_session, 0, 1, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, dictionary, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, dictionary, PSpell, 0)
ZEND_END_ARG_INFO()
#define arginfo_pspell_save_wordlist arginfo_pspell_clear_session
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_create, 0, 1, IS_LONG, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_pspell_config_create, 0, 1, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, language, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spelling, IS_STRING, 0, "\"\"")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, jargon, IS_STRING, 0, "\"\"")
@@ -56,27 +56,27 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_create, 0, 1, IS_L
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_runtogether, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, allow, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_mode, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_ignore, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, min_length, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_personal, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_dict_dir, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -85,7 +85,7 @@ ZEND_END_ARG_INFO()
#define arginfo_pspell_config_repl arginfo_pspell_config_personal
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pspell_config_save_repl, 0, 2, _IS_BOOL, 0)
- ZEND_ARG_TYPE_INFO(0, config, IS_LONG, 0)
+ ZEND_ARG_OBJ_INFO(0, config, PSpellConfig, 0)
ZEND_ARG_TYPE_INFO(0, save, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
@@ -133,3 +133,13 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(pspell_config_save_repl, arginfo_pspell_config_save_repl)
ZEND_FE_END
};
+
+
+static const zend_function_entry class_PSpell_methods[] = {
+ ZEND_FE_END
+};
+
+
+static const zend_function_entry class_PSpellConfig_methods[] = {
+ ZEND_FE_END
+};
diff --git a/ext/pspell/tests/003.phpt b/ext/pspell/tests/003.phpt
index e8677ae826..63291a8d42 100644
--- a/ext/pspell/tests/003.phpt
+++ b/ext/pspell/tests/003.phpt
@@ -34,7 +34,7 @@ var_dump(pspell_config_ignore($cfg, PHP_INT_MAX));
bool(false)
Warning: pspell_new_config(): PSPELL couldn't open the dictionary. reason: The encoding "b0rked" is not known. This could also mean that the file "%sb0rked.%s" could not be opened for reading or does not exist. in %s003.php on line 9
-pspell_check(): 0 is not a PSPELL result index
+pspell_check(): Argument #1 ($dictionary) must be of type PSpell, bool given
---
bool(true)
bool(true)
diff --git a/ext/readline/tests/libedit_info_001.phpt b/ext/readline/tests/libedit_info_001.phpt
index 46618120fb..8b6fb80671 100644
--- a/ext/readline/tests/libedit_info_001.phpt
+++ b/ext/readline/tests/libedit_info_001.phpt
@@ -6,6 +6,7 @@ if (READLINE_LIB != "libedit") die("skip libedit only");
if(substr(PHP_OS, 0, 3) == 'WIN' ) {
die('skip not for windows');
}
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
diff --git a/ext/readline/tests/libedit_write_history_001.phpt b/ext/readline/tests/libedit_write_history_001.phpt
index 96424e232f..69739c488e 100644
--- a/ext/readline/tests/libedit_write_history_001.phpt
+++ b/ext/readline/tests/libedit_write_history_001.phpt
@@ -6,6 +6,7 @@ if (READLINE_LIB != "libedit") die("skip libedit only");
if(substr(PHP_OS, 0, 3) == 'WIN' ) {
die('skip not for windows');
}
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
diff --git a/ext/readline/tests/readline_info_001.phpt b/ext/readline/tests/readline_info_001.phpt
index 8f5d641d94..f0d4e67ca5 100644
--- a/ext/readline/tests/readline_info_001.phpt
+++ b/ext/readline/tests/readline_info_001.phpt
@@ -3,6 +3,7 @@ readline_info(): Basic test
--SKIPIF--
<?php if (!extension_loaded("readline")) die("skip");
if (READLINE_LIB == "libedit") die("skip readline only");
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
diff --git a/ext/readline/tests/readline_read_history_001.phpt b/ext/readline/tests/readline_read_history_001.phpt
index 6cabaf369b..8fbcaf1a27 100644
--- a/ext/readline/tests/readline_read_history_001.phpt
+++ b/ext/readline/tests/readline_read_history_001.phpt
@@ -1,7 +1,10 @@
--TEST--
readline_read_history(): Basic test
--SKIPIF--
-<?php if (!extension_loaded("readline") || !function_exists('readline_list_history')) die("skip"); ?>
+<?php
+if (!extension_loaded("readline") || !function_exists('readline_list_history')) die("skip");
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
+?>
--FILE--
<?php
diff --git a/ext/readline/tests/readline_write_history_001.phpt b/ext/readline/tests/readline_write_history_001.phpt
index 95c34e3e89..bcbeb5efa4 100644
--- a/ext/readline/tests/readline_write_history_001.phpt
+++ b/ext/readline/tests/readline_write_history_001.phpt
@@ -3,6 +3,7 @@ readline_write_history(): Basic test
--SKIPIF--
<?php if (!extension_loaded("readline") || !function_exists('readline_add_history')) die("skip");
if (READLINE_LIB == "libedit") die("skip readline only");
+if (getenv('SKIP_REPEAT')) die("skip readline has global state");
?>
--FILE--
<?php
diff --git a/ext/session/tests/003.phpt b/ext/session/tests/003.phpt
index e7e4294375..4f9b37b75d 100644
--- a/ext/session/tests/003.phpt
+++ b/ext/session/tests/003.phpt
@@ -17,7 +17,7 @@ class foo {
function method() { $this->yes++; }
}
-session_id("abtest");
+session_id("test003");
session_start();
session_decode('baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}');
diff --git a/ext/session/tests/004.phpt b/ext/session/tests/004.phpt
index 4b81a088b2..c3ed0c5616 100644
--- a/ext/session/tests/004.phpt
+++ b/ext/session/tests/004.phpt
@@ -55,7 +55,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test004");
session_start();
$_SESSION["baz"]->method();
$_SESSION["arr"][3]->method();
@@ -75,7 +75,7 @@ session_destroy();
?>
--EXPECT--
OPEN: PHPSESSID
-READ: abtest
+READ: test004
object(foo)#2 (2) {
["bar"]=>
string(2) "ok"
@@ -91,9 +91,9 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test004, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
OPEN: PHPSESSID
-READ: abtest
+READ: test004
object(foo)#3 (2) {
["bar"]=>
string(2) "ok"
@@ -109,4 +109,4 @@ array(1) {
int(2)
}
}
-DESTROY: abtest
+DESTROY: test004
diff --git a/ext/session/tests/005.phpt b/ext/session/tests/005.phpt
index a7b42de7fa..2b51ceed94 100644
--- a/ext/session/tests/005.phpt
+++ b/ext/session/tests/005.phpt
@@ -56,7 +56,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test005");
session_start();
session_decode($hnd->data);
@@ -91,7 +91,7 @@ session_destroy();
?>
--EXPECT--
OPEN: PHPSESSID
-READ: abtest
+READ: test005
object(foo)#4 (2) {
["bar"]=>
string(2) "ok"
@@ -107,10 +107,10 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test005, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test005
object(foo)#2 (2) {
["bar"]=>
string(2) "ok"
@@ -127,10 +127,10 @@ array(1) {
}
}
int(123)
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
+WRITE: test005, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test005
object(foo)#4 (2) {
["bar"]=>
string(2) "ok"
@@ -147,5 +147,5 @@ array(1) {
}
}
int(123)
-DESTROY: abtest
+DESTROY: test005
CLOSE
diff --git a/ext/session/tests/006.phpt b/ext/session/tests/006.phpt
index 68cea7314a..e3c048748f 100644
--- a/ext/session/tests/006.phpt
+++ b/ext/session/tests/006.phpt
@@ -13,7 +13,7 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test006");
session_start();
class a {
diff --git a/ext/session/tests/009.phpt b/ext/session/tests/009.phpt
index 10069c21d0..898cf76a5a 100644
--- a/ext/session/tests/009.phpt
+++ b/ext/session/tests/009.phpt
@@ -13,14 +13,14 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test009");
### Phase 1 cleanup
session_start();
session_destroy();
### Phase 2 $_SESSION["c"] does not contain any value
-session_id("abtest");
+session_id("test009");
session_start();
var_dump($_SESSION);
$_SESSION["name"] = "foo";
diff --git a/ext/session/tests/012.phpt b/ext/session/tests/012.phpt
index c555d2ca1e..ad3f54962e 100644
--- a/ext/session/tests/012.phpt
+++ b/ext/session/tests/012.phpt
@@ -14,7 +14,7 @@ error_reporting(E_ALL);
### Absurd example, value of $_SESSION does not matter
-session_id("abtest");
+session_id("test012");
session_start();
$_SESSION["_SESSION"] = Array();
$_SESSION = "kk";
diff --git a/ext/session/tests/013.phpt b/ext/session/tests/013.phpt
index 32909eb58c..07fcea407b 100644
--- a/ext/session/tests/013.phpt
+++ b/ext/session/tests/013.phpt
@@ -12,10 +12,10 @@ session.save_handler=files
<?php
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test013");
session_start();
session_destroy();
-session_id("abtest2");
+session_id("test013-2");
session_start();
session_destroy();
diff --git a/ext/session/tests/014.phpt b/ext/session/tests/014.phpt
index d8369cfec5..a0c6515243 100644
--- a/ext/session/tests/014.phpt
+++ b/ext/session/tests/014.phpt
@@ -14,7 +14,7 @@ session.save_handler=files
<?php
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test014");
session_start();
?>
diff --git a/ext/session/tests/015.phpt b/ext/session/tests/015.phpt
index 527b86bc1d..788f1eac06 100644
--- a/ext/session/tests/015.phpt
+++ b/ext/session/tests/015.phpt
@@ -16,7 +16,7 @@ session.save_handler=files
<?php
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test015");
session_start();
?>
<a href="/link?<?php echo SID; ?>">
@@ -24,4 +24,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<a href="/link?PHPSESSID=abtest&PHPSESSID=abtest">
+<a href="/link?PHPSESSID=test015&PHPSESSID=test015">
diff --git a/ext/session/tests/018.phpt b/ext/session/tests/018.phpt
index 5ec132b34f..d132abf717 100644
--- a/ext/session/tests/018.phpt
+++ b/ext/session/tests/018.phpt
@@ -16,7 +16,7 @@ session.save_handler=files
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test018");
session_start();
?>
<form accept-charset="ISO-8859-15, ISO-8859-1" action=url.php>
@@ -24,4 +24,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<form accept-charset="ISO-8859-15, ISO-8859-1" action=url.php><input type="hidden" name="PHPSESSID" value="abtest" />
+<form accept-charset="ISO-8859-15, ISO-8859-1" action=url.php><input type="hidden" name="PHPSESSID" value="test018" />
diff --git a/ext/session/tests/019.phpt b/ext/session/tests/019.phpt
index d9a478245b..e3793a5522 100644
--- a/ext/session/tests/019.phpt
+++ b/ext/session/tests/019.phpt
@@ -23,7 +23,7 @@ class TFoo {
}
}
-session_id("abtest");
+session_id("test019");
session_start();
$_SESSION["o1"] = new TFoo(42);
diff --git a/ext/session/tests/020.phpt b/ext/session/tests/020.phpt
index 267e52191c..f4ec38c8fb 100644
--- a/ext/session/tests/020.phpt
+++ b/ext/session/tests/020.phpt
@@ -17,7 +17,7 @@ session.save_handler=files
error_reporting(E_ALL);
-session_id("abtest");
+session_id("test020");
session_start();
?>
<a href="link.php?a=b">
@@ -25,4 +25,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<a href="link.php?a=b&amp;PHPSESSID=abtest">
+<a href="link.php?a=b&amp;PHPSESSID=test020">
diff --git a/ext/session/tests/021.phpt b/ext/session/tests/021.phpt
index 4a97d7d32a..2532324fee 100644
--- a/ext/session/tests/021.phpt
+++ b/ext/session/tests/021.phpt
@@ -19,7 +19,7 @@ error_reporting(E_ALL);
ini_set('session.trans_sid_hosts', 'php.net');
$_SERVER['HTTP_HOST'] = 'php.net';
-session_id("abtest");
+session_id("test021");
session_start();
?>
<form action="//bad.net/do.php">
@@ -60,11 +60,11 @@ session_destroy();
--EXPECT--
<form action="//bad.net/do.php">
<fieldset>
-<form action="//php.net/do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="//php.net/do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
-<form action="../do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="../do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
-<form action="/do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="/do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
-<form action="/foo/do.php"><input type="hidden" name="PHPSESSID" value="abtest" />
+<form action="/foo/do.php"><input type="hidden" name="PHPSESSID" value="test021" />
<fieldset>
diff --git a/ext/session/tests/023.phpt b/ext/session/tests/023.phpt
index 23c7096f23..e9ce084256 100644
--- a/ext/session/tests/023.phpt
+++ b/ext/session/tests/023.phpt
@@ -17,7 +17,7 @@ class foo {
function method() { $this->yes++; }
}
-session_id("abtest");
+session_id("test023");
session_start();
session_decode('baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:1;}}');
$baz = $_SESSION['baz'];
diff --git a/ext/session/tests/024.phpt b/ext/session/tests/024.phpt
index 174f2e2639..913956f5b3 100644
--- a/ext/session/tests/024.phpt
+++ b/ext/session/tests/024.phpt
@@ -56,7 +56,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test024");
session_start();
$baz = $_SESSION['baz'];
@@ -79,7 +79,7 @@ session_destroy();
?>
--EXPECTF--
OPEN: PHPSESSID
-READ: abtest
+READ: test024
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -95,9 +95,9 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test024, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
OPEN: PHPSESSID
-READ: abtest
+READ: test024
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -113,4 +113,4 @@ array(1) {
int(2)
}
}
-DESTROY: abtest
+DESTROY: test024
diff --git a/ext/session/tests/025.phpt b/ext/session/tests/025.phpt
index 172ea579c6..4e91da9796 100644
--- a/ext/session/tests/025.phpt
+++ b/ext/session/tests/025.phpt
@@ -57,7 +57,7 @@ class foo {
session_set_save_handler(array($hnd, "open"), array($hnd, "close"), array($hnd, "read"), array($hnd, "write"), array($hnd, "destroy"), array($hnd, "gc"));
-session_id("abtest");
+session_id("test025");
session_start();
$baz = $_SESSION['baz'];
$arr = $_SESSION['arr'];
@@ -93,7 +93,7 @@ session_destroy();
?>
--EXPECTF--
OPEN: PHPSESSID
-READ: abtest
+READ: test025
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -109,10 +109,10 @@ array(1) {
int(2)
}
}
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
+WRITE: test025, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:2;}}
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test025
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -129,10 +129,10 @@ array(1) {
}
}
int(123)
-WRITE: abtest, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
+WRITE: test025, baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";i:3;}}c|i:123;
CLOSE
OPEN: PHPSESSID
-READ: abtest
+READ: test025
object(foo)#%d (2) {
["bar"]=>
string(2) "ok"
@@ -149,5 +149,5 @@ array(1) {
}
}
int(123)
-DESTROY: abtest
+DESTROY: test025
CLOSE
diff --git a/ext/session/tests/026.phpt b/ext/session/tests/026.phpt
index b61039ee0c..f5abdac0a5 100644
--- a/ext/session/tests/026.phpt
+++ b/ext/session/tests/026.phpt
@@ -13,7 +13,7 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test026");
session_start();
class a {
diff --git a/ext/session/tests/027.phpt b/ext/session/tests/027.phpt
index ebaf25467c..969bc5b872 100644
--- a/ext/session/tests/027.phpt
+++ b/ext/session/tests/027.phpt
@@ -13,14 +13,14 @@ session.save_handler=files
error_reporting(E_ALL);
ob_start();
-session_id("abtest");
+session_id("test027");
### Phase 1 cleanup
session_start();
session_destroy();
### Phase 2 $_SESSION["c"] does not contain any value
-session_id("abtest");
+session_id("test027");
session_start();
var_dump($_SESSION);
$_SESSION["name"] = "foo";
diff --git a/ext/session/tests/CONFLICTS b/ext/session/tests/CONFLICTS
deleted file mode 100644
index 30888ae480..0000000000
--- a/ext/session/tests/CONFLICTS
+++ /dev/null
@@ -1 +0,0 @@
-session
diff --git a/ext/session/tests/bug41600.phpt b/ext/session/tests/bug41600.phpt
index 79d5e12841..d4dfce9d88 100644
--- a/ext/session/tests/bug41600.phpt
+++ b/ext/session/tests/bug41600.phpt
@@ -17,7 +17,7 @@ session.save_handler=files
error_reporting(E_ALL);
-session_id("abtest");
+session_id("bug41600");
session_start();
?>
<a href="link.php?a=b">
@@ -25,4 +25,4 @@ session_start();
session_destroy();
?>
--EXPECT--
-<a href="link.php?a=b&amp;PHPSESSID=abtest">
+<a href="link.php?a=b&amp;PHPSESSID=bug41600">
diff --git a/ext/session/tests/bug42596.phpt b/ext/session/tests/bug42596.phpt
index f27e86387e..83567bde5f 100644
--- a/ext/session/tests/bug42596.phpt
+++ b/ext/session/tests/bug42596.phpt
@@ -15,7 +15,7 @@ session.serialize_handler=php
session.save_handler=files
--FILE--
<?php
-$sessdir = __DIR__.'/sessions/';
+$sessdir = __DIR__.'/bug42596/';
@rmdir($sessdir);
mkdir($sessdir);
$save_path = '0;0777;'.$sessdir;
diff --git a/ext/session/tests/rfc1867.phpt b/ext/session/tests/rfc1867.phpt
index 0e189b7aa6..a5ae8b2218 100644
--- a/ext/session/tests/rfc1867.phpt
+++ b/ext/session/tests/rfc1867.phpt
@@ -18,15 +18,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -50,7 +50,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_cleanup.phpt b/ext/session/tests/rfc1867_cleanup.phpt
index ae5dcbe8dc..9baa6144ba 100644
--- a/ext/session/tests/rfc1867_cleanup.phpt
+++ b/ext/session/tests/rfc1867_cleanup.phpt
@@ -18,15 +18,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-cleanup
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-cleanup-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-cleanup-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -50,7 +50,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-cleanup"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_disabled.phpt b/ext/session/tests/rfc1867_disabled.phpt
index 5bedb1de88..8d8effd1f4 100644
--- a/ext/session/tests/rfc1867_disabled.phpt
+++ b/ext/session/tests/rfc1867_disabled.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-disabled
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-disabled-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-disabled-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="file1"; filename="file1.txt"
@@ -44,7 +44,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-disabled"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_disabled_2.phpt b/ext/session/tests/rfc1867_disabled_2.phpt
index d63748369d..c539c6eaea 100644
--- a/ext/session/tests/rfc1867_disabled_2.phpt
+++ b/ext/session/tests/rfc1867_disabled_2.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-disabled-2
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-disabled-2-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-disabled-2-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="file1"; filename="file1.txt"
@@ -44,7 +44,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-disabled-2"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_inter.phpt b/ext/session/tests/rfc1867_inter.phpt
index b961bbcac3..fd28dfe07a 100644
--- a/ext/session/tests/rfc1867_inter.phpt
+++ b/ext/session/tests/rfc1867_inter.phpt
@@ -18,15 +18,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-inter
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-inter-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-inter-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -54,7 +54,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__) . "_2"]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-inter"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_no_name.phpt b/ext/session/tests/rfc1867_no_name.phpt
index 98e8e7cf09..15877a664e 100644
--- a/ext/session/tests/rfc1867_no_name.phpt
+++ b/ext/session/tests/rfc1867_no_name.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-no-name
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-no-name-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-no-name-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="file1"; filename="file1.txt"
@@ -44,7 +44,7 @@ var_dump(isset($_SESSION["upload_progress_" . basename(__FILE__)]));
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-no-name"
array(2) {
["file1"]=>
array(5) {
diff --git a/ext/session/tests/rfc1867_sid_cookie.phpt b/ext/session/tests/rfc1867_sid_cookie.phpt
index 804a9ba308..85c28934f4 100644
--- a/ext/session/tests/rfc1867_sid_cookie.phpt
+++ b/ext/session/tests/rfc1867_sid_cookie.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-cookie
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-sid-cookie-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-cookie-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -49,7 +49,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-cookie"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_get.phpt b/ext/session/tests/rfc1867_sid_get.phpt
index 17d1ebce0f..dfb192cb47 100644
--- a/ext/session/tests/rfc1867_sid_get.phpt
+++ b/ext/session/tests/rfc1867_sid_get.phpt
@@ -17,13 +17,13 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--GET--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-get-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -47,7 +47,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-get"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_get_2.phpt b/ext/session/tests/rfc1867_sid_get_2.phpt
index 4b32c6e352..33e4489cc8 100644
--- a/ext/session/tests/rfc1867_sid_get_2.phpt
+++ b/ext/session/tests/rfc1867_sid_get_2.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests-cookie
+PHPSESSID=rfc1867-sid-get-2-cookie
--GET--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-get-2
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-get-2-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -49,7 +49,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-get-2"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_only_cookie.phpt b/ext/session/tests/rfc1867_sid_only_cookie.phpt
index 0c376bb026..54897b91c8 100644
--- a/ext/session/tests/rfc1867_sid_only_cookie.phpt
+++ b/ext/session/tests/rfc1867_sid_only_cookie.phpt
@@ -17,15 +17,15 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--COOKIE--
-PHPSESSID=rfc1867-tests
+PHPSESSID=rfc1867-sid-only-cookie
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-sid-only-cookie-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-only-cookie-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -49,7 +49,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-only-cookie"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/rfc1867_sid_only_cookie_2.phpt b/ext/session/tests/rfc1867_sid_only_cookie_2.phpt
index 9b0aae9429..3fd46148d7 100644
--- a/ext/session/tests/rfc1867_sid_only_cookie_2.phpt
+++ b/ext/session/tests/rfc1867_sid_only_cookie_2.phpt
@@ -16,13 +16,13 @@ session.save_handler=files
--SKIPIF--
<?php include('skipif.inc'); ?>
--GET--
-PHPSESSID=rfc1867-tests-get
+PHPSESSID=rfc1867-sid-only-cookie-2-get
--POST_RAW--
Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests-post
+rfc1867-sid-only-cookie-2-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
diff --git a/ext/session/tests/rfc1867_sid_post.phpt b/ext/session/tests/rfc1867_sid_post.phpt
index a126f9ba38..f22f153403 100644
--- a/ext/session/tests/rfc1867_sid_post.phpt
+++ b/ext/session/tests/rfc1867_sid_post.phpt
@@ -21,7 +21,7 @@ Content-Type: multipart/form-data; boundary=---------------------------208960602
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHPSESSID"
-rfc1867-tests
+rfc1867-sid-post
-----------------------------20896060251896012921717172737
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
@@ -45,7 +45,7 @@ var_dump($_SESSION["upload_progress_" . basename(__FILE__)]);
session_destroy();
?>
--EXPECTF--
-string(%d) "rfc1867-tests"
+string(%d) "rfc1867-sid-post"
bool(true)
array(2) {
["file1"]=>
diff --git a/ext/session/tests/session_basic1.phpt b/ext/session/tests/session_basic1.phpt
index ffdcf6c5ec..13c21d3e85 100644
--- a/ext/session/tests/session_basic1.phpt
+++ b/ext/session/tests/session_basic1.phpt
@@ -17,7 +17,7 @@ ob_start();
echo "*** Testing basic session functionality : variation1 ***\n";
-$session_id = 'testid';
+$session_id = 'session-basic1';
session_id($session_id);
$path = __DIR__;
var_dump(session_save_path($path));
@@ -47,20 +47,20 @@ ob_end_flush();
*** Testing basic session functionality : variation1 ***
string(0) ""
*** Without lazy_write ***
-string(6) "testid"
+string(14) "session-basic1"
bool(true)
array(1) {
["lazy_write"]=>
bool(false)
}
bool(true)
-string(6) "testid"
+string(14) "session-basic1"
*** With lazy_write ***
-string(6) "testid"
+string(14) "session-basic1"
bool(true)
bool(true)
-string(6) "testid"
+string(14) "session-basic1"
*** Cleanup ***
-string(6) "testid"
+string(14) "session-basic1"
bool(true)
bool(true)
diff --git a/ext/session/tests/session_basic2.phpt b/ext/session/tests/session_basic2.phpt
index cb9585303c..68230f89b7 100644
--- a/ext/session/tests/session_basic2.phpt
+++ b/ext/session/tests/session_basic2.phpt
@@ -19,7 +19,7 @@ ob_start();
echo "*** Testing basic session functionality : variation2 ***\n";
-$session_id = 'testid';
+$session_id = 'session-basic2';
session_id($session_id);
$path = __DIR__;
var_dump(session_save_path($path));
@@ -55,7 +55,7 @@ ob_end_flush();
*** Testing basic session functionality : variation2 ***
string(0) ""
*** Without lazy_write ***
-string(6) "testid"
+string(14) "session-basic2"
bool(true)
bool(true)
bool(true)
diff --git a/ext/session/tests/session_basic3.phpt b/ext/session/tests/session_basic3.phpt
index f6ed10e296..5f6bd72b82 100644
--- a/ext/session/tests/session_basic3.phpt
+++ b/ext/session/tests/session_basic3.phpt
@@ -93,7 +93,7 @@ output_reset_rewrite_vars();
echo "*** Test trans sid ***\n";
ob_start();
-$session_id = 'testid';
+$session_id = 'session-basic3';
session_id($session_id);
session_start();
// Should add session ID to relative URL only for SECURITY
@@ -225,39 +225,39 @@ ob_end_flush();
*** Testing basic session functionality : variation3 use_trans_sid ***
*** Test trans sid ***
-<a href="/?PHPSESSID=testid">test</a>
-<a href="/path?PHPSESSID=testid">test</a>
-<a href="/path/?PHPSESSID=testid">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid">test</a>
-<a href="../?PHPSESSID=testid">test</a>
-<a href="../path?PHPSESSID=testid">test</a>
-<a href="../path/?PHPSESSID=testid">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid">test</a>
+<a href="/?PHPSESSID=session-basic3">test</a>
+<a href="/path?PHPSESSID=session-basic3">test</a>
+<a href="/path/?PHPSESSID=session-basic3">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="../?PHPSESSID=session-basic3">test</a>
+<a href="../path?PHPSESSID=session-basic3">test</a>
+<a href="../path/?PHPSESSID=session-basic3">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic3">test</a>
-<a href="/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?PHPSESSID=testid#bar">test</a>
-<a href="../path/?PHPSESSID=testid#bar">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid#bar">test</a>
+<a href="/?PHPSESSID=session-basic3#bar">test</a>
+<a href="/path/?PHPSESSID=session-basic3#bar">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic3#bar">test</a>
+<a href="../?PHPSESSID=session-basic3#bar">test</a>
+<a href="../path/?PHPSESSID=session-basic3#bar">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic3#bar">test</a>
-<a href="/?foo&PHPSESSID=testid">test</a>
-<a href="/?foo&PHPSESSID=testid#bar">test</a>
-<a href="/?foo=var&PHPSESSID=testid">test</a>
-<a href="/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?foo&PHPSESSID=testid">test</a>
-<a href="../?foo&PHPSESSID=testid#bar">test</a>
-<a href="../?foo=var&PHPSESSID=testid">test</a>
-<a href="../?foo=var&PHPSESSID=testid#bar">test</a>
+<a href="/?foo&PHPSESSID=session-basic3">test</a>
+<a href="/?foo&PHPSESSID=session-basic3#bar">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic3#bar">test</a>
+<a href="../?foo&PHPSESSID=session-basic3">test</a>
+<a href="../?foo&PHPSESSID=session-basic3#bar">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic3#bar">test</a>
-<a href="file.php?PHPSESSID=testid">test</a>
-<a href="file.php?foo&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../file.php?PHPSESSID=testid">test</a>
-<a href="../file.php?foo&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid#bar">test</a>
+<a href="file.php?PHPSESSID=session-basic3">test</a>
+<a href="file.php?foo&PHPSESSID=session-basic3">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic3#bar">test</a>
+<a href="../file.php?PHPSESSID=session-basic3">test</a>
+<a href="../file.php?foo&PHPSESSID=session-basic3">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic3">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic3#bar">test</a>
<a href="http://php.net">test</a>
<a href="http://php.net/">test</a>
@@ -310,19 +310,19 @@ ob_end_flush();
<a href="//php.net/some/path/file.php?foo=var">test</a>
<a href="//php.net/some/path/file.php?foo=var#bar">test</a>
-<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic3" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
@@ -341,5 +341,5 @@ ob_end_flush();
bool(true)
*** Cleanup ***
bool(true)
-string(6) "testid"
+string(14) "session-basic3"
bool(true)
diff --git a/ext/session/tests/session_basic5.phpt b/ext/session/tests/session_basic5.phpt
index 50e6cde920..6a7511c317 100644
--- a/ext/session/tests/session_basic5.phpt
+++ b/ext/session/tests/session_basic5.phpt
@@ -24,7 +24,7 @@ ini_set('session.trans_sid_hosts','php.net,example.com');
echo "*** Testing basic session functionality : variation5 use_trans_sid ***\n";
echo "*** Test trans sid ***\n";
-$session_id = 'testid';
+$session_id = 'session-basic5';
session_id($session_id);
session_start();
// Should add session ID to allowed hosts only for SECURITY
@@ -238,116 +238,116 @@ ob_end_flush();
*** Testing basic session functionality : variation5 use_trans_sid ***
*** Test trans sid ***
-<a href="/?PHPSESSID=testid">test</a>
-<a href="/path?PHPSESSID=testid">test</a>
-<a href="/path/?PHPSESSID=testid">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid">test</a>
-<a href="../?PHPSESSID=testid">test</a>
-<a href="../path?PHPSESSID=testid">test</a>
-<a href="../path/?PHPSESSID=testid">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid">test</a>
-
-<a href="/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?PHPSESSID=testid#bar">test</a>
-<a href="/path/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?PHPSESSID=testid#bar">test</a>
-<a href="../path/?PHPSESSID=testid#bar">test</a>
-<a href="../path/?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="/?foo&PHPSESSID=testid">test</a>
-<a href="/?foo&PHPSESSID=testid#bar">test</a>
-<a href="/?foo=var&PHPSESSID=testid">test</a>
-<a href="/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../?foo&PHPSESSID=testid">test</a>
-<a href="../?foo&PHPSESSID=testid#bar">test</a>
-<a href="../?foo=var&PHPSESSID=testid">test</a>
-<a href="../?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="file.php?PHPSESSID=testid">test</a>
-<a href="file.php?foo&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="../file.php?PHPSESSID=testid">test</a>
-<a href="../file.php?foo&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="../file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="http://php.net/?PHPSESSID=testid">test</a>
-<a href="http://php.net/?PHPSESSID=testid">test</a>
-<a href="http://php.net/?PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/?foo&PHPSESSID=testid">test</a>
-<a href="http://php.net/?foo&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/?foo=var&PHPSESSID=testid">test</a>
-<a href="http://php.net/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/file.php?PHPSESSID=testid">test</a>
-<a href="http://php.net/file.php?PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/file.php?foo&PHPSESSID=testid">test</a>
-<a href="http://php.net/file.php?foo&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="http://php.net/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="http://php.net/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="http://php.net/some/path/file.php?foo&PHPSESSID=testid">test</a>
-<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="https://php.net/?PHPSESSID=testid">test</a>
-<a href="https://php.net/?PHPSESSID=testid">test</a>
-<a href="https://php.net/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net:8443/?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net:8443/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="https://php.net:8443/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="https://php.net:8443/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<a href="//php.net/?PHPSESSID=testid">test</a>
-<a href="//php.net/?PHPSESSID=testid">test</a>
-<a href="//php.net/?PHPSESSID=testid#bar">test</a>
-<a href="//php.net/?foo&PHPSESSID=testid">test</a>
-<a href="//php.net/?foo&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/?foo=var&PHPSESSID=testid">test</a>
-<a href="//php.net/?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/file.php?PHPSESSID=testid">test</a>
-<a href="//php.net/file.php?PHPSESSID=testid#bar">test</a>
-<a href="//php.net/file.php?foo&PHPSESSID=testid">test</a>
-<a href="//php.net/file.php?foo&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="//php.net/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-<a href="//php.net/some/path/file.php?PHPSESSID=testid">test</a>
-<a href="//php.net/some/path/file.php?foo&PHPSESSID=testid">test</a>
-<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=testid">test</a>
-<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=testid#bar">test</a>
-
-<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<a href="/?PHPSESSID=session-basic5">test</a>
+<a href="/path?PHPSESSID=session-basic5">test</a>
+<a href="/path/?PHPSESSID=session-basic5">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="../?PHPSESSID=session-basic5">test</a>
+<a href="../path?PHPSESSID=session-basic5">test</a>
+<a href="../path/?PHPSESSID=session-basic5">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic5">test</a>
+
+<a href="/?PHPSESSID=session-basic5#bar">test</a>
+<a href="/path/?PHPSESSID=session-basic5#bar">test</a>
+<a href="/path/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="../?PHPSESSID=session-basic5#bar">test</a>
+<a href="../path/?PHPSESSID=session-basic5#bar">test</a>
+<a href="../path/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="/?foo&PHPSESSID=session-basic5">test</a>
+<a href="/?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="../?foo&PHPSESSID=session-basic5">test</a>
+<a href="../?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="../?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="file.php?PHPSESSID=session-basic5">test</a>
+<a href="file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="../file.php?PHPSESSID=session-basic5">test</a>
+<a href="../file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="../file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="http://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/?foo&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/file.php?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/file.php?PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/file.php?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="http://php.net/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/some/path/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="http://php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="https://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net:8443/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net:8443/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="https://php.net:8443/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="https://php.net:8443/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<a href="//php.net/?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/?foo&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/file.php?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/file.php?PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/file.php?foo&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+<a href="//php.net/some/path/file.php?PHPSESSID=session-basic5">test</a>
+<a href="//php.net/some/path/file.php?foo&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5">test</a>
+<a href="//php.net/some/path/file.php?foo=var&PHPSESSID=session-basic5#bar">test</a>
+
+<form action="script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />r
+<form action="../script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />r
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="/path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="testid" />
+<form action="../path/script.php" method="post"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form method="post" action="http://php.net/script.php"><input type="hidden" name="PHPSESSID" value="testid" />
+<form method="post" action="http://php.net/script.php"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form method="post" action="https://php.net/script.php"><input type="hidden" name="PHPSESSID" value="testid" />
+<form method="post" action="https://php.net/script.php"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
-<form method="post" action="//php.net/script.php"><input type="hidden" name="PHPSESSID" value="testid" />
+<form method="post" action="//php.net/script.php"><input type="hidden" name="PHPSESSID" value="session-basic5" />
<input type="text" name="test1"></input>
<input type="text" name="test2" />
</form>
@@ -436,5 +436,5 @@ ob_end_flush();
bool(true)
*** Cleanup ***
bool(true)
-string(6) "testid"
+string(14) "session-basic5"
bool(true)
diff --git a/ext/session/tests/session_commit_variation4.phpt b/ext/session/tests/session_commit_variation4.phpt
index 2633f543af..b0c3ad4a94 100644
--- a/ext/session/tests/session_commit_variation4.phpt
+++ b/ext/session/tests/session_commit_variation4.phpt
@@ -12,7 +12,7 @@ ob_start();
echo "*** Testing session_commit() : variation ***\n";
var_dump(ini_get('session.use_strict_mode'));
-var_dump(session_id("test"));
+var_dump(session_id("session-commit-variation4"));
var_dump(session_start());
var_dump(session_id());
var_dump(session_commit());
@@ -38,18 +38,18 @@ ob_end_flush();
string(1) "0"
string(0) ""
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
string(1) "0"
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
-string(4) "test"
+string(25) "session-commit-variation4"
bool(true)
bool(true)
string(1) "0"
diff --git a/ext/session/tests/session_module_name_variation4.phpt b/ext/session/tests/session_module_name_variation4.phpt
index 9b845151a8..7e58ddc6c4 100644
--- a/ext/session/tests/session_module_name_variation4.phpt
+++ b/ext/session/tests/session_module_name_variation4.phpt
@@ -15,6 +15,8 @@ echo "*** Testing session_module_name() : variation ***\n";
require_once "save_handler.inc";
$path = __DIR__;
+$path = __DIR__ . '/session_module_name_variation4';
+@mkdir($path);
session_save_path($path);
session_module_name("files");
@@ -35,6 +37,7 @@ var_dump($_SESSION);
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECT--
*** Testing session_module_name() : variation ***
diff --git a/ext/session/tests/session_save_path_variation4.phpt b/ext/session/tests/session_save_path_variation4.phpt
index 8b3df52262..ec22e92051 100644
--- a/ext/session/tests/session_save_path_variation4.phpt
+++ b/ext/session/tests/session_save_path_variation4.phpt
@@ -14,7 +14,7 @@ ob_start();
echo "*** Testing session_save_path() : variation ***\n";
$initdir = __DIR__;
-$sessions = ($initdir."/sessions");
+$sessions = ($initdir."/session_save_path_variation4");
chdir($initdir);
@@ -38,7 +38,7 @@ ob_end_flush();
--CLEAN--
<?php
$initdir = __DIR__;
-$sessions = ($initdir."/sessions");
+$sessions = ($initdir."/session_save_path_variation4");
var_dump(rmdir($sessions));
?>
--EXPECTF--
diff --git a/ext/session/tests/session_save_path_variation5.phpt b/ext/session/tests/session_save_path_variation5.phpt
index 446a472ab4..3977d0deab 100644
--- a/ext/session/tests/session_save_path_variation5.phpt
+++ b/ext/session/tests/session_save_path_variation5.phpt
@@ -15,7 +15,7 @@ session.name=PHPSESSID
ob_start();
echo "*** Testing session_save_path() : variation ***\n";
$directory = __DIR__;
-$sessions = ($directory."/sessions");
+$sessions = ($directory."/session_save_path_variation5");
chdir($directory);
ini_set('open_basedir', '.');
@@ -36,7 +36,7 @@ ob_end_flush();
--CLEAN--
<?php
$directory = __DIR__;
-$sessions = ($directory."/sessions");
+$sessions = ($directory."/session_save_path_variation5");
var_dump(rmdir($sessions));
?>
--EXPECTF--
diff --git a/ext/session/tests/session_set_save_handler_basic.phpt b/ext/session/tests/session_set_save_handler_basic.phpt
index 459f03c825..23865aa512 100644
--- a/ext/session/tests/session_set_save_handler_basic.phpt
+++ b/ext/session/tests/session_set_save_handler_basic.phpt
@@ -20,7 +20,8 @@ var_dump(session_module_name(FALSE));
var_dump(session_module_name("blah"));
var_dump(session_module_name("foo"));
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_basic';
+@mkdir($path);
session_save_path($path);
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
@@ -55,6 +56,7 @@ session_start();
session_destroy();
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : basic functionality ***
diff --git a/ext/session/tests/session_set_save_handler_variation2.phpt b/ext/session/tests/session_set_save_handler_variation2.phpt
index 224846466e..a4b7d4df6e 100644
--- a/ext/session/tests/session_set_save_handler_variation2.phpt
+++ b/ext/session/tests/session_set_save_handler_variation2.phpt
@@ -10,13 +10,15 @@ ob_start();
echo "*** Testing session_set_save_handler() : variation ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation2';
+@mkdir($path);
session_save_path($path);
var_dump(session_start());
var_dump(session_set_save_handler("open", "close", "read", "write", "destroy", "gc"));
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
diff --git a/ext/session/tests/session_set_save_handler_variation3.phpt b/ext/session/tests/session_set_save_handler_variation3.phpt
index be825cbe72..cc0ae1fb23 100644
--- a/ext/session/tests/session_set_save_handler_variation3.phpt
+++ b/ext/session/tests/session_set_save_handler_variation3.phpt
@@ -12,13 +12,15 @@ ob_start();
echo "*** Testing session_set_save_handler() : variation ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation3';
+@mkdir($path);
var_dump(session_status());
session_save_path($path);
var_dump(session_set_save_handler("open", "close", "read", "write", "destroy", "gc"));
var_dump(session_destroy());
-
ob_end_flush();
+
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
diff --git a/ext/session/tests/session_set_save_handler_variation4.phpt b/ext/session/tests/session_set_save_handler_variation4.phpt
index e1b61f29a7..9930f7aaf2 100644
--- a/ext/session/tests/session_set_save_handler_variation4.phpt
+++ b/ext/session/tests/session_set_save_handler_variation4.phpt
@@ -23,7 +23,8 @@ function noisy_gc($maxlifetime) {
}
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation4';
+@mkdir($path);
session_save_path($path);
session_set_save_handler("open", "close", "read", "write", "destroy", "noisy_gc");
@@ -42,13 +43,14 @@ var_dump($_SESSION);
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
Open [%s,PHPSESSID]
Read [%s,%s]
GC [0]
-2 deleted
+1 deleted
array(3) {
["Blah"]=>
string(12) "Hello World!"
diff --git a/ext/session/tests/session_set_save_handler_variation5.phpt b/ext/session/tests/session_set_save_handler_variation5.phpt
index 9860dcc04a..7cf7814259 100644
--- a/ext/session/tests/session_set_save_handler_variation5.phpt
+++ b/ext/session/tests/session_set_save_handler_variation5.phpt
@@ -24,7 +24,8 @@ function noisy_gc($maxlifetime) {
echo "*** Testing session_set_save_handler() : variation ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation5';
+@mkdir($path);
var_dump(session_save_path($path));
echo "*** Without lazy_write ***\n";
@@ -48,6 +49,7 @@ var_dump(session_start());
var_dump(session_destroy());
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : variation ***
diff --git a/ext/session/tests/session_set_save_handler_variation6.phpt b/ext/session/tests/session_set_save_handler_variation6.phpt
index d65c0dc1c8..11af07f603 100644
--- a/ext/session/tests/session_set_save_handler_variation6.phpt
+++ b/ext/session/tests/session_set_save_handler_variation6.phpt
@@ -17,7 +17,8 @@ ob_start();
echo "*** Testing session_set_save_handler() : test write short circuit ***\n";
require_once "save_handler.inc";
-$path = __DIR__;
+$path = __DIR__ . '/session_set_save_handler_variation6';
+@mkdir($path);
session_save_path($path);
session_set_save_handler("open", "close", "read", "write", "destroy", "gc", "create_sid", "validate_sid", "update");
@@ -53,6 +54,7 @@ session_start();
session_destroy();
ob_end_flush();
+rmdir($path);
?>
--EXPECTF--
*** Testing session_set_save_handler() : test write short circuit ***
diff --git a/ext/soap/tests/bug73037.phpt b/ext/soap/tests/bug73037.phpt
index 4e72932862..8060575bd8 100644
--- a/ext/soap/tests/bug73037.phpt
+++ b/ext/soap/tests/bug73037.phpt
@@ -1,7 +1,5 @@
--TEST--
Bug #73037 SoapServer reports Bad Request when gzipped, var 0
---CONFLICTS--
-server
--SKIPIF--
<?php
require_once('skipif.inc');
diff --git a/ext/soap/tests/custom_content_type.phpt b/ext/soap/tests/custom_content_type.phpt
index 17a074f102..9172d3d6ca 100644
--- a/ext/soap/tests/custom_content_type.phpt
+++ b/ext/soap/tests/custom_content_type.phpt
@@ -8,8 +8,6 @@ SOAP customized Content-Type, eg. SwA use case
echo "skip sapi/cli/tests/php_cli_server.inc required but not found";
}
?>
---CONFLICTS--
-server
--FILE--
<?php
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 6118610cac..a9d0e4b885 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -1044,11 +1044,7 @@ PHP_FUNCTION(socket_read)
if (retval == -1) {
/* if the socket is in non-blocking mode and there's no data to read,
don't output any error, as this is a normal situation, and not an error */
- if (errno == EAGAIN
-#ifdef EWOULDBLOCK
- || errno == EWOULDBLOCK
-#endif
- ) {
+ if (PHP_IS_TRANSIENT_ERROR(errno)) {
php_sock->error = errno;
SOCKETS_G(last_error) = errno;
} else {
diff --git a/ext/sodium/config.m4 b/ext/sodium/config.m4
index 0676b66910..05d9ebd5a1 100644
--- a/ext/sodium/config.m4
+++ b/ext/sodium/config.m4
@@ -11,8 +11,9 @@ if test "$PHP_SODIUM" != "no"; then
AC_DEFINE(HAVE_LIBSODIUMLIB, 1, [ ])
- dnl Add -Wno-type-limits as this may arise on 32bits platforms
+ dnl Add -Wno-type-limits and -Wno-logical-op as this may arise on 32bits platforms
SODIUM_COMPILER_FLAGS="$LIBSODIUM_CFLAGS -Wno-type-limits"
+ AX_CHECK_COMPILE_FLAG([-Wno-logical-op], SODIUM_COMPILER_FLAGS="$SODIUM_COMPILER_FLAGS -Wno-logical-op", , [-Werror])
PHP_NEW_EXTENSION(sodium, libsodium.c sodium_pwhash.c, $ext_shared, , $SODIUM_COMPILER_FLAGS)
PHP_SUBST(SODIUM_SHARED_LIBADD)
fi
diff --git a/ext/standard/array.c b/ext/standard/array.c
index f99af84611..3a50e77100 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -1321,7 +1321,13 @@ PHP_FUNCTION(max)
}
/* }}} */
-static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
+typedef struct {
+ zend_fcall_info fci;
+ zend_fcall_info_cache fci_cache;
+} php_array_walk_context;
+
+static int php_array_walk(
+ php_array_walk_context *context, zval *array, zval *userdata, int recursive)
{
zval args[3], /* Arguments to userland function */
retval, /* Return value - unused */
@@ -1331,15 +1337,19 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
uint32_t ht_iter;
int result = SUCCESS;
+ /* Create a local copy of fci, as we want to use different arguments at different
+ * levels of recursion. */
+ zend_fcall_info fci = context->fci;
+
/* Set up known arguments */
ZVAL_UNDEF(&args[1]);
if (userdata) {
ZVAL_COPY(&args[2], userdata);
}
- BG(array_walk_fci).retval = &retval;
- BG(array_walk_fci).param_count = userdata ? 3 : 2;
- BG(array_walk_fci).params = args;
+ fci.retval = &retval;
+ fci.param_count = userdata ? 3 : 2;
+ fci.params = args;
zend_hash_internal_pointer_reset_ex(target_hash, &pos);
ht_iter = zend_hash_iterator_add(target_hash, pos);
@@ -1386,8 +1396,6 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
if (recursive && Z_TYPE_P(Z_REFVAL_P(zv)) == IS_ARRAY) {
HashTable *thash;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
zval ref;
ZVAL_COPY_VALUE(&ref, zv);
@@ -1400,28 +1408,20 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
break;
}
- /* backup the fcall info and cache */
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
-
Z_ADDREF(ref);
GC_PROTECT_RECURSION(thash);
- result = php_array_walk(zv, userdata, recursive);
+ result = php_array_walk(context, zv, userdata, recursive);
if (Z_TYPE_P(Z_REFVAL(ref)) == IS_ARRAY && thash == Z_ARRVAL_P(Z_REFVAL(ref))) {
/* If the hashtable changed in the meantime, we'll "leak" this apply count
* increment -- our reference to thash is no longer valid. */
GC_UNPROTECT_RECURSION(thash);
}
zval_ptr_dtor(&ref);
-
- /* restore the fcall info and cache */
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
} else {
ZVAL_COPY(&args[0], zv);
/* Call the userland function */
- result = zend_call_function(&BG(array_walk_fci), &BG(array_walk_fci_cache));
+ result = zend_call_function(&fci, &context->fci_cache);
if (result == SUCCESS) {
zval_ptr_dtor(&retval);
}
@@ -1458,33 +1458,22 @@ static int php_array_walk(zval *array, zval *userdata, int recursive) /* {{{ */
zend_hash_iterator_del(ht_iter);
return result;
}
-/* }}} */
/* {{{ Apply a user function to every member of an array */
PHP_FUNCTION(array_walk)
{
zval *array;
zval *userdata = NULL;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
-
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
+ php_array_walk_context context;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_OR_OBJECT_EX(array, 0, 1)
- Z_PARAM_FUNC(BG(array_walk_fci), BG(array_walk_fci_cache))
+ Z_PARAM_FUNC(context.fci, context.fci_cache)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(userdata)
- ZEND_PARSE_PARAMETERS_END_EX(
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
- return
- );
-
- php_array_walk(array, userdata, 0);
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
+ ZEND_PARSE_PARAMETERS_END();
+
+ php_array_walk(&context, array, userdata, 0);
RETURN_TRUE;
}
/* }}} */
@@ -1494,26 +1483,16 @@ PHP_FUNCTION(array_walk_recursive)
{
zval *array;
zval *userdata = NULL;
- zend_fcall_info orig_array_walk_fci;
- zend_fcall_info_cache orig_array_walk_fci_cache;
-
- orig_array_walk_fci = BG(array_walk_fci);
- orig_array_walk_fci_cache = BG(array_walk_fci_cache);
+ php_array_walk_context context;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_ARRAY_OR_OBJECT_EX(array, 0, 1)
- Z_PARAM_FUNC(BG(array_walk_fci), BG(array_walk_fci_cache))
+ Z_PARAM_FUNC(context.fci, context.fci_cache)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(userdata)
- ZEND_PARSE_PARAMETERS_END_EX(
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
- return
- );
-
- php_array_walk(array, userdata, 1);
- BG(array_walk_fci) = orig_array_walk_fci;
- BG(array_walk_fci_cache) = orig_array_walk_fci_cache;
+ ZEND_PARSE_PARAMETERS_END();
+
+ php_array_walk(&context, array, userdata, 1);
RETURN_TRUE;
}
/* }}} */
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 876ef347eb..33247c4cb3 100755
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -463,8 +463,6 @@ PHP_RINIT_FUNCTION(basic) /* {{{ */
BG(strtok_last) = NULL;
BG(ctype_string) = NULL;
BG(locale_changed) = 0;
- BG(array_walk_fci) = empty_fcall_info;
- BG(array_walk_fci_cache) = empty_fcall_info_cache;
BG(user_compare_fci) = empty_fcall_info;
BG(user_compare_fci_cache) = empty_fcall_info_cache;
BG(page_uid) = -1;
@@ -1472,7 +1470,7 @@ PHPAPI int _php_error_log_ex(int opt_err, const char *message, size_t message_le
return FAILURE;
case 3: /*save to a file */
- stream = php_stream_open_wrapper(opt, "a", IGNORE_URL_WIN | REPORT_ERRORS, NULL);
+ stream = php_stream_open_wrapper(opt, "a", REPORT_ERRORS, NULL);
if (!stream) {
return FAILURE;
}
@@ -1953,12 +1951,8 @@ PHP_FUNCTION(highlight_string)
hicompiled_string_description = zend_make_compiled_string_description("highlighted code");
- // TODO: Accept zend_string in highlight_string API.
- zval str_zv;
- ZVAL_STR_COPY(&str_zv, str);
- highlight_string(&str_zv, &syntax_highlighter_ini, hicompiled_string_description);
+ highlight_string(str, &syntax_highlighter_ini, hicompiled_string_description);
efree(hicompiled_string_description);
- zval_ptr_dtor(&str_zv);
EG(error_reporting) = old_error_reporting;
diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h
index 97faf50fd9..34b2570175 100644
--- a/ext/standard/basic_functions.h
+++ b/ext/standard/basic_functions.h
@@ -66,8 +66,6 @@ typedef struct _php_basic_globals {
char *strtok_last;
char strtok_table[256];
size_t strtok_len;
- zend_fcall_info array_walk_fci;
- zend_fcall_info_cache array_walk_fci_cache;
zend_fcall_info user_compare_fci;
zend_fcall_info_cache user_compare_fci_cache;
zend_llist *user_tick_functions;
diff --git a/ext/standard/mail.c b/ext/standard/mail.c
index 3080a3957b..4dfbfb03d0 100644
--- a/ext/standard/mail.c
+++ b/ext/standard/mail.c
@@ -371,7 +371,7 @@ void php_mail_log_to_syslog(char *message) {
void php_mail_log_to_file(char *filename, char *message, size_t message_size) {
/* Write 'message' to the given file. */
- uint32_t flags = IGNORE_URL_WIN | REPORT_ERRORS | STREAM_DISABLE_OPEN_BASEDIR;
+ uint32_t flags = REPORT_ERRORS | STREAM_DISABLE_OPEN_BASEDIR;
php_stream *stream = php_stream_open_wrapper(filename, "a", flags, NULL);
if (stream) {
php_stream_write(stream, message, message_size);
diff --git a/ext/standard/php_http.h b/ext/standard/php_http.h
index 1df941ee00..3f764c18a6 100644
--- a/ext/standard/php_http.h
+++ b/ext/standard/php_http.h
@@ -25,6 +25,5 @@ PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
const char *key_prefix, size_t key_prefix_len,
const char *key_suffix, size_t key_suffix_len,
zval *type, const char *arg_sep, int enc_type);
-#define php_url_encode_hash(ht, formstr) php_url_encode_hash_ex((ht), (formstr), NULL, 0, NULL, 0, NULL, 0, NULL)
#endif
diff --git a/ext/standard/tests/file/realpath_bug77484.phpt b/ext/standard/tests/file/realpath_bug77484.phpt
index 85595d09e3..9aa3a335c2 100644
--- a/ext/standard/tests/file/realpath_bug77484.phpt
+++ b/ext/standard/tests/file/realpath_bug77484.phpt
@@ -9,6 +9,10 @@ if (PHP_ZTS) {
/* TODO eliminate difference in TS build. */
die("skip Not for ZTS");
}
+if (getenv('SKIP_REPEAT')) {
+ /* The cwd is persistent across repeats */
+ die("skip Not repeatable");
+}
?>
--FILE--
<?php
diff --git a/ext/standard/tests/general_functions/http_response_code.phpt b/ext/standard/tests/general_functions/http_response_code.phpt
index bc2775f3d3..ab290c3cef 100644
--- a/ext/standard/tests/general_functions/http_response_code.phpt
+++ b/ext/standard/tests/general_functions/http_response_code.phpt
@@ -2,6 +2,15 @@
Test http_response_code basic functionality
--CREDITS--
Gabriel Caruso (carusogabriel@php.net)
+--SKIPIF--
+<?php
+if (getenv('SKIP_REPEAT')) {
+ /* The http_response_code leaks across repeats. Technically that's a bug, but it's something
+ * that only affects the CLI repeat option, where the response code is not meaningful in the
+ * first place. Other SAPIs will properly reset the response code for each request. */
+ die('skip Not repeatable');
+}
+?>
--FILE--
<?php
var_dump(
diff --git a/ext/standard/tests/general_functions/proc_nice_basic.phpt b/ext/standard/tests/general_functions/proc_nice_basic.phpt
index b8cc3cd128..17bca0f7b7 100644
--- a/ext/standard/tests/general_functions/proc_nice_basic.phpt
+++ b/ext/standard/tests/general_functions/proc_nice_basic.phpt
@@ -25,7 +25,7 @@ if ($exit_code !== 0) {
else
return -1;
}
- $delta = 10;
+ $delta = 5;
$pid = getmypid();
$niceBefore = getNice($pid);
proc_nice($delta);
diff --git a/ext/standard/tests/streams/bug64433.phpt b/ext/standard/tests/streams/bug64433.phpt
index 56af241837..53fecc57f9 100644
--- a/ext/standard/tests/streams/bug64433.phpt
+++ b/ext/standard/tests/streams/bug64433.phpt
@@ -9,8 +9,6 @@ if(!$res) {
die("skip could not open cli server script");
}
?>
---CONFLICTS--
-server
--FILE--
<?php
include __DIR__."/../../../../sapi/cli/tests/php_cli_server.inc";
diff --git a/ext/standard/tests/url/get_headers_error_003.phpt b/ext/standard/tests/url/get_headers_error_003.phpt
index a8edc2cb21..7ee0b9e210 100644
--- a/ext/standard/tests/url/get_headers_error_003.phpt
+++ b/ext/standard/tests/url/get_headers_error_003.phpt
@@ -1,7 +1,5 @@
--TEST--
Test get_headers() function : test with context
---CONFLICTS--
-server
--FILE--
<?php
diff --git a/main/main.c b/main/main.c
index d2d19a5ee8..8ab7c55067 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1443,7 +1443,7 @@ PHP_FUNCTION(set_time_limit)
/* {{{ php_fopen_wrapper_for_zend */
static FILE *php_fopen_wrapper_for_zend(const char *filename, zend_string **opened_path)
{
- return php_stream_open_wrapper_as_file((char *)filename, "rb", USE_PATH|IGNORE_URL_WIN|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE, opened_path);
+ return php_stream_open_wrapper_as_file((char *)filename, "rb", USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE, opened_path);
}
/* }}} */
diff --git a/main/output.c b/main/output.c
index d155123834..bdeca894f2 100644
--- a/main/output.c
+++ b/main/output.c
@@ -103,20 +103,20 @@ static size_t (*php_output_direct)(const char *str, size_t str_len) = php_output
static void php_output_header(void)
{
if (!SG(headers_sent)) {
- if (!OG(output_start_filename_str)) {
+ if (!OG(output_start_filename)) {
if (zend_is_compiling()) {
- OG(output_start_filename_str) = zend_get_compiled_filename();
+ OG(output_start_filename) = zend_get_compiled_filename();
OG(output_start_lineno) = zend_get_compiled_lineno();
} else if (zend_is_executing()) {
- OG(output_start_filename_str) = zend_get_executed_filename_ex();
+ OG(output_start_filename) = zend_get_executed_filename_ex();
OG(output_start_lineno) = zend_get_executed_lineno();
}
- if (OG(output_start_filename_str)) {
- zend_string_addref(OG(output_start_filename_str));
+ if (OG(output_start_filename)) {
+ zend_string_addref(OG(output_start_filename));
}
#if PHP_OUTPUT_DEBUG
fprintf(stderr, "!!! output started at: %s (%d)\n",
- ZSTR_VAL(OG(output_start_filename_str)), OG(output_start_lineno));
+ ZSTR_VAL(OG(output_start_filename)), OG(output_start_lineno));
#endif
}
if (!php_header()) {
@@ -195,9 +195,9 @@ PHPAPI void php_output_deactivate(void)
zend_stack_destroy(&OG(handlers));
}
- if (OG(output_start_filename_str)) {
- zend_string_release(OG(output_start_filename_str));
- OG(output_start_filename_str) = NULL;
+ if (OG(output_start_filename)) {
+ zend_string_release(OG(output_start_filename));
+ OG(output_start_filename) = NULL;
}
}
/* }}} */
@@ -758,7 +758,7 @@ PHPAPI void php_output_set_implicit_flush(int flush)
* Get the file name where output has started */
PHPAPI const char *php_output_get_start_filename(void)
{
- return OG(output_start_filename_str) ? ZSTR_VAL(OG(output_start_filename_str)) : NULL;
+ return OG(output_start_filename) ? ZSTR_VAL(OG(output_start_filename)) : NULL;
}
/* }}} */
diff --git a/main/php.h b/main/php.h
index f796577249..68076befde 100644
--- a/main/php.h
+++ b/main/php.h
@@ -22,7 +22,7 @@
#include <dmalloc.h>
#endif
-#define PHP_API_VERSION 20200930
+#define PHP_API_VERSION 20201009
#define PHP_HAVE_STREAMS
#define YYDEBUG 0
#define PHP_DEFAULT_CHARSET "UTF-8"
diff --git a/main/php_network.h b/main/php_network.h
index 437069b4fc..5c8cee3fa8 100644
--- a/main/php_network.h
+++ b/main/php_network.h
@@ -49,6 +49,13 @@
# define EWOULDBLOCK EAGAIN
#endif
+/* This is a work around for GCC bug 69602: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602 */
+#if EAGAIN != EWOULDBLOCK
+# define PHP_IS_TRANSIENT_ERROR(err) (err == EAGAIN || err == EWOULDBLOCK)
+#else
+# define PHP_IS_TRANSIENT_ERROR(err) (err == EAGAIN)
+#endif
+
#ifdef PHP_WIN32
#define php_socket_errno() WSAGetLastError()
#else
diff --git a/main/php_output.h b/main/php_output.h
index eba63e6039..18f611dece 100644
--- a/main/php_output.h
+++ b/main/php_output.h
@@ -137,10 +137,9 @@ ZEND_BEGIN_MODULE_GLOBALS(output)
zend_stack handlers;
php_output_handler *active;
php_output_handler *running;
- const char *output_start_filename; /* TODO: Unused, remove */
+ zend_string *output_start_filename;
int output_start_lineno;
int flags;
- zend_string *output_start_filename_str;
ZEND_END_MODULE_GLOBALS(output)
PHPAPI ZEND_EXTERN_MODULE_GLOBALS(output)
diff --git a/main/php_streams.h b/main/php_streams.h
index 73740a7a79..1bd6668607 100644
--- a/main/php_streams.h
+++ b/main/php_streams.h
@@ -550,9 +550,6 @@ END_EXTERN_C()
/* Allow blocking reads on anonymous pipes on Windows. */
#define STREAM_USE_BLOCKING_PIPE 0x00008000
-/* Antique - no longer has meaning */
-#define IGNORE_URL_WIN 0
-
int php_init_stream_wrappers(int module_number);
int php_shutdown_stream_wrappers(int module_number);
void php_shutdown_stream_hashes(void);
diff --git a/main/php_version.h b/main/php_version.h
index 7da21cab4a..66d4367856 100644
--- a/main/php_version.h
+++ b/main/php_version.h
@@ -1,8 +1,8 @@
/* automatically generated by configure */
/* edit configure.ac to change version number */
#define PHP_MAJOR_VERSION 8
-#define PHP_MINOR_VERSION 0
-#define PHP_RELEASE_VERSION 1
+#define PHP_MINOR_VERSION 1
+#define PHP_RELEASE_VERSION 0
#define PHP_EXTRA_VERSION "-dev"
-#define PHP_VERSION "8.0.1-dev"
-#define PHP_VERSION_ID 80001
+#define PHP_VERSION "8.1.0-dev"
+#define PHP_VERSION_ID 80100
diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c
index 8a891ddf72..0373cc4c94 100644
--- a/main/streams/plain_wrapper.c
+++ b/main/streams/plain_wrapper.c
@@ -351,7 +351,7 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun
ssize_t bytes_written = write(data->fd, buf, count);
#endif
if (bytes_written < 0) {
- if (errno == EWOULDBLOCK || errno == EAGAIN) {
+ if (PHP_IS_TRANSIENT_ERROR(errno)) {
return 0;
}
if (errno == EINTR) {
@@ -420,7 +420,7 @@ static ssize_t php_stdiop_read(php_stream *stream, char *buf, size_t count)
}
if (ret < 0) {
- if (errno == EWOULDBLOCK || errno == EAGAIN) {
+ if (PHP_IS_TRANSIENT_ERROR(errno)) {
/* Not an error. */
ret = 0;
} else if (errno == EINTR) {
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index f3370e89f7..cd67fcb8ca 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -75,7 +75,8 @@ retry:
if (didwrite <= 0) {
char *estr;
int err = php_socket_errno();
- if (err == EWOULDBLOCK || err == EAGAIN) {
+
+ if (PHP_IS_TRANSIENT_ERROR(err)) {
if (sock->is_blocked) {
int retval;
@@ -166,7 +167,7 @@ static ssize_t php_sockop_read(php_stream *stream, char *buf, size_t count)
err = php_socket_errno();
if (nr_bytes < 0) {
- if (err == EAGAIN || err == EWOULDBLOCK) {
+ if (PHP_IS_TRANSIENT_ERROR(err)) {
nr_bytes = 0;
} else {
stream->eof = 1;
diff --git a/php.ini-development b/php.ini-development
index 9eed34c6ac..b4193ca67a 100644
--- a/php.ini-development
+++ b/php.ini-development
@@ -17,7 +17,7 @@
; 6. The directory from the --with-config-file-path compile time option, or the
; Windows directory (usually C:\windows)
; See the PHP docs for more specific information.
-; http://php.net/configuration.file
+; https://php.net/configuration.file
; The syntax of the file is extremely simple. Whitespace and lines
; beginning with a semicolon are silently ignored (as you probably guessed).
@@ -31,7 +31,7 @@
; special sections cannot be overridden by user-defined INI files or
; at runtime. Currently, [PATH=] and [HOST=] sections only work under
; CGI/FastCGI.
-; http://php.net/ini.sections
+; https://php.net/ini.sections
; Directives are specified using the following syntax:
; directive = value
@@ -181,7 +181,7 @@
;;;;;;;;;;;;;;;;;;;;
; Enable the PHP scripting language engine under Apache.
-; http://php.net/engine
+; https://php.net/engine
engine = On
; This directive determines whether or not PHP will recognize code between
@@ -194,11 +194,11 @@ engine = On
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/short-open-tag
+; https://php.net/short-open-tag
short_open_tag = Off
; The number of significant digits displayed in floating point numbers.
-; http://php.net/precision
+; https://php.net/precision
precision = 14
; Output buffering is a mechanism for controlling how much output data
@@ -222,7 +222,7 @@ precision = 14
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
-; http://php.net/output-buffering
+; https://php.net/output-buffering
output_buffering = 4096
; You can redirect all of the output of your scripts to a function. For
@@ -237,7 +237,7 @@ output_buffering = 4096
; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
; Note: output_handler must be empty if this is set 'On' !!!!
; Instead you must use zlib.output_handler.
-; http://php.net/output-handler
+; https://php.net/output-handler
;output_handler =
; URL rewriter function rewrites URL on the fly by using
@@ -266,16 +266,16 @@ output_buffering = 4096
; performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
; output_handler, or otherwise the output will be corrupted.
-; http://php.net/zlib.output-compression
+; https://php.net/zlib.output-compression
zlib.output_compression = Off
-; http://php.net/zlib.output-compression-level
+; https://php.net/zlib.output-compression-level
;zlib.output_compression_level = -1
; You cannot specify additional output handlers if zlib.output_compression
; is activated here. This setting does the same as output_handler but in
; a different order.
-; http://php.net/zlib.output-handler
+; https://php.net/zlib.output-handler
;zlib.output_handler =
; Implicit flush tells PHP to tell the output layer to flush itself
@@ -283,7 +283,7 @@ zlib.output_compression = Off
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block. Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
-; http://php.net/implicit-flush
+; https://php.net/implicit-flush
; Note: This directive is hardcoded to On for the CLI SAPI
implicit_flush = Off
@@ -314,22 +314,22 @@ serialize_precision = -1
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; Note: disables the realpath cache
-; http://php.net/open-basedir
+; https://php.net/open-basedir
;open_basedir =
; This directive allows you to disable certain functions.
; It receives a comma-delimited list of function names.
-; http://php.net/disable-functions
+; https://php.net/disable-functions
disable_functions =
; This directive allows you to disable certain classes.
; It receives a comma-delimited list of class names.
-; http://php.net/disable-classes
+; https://php.net/disable-classes
disable_classes =
; Colors for Syntax Highlighting mode. Anything that's acceptable in
; <span style="color: ???????"> would work.
-; http://php.net/syntax-highlighting
+; https://php.net/syntax-highlighting
;highlight.string = #DD0000
;highlight.comment = #FF9900
;highlight.keyword = #007700
@@ -340,24 +340,24 @@ disable_classes =
; the request. Consider enabling it if executing long requests, which may end up
; being interrupted by the user or a browser timing out. PHP's default behavior
; is to disable this feature.
-; http://php.net/ignore-user-abort
+; https://php.net/ignore-user-abort
;ignore_user_abort = On
; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; Note: if open_basedir is set, the cache is disabled
-; http://php.net/realpath-cache-size
+; https://php.net/realpath-cache-size
;realpath_cache_size = 4096k
; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
-; http://php.net/realpath-cache-ttl
+; https://php.net/realpath-cache-ttl
;realpath_cache_ttl = 120
; Enables or disables the circular reference collector.
-; http://php.net/zend.enable-gc
+; https://php.net/zend.enable-gc
zend.enable_gc = On
; If enabled, scripts may be written in encodings that are incompatible with
@@ -394,7 +394,7 @@ zend.exception_string_param_max_len = 15
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
-; http://php.net/expose-php
+; https://php.net/expose-php
expose_php = On
;;;;;;;;;;;;;;;;;;;
@@ -402,7 +402,7 @@ expose_php = On
;;;;;;;;;;;;;;;;;;;
; Maximum execution time of each script, in seconds
-; http://php.net/max-execution-time
+; https://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30
@@ -413,18 +413,18 @@ max_execution_time = 30
; Default Value: -1 (Unlimited)
; Development Value: 60 (60 seconds)
; Production Value: 60 (60 seconds)
-; http://php.net/max-input-time
+; https://php.net/max-input-time
max_input_time = 60
; Maximum input variable nesting level
-; http://php.net/max-input-nesting-level
+; https://php.net/max-input-nesting-level
;max_input_nesting_level = 64
; How many GET/POST/COOKIE input variables may be accepted
;max_input_vars = 1000
; Maximum amount of memory a script may consume
-; http://php.net/memory-limit
+; https://php.net/memory-limit
memory_limit = 128M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -480,7 +480,7 @@ memory_limit = 128M
; Default Value: E_ALL
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
-; http://php.net/error-reporting
+; https://php.net/error-reporting
error_reporting = E_ALL
; This directive controls whether or not and where PHP will output errors,
@@ -497,7 +497,7 @@ error_reporting = E_ALL
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-errors
+; https://php.net/display-errors
display_errors = On
; The display of errors which occur during PHP's startup sequence are handled
@@ -506,7 +506,7 @@ display_errors = On
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-startup-errors
+; https://php.net/display-startup-errors
display_startup_errors = On
; Besides displaying errors, PHP can also log errors to locations such as a
@@ -516,36 +516,36 @@ display_startup_errors = On
; Default Value: Off
; Development Value: On
; Production Value: On
-; http://php.net/log-errors
+; https://php.net/log-errors
log_errors = On
; Set maximum length of log_errors. In error_log information about the source is
; added. The default is 1024 and 0 allows to not apply any maximum length at all.
-; http://php.net/log-errors-max-len
+; https://php.net/log-errors-max-len
log_errors_max_len = 1024
; Do not log repeated messages. Repeated errors must occur in same file on same
; line unless ignore_repeated_source is set true.
-; http://php.net/ignore-repeated-errors
+; https://php.net/ignore-repeated-errors
ignore_repeated_errors = Off
; Ignore source of message when ignoring repeated messages. When this setting
; is On you will not log errors with repeated messages from different files or
; source lines.
-; http://php.net/ignore-repeated-source
+; https://php.net/ignore-repeated-source
ignore_repeated_source = Off
; If this parameter is set to Off, then memory leaks will not be shown (on
; stdout or in the log). This is only effective in a debug compile, and if
; error reporting includes E_WARNING in the allowed list
-; http://php.net/report-memleaks
+; https://php.net/report-memleaks
report_memleaks = On
; This setting is off by default.
;report_zend_debug = 0
; Turn off normal error reporting and emit XML-RPC error XML
-; http://php.net/xmlrpc-errors
+; https://php.net/xmlrpc-errors
;xmlrpc_errors = 0
; An XML-RPC faultCode
@@ -555,40 +555,40 @@ report_memleaks = On
; error message as HTML for easier reading. This directive controls whether
; the error message is formatted as HTML or not.
; Note: This directive is hardcoded to Off for the CLI SAPI
-; http://php.net/html-errors
+; https://php.net/html-errors
;html_errors = On
; If html_errors is set to On *and* docref_root is not empty, then PHP
; produces clickable error messages that direct to a page describing the error
; or function causing the error in detail.
-; You can download a copy of the PHP manual from http://php.net/docs
+; You can download a copy of the PHP manual from https://php.net/docs
; and change docref_root to the base URL of your local copy including the
; leading '/'. You must also specify the file extension being used including
; the dot. PHP's default behavior is to leave these settings empty, in which
; case no links to documentation are generated.
; Note: Never use this feature for production boxes.
-; http://php.net/docref-root
+; https://php.net/docref-root
; Examples
;docref_root = "/phpmanual/"
-; http://php.net/docref-ext
+; https://php.net/docref-ext
;docref_ext = .html
; String to output before an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-prepend-string
+; https://php.net/error-prepend-string
; Example:
;error_prepend_string = "<span style='color: #ff0000'>"
; String to output after an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-append-string
+; https://php.net/error-append-string
; Example:
;error_append_string = "</span>"
; Log errors to specified file. PHP's default behavior is to leave this value
; empty.
-; http://php.net/error-log
+; https://php.net/error-log
; Example:
;error_log = php_errors.log
; Log errors to syslog (Event Log on Windows).
@@ -611,7 +611,7 @@ report_memleaks = On
; no-ctrl (all characters except control characters)
; all (all characters)
; raw (like "all", but messages are not split at newlines)
-; http://php.net/syslog.filter
+; https://php.net/syslog.filter
;syslog.filter = ascii
;windows.show_crt_warning
@@ -625,14 +625,14 @@ report_memleaks = On
; The separator used in PHP generated URLs to separate arguments.
; PHP's default setting is "&".
-; http://php.net/arg-separator.output
+; https://php.net/arg-separator.output
; Example:
;arg_separator.output = "&amp;"
; List of separator(s) used by PHP to parse input URLs into variables.
; PHP's default setting is "&".
; NOTE: Every character in this directive is considered as separator!
-; http://php.net/arg-separator.input
+; https://php.net/arg-separator.input
; Example:
;arg_separator.input = ";&"
@@ -646,7 +646,7 @@ report_memleaks = On
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
-; http://php.net/variables-order
+; https://php.net/variables-order
variables_order = "GPCS"
; This directive determines which super global data (G,P & C) should be
@@ -659,7 +659,7 @@ variables_order = "GPCS"
; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
-; http://php.net/request-order
+; https://php.net/request-order
request_order = "GP"
; This directive determines whether PHP registers $argv & $argc each time it
@@ -674,7 +674,7 @@ request_order = "GP"
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/register-argc-argv
+; https://php.net/register-argc-argv
register_argc_argv = Off
; When enabled, the ENV, REQUEST and SERVER variables are created when they're
@@ -682,7 +682,7 @@ register_argc_argv = Off
; variables are not used within a script, having this directive on will result
; in a performance gain. The PHP directive register_argc_argv must be disabled
; for this directive to have any effect.
-; http://php.net/auto-globals-jit
+; https://php.net/auto-globals-jit
auto_globals_jit = On
; Whether PHP will read the POST data.
@@ -691,48 +691,48 @@ auto_globals_jit = On
; and $_FILES to always be empty; the only way you will be able to read the
; POST data will be through the php://input stream wrapper. This can be useful
; to proxy requests or to process the POST data in a memory efficient fashion.
-; http://php.net/enable-post-data-reading
+; https://php.net/enable-post-data-reading
;enable_post_data_reading = Off
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
-; http://php.net/post-max-size
+; https://php.net/post-max-size
post_max_size = 8M
; Automatically add files before PHP document.
-; http://php.net/auto-prepend-file
+; https://php.net/auto-prepend-file
auto_prepend_file =
; Automatically add files after PHP document.
-; http://php.net/auto-append-file
+; https://php.net/auto-append-file
auto_append_file =
; By default, PHP will output a media type using the Content-Type header. To
; disable this, simply set it to be empty.
;
; PHP's built-in default media type is set to text/html.
-; http://php.net/default-mimetype
+; https://php.net/default-mimetype
default_mimetype = "text/html"
; PHP's default character set is set to UTF-8.
-; http://php.net/default-charset
+; https://php.net/default-charset
default_charset = "UTF-8"
; PHP internal character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/internal-encoding
+; https://php.net/internal-encoding
;internal_encoding =
; PHP input character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/input-encoding
+; https://php.net/input-encoding
;input_encoding =
; PHP output character encoding is set to empty.
; If empty, default_charset is used.
; See also output_buffer.
-; http://php.net/output-encoding
+; https://php.net/output-encoding
;output_encoding =
;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -746,23 +746,23 @@ default_charset = "UTF-8"
;include_path = ".;c:\php\includes"
;
; PHP's default setting for include_path is ".;/path/to/php/pear"
-; http://php.net/include-path
+; https://php.net/include-path
; The root of the PHP pages, used only if nonempty.
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
; if you are running php as a CGI under any web server (other than IIS)
; see documentation for security issues. The alternate is to use the
; cgi.force_redirect configuration below
-; http://php.net/doc-root
+; https://php.net/doc-root
doc_root =
; The directory under which PHP opens the script using /~username used only
; if nonempty.
-; http://php.net/user-dir
+; https://php.net/user-dir
user_dir =
; Directory in which the loadable extensions (modules) reside.
-; http://php.net/extension-dir
+; https://php.net/extension-dir
;extension_dir = "./"
; On windows:
;extension_dir = "ext"
@@ -774,14 +774,14 @@ user_dir =
; Whether or not to enable the dl() function. The dl() function does NOT work
; properly in multithreaded servers, such as IIS or Zeus, and is automatically
; disabled on them.
-; http://php.net/enable-dl
+; https://php.net/enable-dl
enable_dl = Off
; cgi.force_redirect is necessary to provide security running PHP as a CGI under
; most web servers. Left undefined, PHP turns this on by default. You can
; turn it off here AT YOUR OWN RISK
; **You CAN safely turn this off for IIS, in fact, you MUST.**
-; http://php.net/cgi.force-redirect
+; https://php.net/cgi.force-redirect
;cgi.force_redirect = 1
; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
@@ -792,7 +792,7 @@ enable_dl = Off
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
; will look for to know it is OK to continue execution. Setting this variable MAY
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
-; http://php.net/cgi.redirect-status-env
+; https://php.net/cgi.redirect-status-env
;cgi.redirect_status_env =
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
@@ -801,7 +801,7 @@ enable_dl = Off
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
-; http://php.net/cgi.fix-pathinfo
+; https://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside
@@ -813,7 +813,7 @@ enable_dl = Off
; security context that the request runs under. mod_fastcgi under Apache
; does not currently support this feature (03/17/2002)
; Set to 1 if running under IIS. Default is zero.
-; http://php.net/fastcgi.impersonate
+; https://php.net/fastcgi.impersonate
;fastcgi.impersonate = 1
; Disable logging through FastCGI connection. PHP's default behavior is to enable
@@ -825,14 +825,14 @@ enable_dl = Off
; is supported by Apache. When this option is set to 1, PHP will send
; RFC2616 compliant header.
; Default is zero.
-; http://php.net/cgi.rfc2616-headers
+; https://php.net/cgi.rfc2616-headers
;cgi.rfc2616_headers = 0
; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #!
; (shebang) at the top of the running script. This line might be needed if the
; script support running both as stand-alone script and via PHP CGI<. PHP in CGI
; mode skips this line and ignores its content if this directive is turned on.
-; http://php.net/cgi.check-shebang-line
+; https://php.net/cgi.check-shebang-line
;cgi.check_shebang_line=1
;;;;;;;;;;;;;;;;
@@ -840,16 +840,16 @@ enable_dl = Off
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
-; http://php.net/file-uploads
+; https://php.net/file-uploads
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
-; http://php.net/upload-tmp-dir
+; https://php.net/upload-tmp-dir
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
-; http://php.net/upload-max-filesize
+; https://php.net/upload-max-filesize
upload_max_filesize = 2M
; Maximum number of files that can be uploaded via a single request
@@ -860,24 +860,24 @@ max_file_uploads = 20
;;;;;;;;;;;;;;;;;;
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-fopen
+; https://php.net/allow-url-fopen
allow_url_fopen = On
-; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-include
+; Whether to allow include/require to open URLs (like https:// or ftp://) as files.
+; https://php.net/allow-url-include
allow_url_include = Off
; Define the anonymous ftp password (your email address). PHP's default setting
; for this is empty.
-; http://php.net/from
+; https://php.net/from
;from="john@doe.com"
; Define the User-Agent string. PHP's default setting for this is empty.
-; http://php.net/user-agent
+; https://php.net/user-agent
;user_agent="PHP"
; Default timeout for socket based streams (seconds)
-; http://php.net/default-socket-timeout
+; https://php.net/default-socket-timeout
default_socket_timeout = 60
; If your scripts have to deal with files from Macintosh systems,
@@ -885,7 +885,7 @@ default_socket_timeout = 60
; unix or win32 systems, setting this flag will cause PHP to
; automatically detect the EOL character in those files so that
; fgets() and file() will work regardless of the source of the file.
-; http://php.net/auto-detect-line-endings
+; https://php.net/auto-detect-line-endings
;auto_detect_line_endings = Off
;;;;;;;;;;;;;;;;;;;;;;
@@ -944,7 +944,7 @@ default_socket_timeout = 60
;extension=shmop
; The MIBS data available in the PHP distribution must be installed.
-; See http://www.php.net/manual/en/snmp.installation.php
+; See https://www.php.net/manual/en/snmp.installation.php
;extension=snmp
;extension=soap
@@ -966,26 +966,26 @@ cli_server.color = On
[Date]
; Defines the default timezone used by the date functions
-; http://php.net/date.timezone
+; https://php.net/date.timezone
;date.timezone =
-; http://php.net/date.default-latitude
+; https://php.net/date.default-latitude
;date.default_latitude = 31.7667
-; http://php.net/date.default-longitude
+; https://php.net/date.default-longitude
;date.default_longitude = 35.2333
-; http://php.net/date.sunrise-zenith
+; https://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.833333
-; http://php.net/date.sunset-zenith
+; https://php.net/date.sunset-zenith
;date.sunset_zenith = 90.833333
[filter]
-; http://php.net/filter.default
+; https://php.net/filter.default
;filter.default = unsafe_raw
-; http://php.net/filter.default-flags
+; https://php.net/filter.default-flags
;filter.default_flags =
[iconv]
@@ -1023,7 +1023,7 @@ cli_server.color = On
[sqlite3]
; Directory pointing to SQLite3 extensions
-; http://php.net/sqlite3.extension-dir
+; https://php.net/sqlite3.extension-dir
;sqlite3.extension_dir =
; SQLite defensive mode flag (only available from SQLite 3.26+)
@@ -1037,14 +1037,14 @@ cli_server.color = On
[Pcre]
; PCRE library backtracking limit.
-; http://php.net/pcre.backtrack-limit
+; https://php.net/pcre.backtrack-limit
;pcre.backtrack_limit=100000
; PCRE library recursion limit.
; Please note that if you set this value to a high number you may consume all
; the available process stack and eventually crash PHP (due to reaching the
; stack size limit imposed by the Operating System).
-; http://php.net/pcre.recursion-limit
+; https://php.net/pcre.recursion-limit
;pcre.recursion_limit=100000
; Enables or disables JIT compilation of patterns. This requires the PCRE
@@ -1053,7 +1053,7 @@ cli_server.color = On
[Pdo]
; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off"
-; http://php.net/pdo-odbc.connection-pooling
+; https://php.net/pdo-odbc.connection-pooling
;pdo_odbc.connection_pooling=strict
[Pdo_mysql]
@@ -1062,27 +1062,27 @@ cli_server.color = On
pdo_mysql.default_socket=
[Phar]
-; http://php.net/phar.readonly
+; https://php.net/phar.readonly
;phar.readonly = On
-; http://php.net/phar.require-hash
+; https://php.net/phar.require-hash
;phar.require_hash = On
;phar.cache_list =
[mail function]
; For Win32 only.
-; http://php.net/smtp
+; https://php.net/smtp
SMTP = localhost
-; http://php.net/smtp-port
+; https://php.net/smtp-port
smtp_port = 25
; For Win32 only.
-; http://php.net/sendmail-from
+; https://php.net/sendmail-from
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
-; http://php.net/sendmail-path
+; https://php.net/sendmail-path
;sendmail_path =
; Force the addition of the specified parameters to be passed as extra parameters
@@ -1100,13 +1100,13 @@ mail.add_x_header = Off
;mail.log = syslog
[ODBC]
-; http://php.net/odbc.default-db
+; https://php.net/odbc.default-db
;odbc.default_db = Not yet implemented
-; http://php.net/odbc.default-user
+; https://php.net/odbc.default-user
;odbc.default_user = Not yet implemented
-; http://php.net/odbc.default-pw
+; https://php.net/odbc.default-pw
;odbc.default_pw = Not yet implemented
; Controls the ODBC cursor model.
@@ -1114,68 +1114,68 @@ mail.add_x_header = Off
;odbc.default_cursortype
; Allow or prevent persistent links.
-; http://php.net/odbc.allow-persistent
+; https://php.net/odbc.allow-persistent
odbc.allow_persistent = On
; Check that a connection is still valid before reuse.
-; http://php.net/odbc.check-persistent
+; https://php.net/odbc.check-persistent
odbc.check_persistent = On
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/odbc.max-persistent
+; https://php.net/odbc.max-persistent
odbc.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
-; http://php.net/odbc.max-links
+; https://php.net/odbc.max-links
odbc.max_links = -1
; Handling of LONG fields. Returns number of bytes to variables. 0 means
; passthru.
-; http://php.net/odbc.defaultlrl
+; https://php.net/odbc.defaultlrl
odbc.defaultlrl = 4096
; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
; of odbc.defaultlrl and odbc.defaultbinmode
-; http://php.net/odbc.defaultbinmode
+; https://php.net/odbc.defaultbinmode
odbc.defaultbinmode = 1
[MySQLi]
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/mysqli.max-persistent
+; https://php.net/mysqli.max-persistent
mysqli.max_persistent = -1
; Allow accessing, from PHP's perspective, local files with LOAD DATA statements
-; http://php.net/mysqli.allow_local_infile
+; https://php.net/mysqli.allow_local_infile
;mysqli.allow_local_infile = On
; Allow or prevent persistent links.
-; http://php.net/mysqli.allow-persistent
+; https://php.net/mysqli.allow-persistent
mysqli.allow_persistent = On
; Maximum number of links. -1 means no limit.
-; http://php.net/mysqli.max-links
+; https://php.net/mysqli.max-links
mysqli.max_links = -1
; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
; at MYSQL_PORT.
-; http://php.net/mysqli.default-port
+; https://php.net/mysqli.default-port
mysqli.default_port = 3306
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
-; http://php.net/mysqli.default-socket
+; https://php.net/mysqli.default-socket
mysqli.default_socket =
; Default host for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-host
+; https://php.net/mysqli.default-host
mysqli.default_host =
; Default user for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-user
+; https://php.net/mysqli.default-user
mysqli.default_user =
; Default password for mysqli_connect() (doesn't apply in safe mode).
@@ -1183,7 +1183,7 @@ mysqli.default_user =
; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
; and reveal this password! And of course, any users with read access to this
; file will be able to reveal the password as well.
-; http://php.net/mysqli.default-pw
+; https://php.net/mysqli.default-pw
mysqli.default_pw =
; Allow or prevent reconnect
@@ -1200,7 +1200,7 @@ mysqlnd.collect_memory_statistics = On
; Records communication from all extensions using mysqlnd to the specified log
; file.
-; http://php.net/mysqlnd.debug
+; https://php.net/mysqlnd.debug
;mysqlnd.debug =
; Defines which queries will be logged.
@@ -1227,25 +1227,25 @@ mysqlnd.collect_memory_statistics = On
; Connection: Enables privileged connections using external
; credentials (OCI_SYSOPER, OCI_SYSDBA)
-; http://php.net/oci8.privileged-connect
+; https://php.net/oci8.privileged-connect
;oci8.privileged_connect = Off
; Connection: The maximum number of persistent OCI8 connections per
; process. Using -1 means no limit.
-; http://php.net/oci8.max-persistent
+; https://php.net/oci8.max-persistent
;oci8.max_persistent = -1
; Connection: The maximum number of seconds a process is allowed to
; maintain an idle persistent connection. Using -1 means idle
; persistent connections will be maintained forever.
-; http://php.net/oci8.persistent-timeout
+; https://php.net/oci8.persistent-timeout
;oci8.persistent_timeout = -1
; Connection: The number of seconds that must pass before issuing a
; ping during oci_pconnect() to check the connection validity. When
; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
; pings completely.
-; http://php.net/oci8.ping-interval
+; https://php.net/oci8.ping-interval
;oci8.ping_interval = 60
; Connection: Set this to a user chosen connection class to be used
@@ -1263,59 +1263,59 @@ mysqlnd.collect_memory_statistics = On
; Tuning: This option enables statement caching, and specifies how
; many statements to cache. Using 0 disables statement caching.
-; http://php.net/oci8.statement-cache-size
+; https://php.net/oci8.statement-cache-size
;oci8.statement_cache_size = 20
; Tuning: Enables statement prefetching and sets the default number of
; rows that will be fetched automatically after statement execution.
-; http://php.net/oci8.default-prefetch
+; https://php.net/oci8.default-prefetch
;oci8.default_prefetch = 100
; Compatibility. Using On means oci_close() will not close
; oci_connect() and oci_new_connect() connections.
-; http://php.net/oci8.old-oci-close-semantics
+; https://php.net/oci8.old-oci-close-semantics
;oci8.old_oci_close_semantics = Off
[PostgreSQL]
; Allow or prevent persistent links.
-; http://php.net/pgsql.allow-persistent
+; https://php.net/pgsql.allow-persistent
pgsql.allow_persistent = On
; Detect broken persistent links always with pg_pconnect().
; Auto reset feature requires a little overheads.
-; http://php.net/pgsql.auto-reset-persistent
+; https://php.net/pgsql.auto-reset-persistent
pgsql.auto_reset_persistent = Off
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/pgsql.max-persistent
+; https://php.net/pgsql.max-persistent
pgsql.max_persistent = -1
; Maximum number of links (persistent+non persistent). -1 means no limit.
-; http://php.net/pgsql.max-links
+; https://php.net/pgsql.max-links
pgsql.max_links = -1
; Ignore PostgreSQL backends Notice message or not.
; Notice message logging require a little overheads.
-; http://php.net/pgsql.ignore-notice
+; https://php.net/pgsql.ignore-notice
pgsql.ignore_notice = 0
; Log PostgreSQL backends Notice message or not.
; Unless pgsql.ignore_notice=0, module cannot log notice message.
-; http://php.net/pgsql.log-notice
+; https://php.net/pgsql.log-notice
pgsql.log_notice = 0
[bcmath]
; Number of decimal digits for all bcmath functions.
-; http://php.net/bcmath.scale
+; https://php.net/bcmath.scale
bcmath.scale = 0
[browscap]
-; http://php.net/browscap
+; https://php.net/browscap
;browscap = extra/browscap.ini
[Session]
; Handler used to store/retrieve data.
-; http://php.net/session.save-handler
+; https://php.net/session.save-handler
session.save_handler = files
; Argument passed to save_handler. In the case of files, this is the path
@@ -1344,7 +1344,7 @@ session.save_handler = files
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
-; http://php.net/session.save-path
+; https://php.net/session.save-path
;session.save_path = "/tmp"
; Whether to use strict session mode.
@@ -1357,42 +1357,42 @@ session.save_handler = files
session.use_strict_mode = 0
; Whether to use cookies.
-; http://php.net/session.use-cookies
+; https://php.net/session.use-cookies
session.use_cookies = 1
-; http://php.net/session.cookie-secure
+; https://php.net/session.cookie-secure
;session.cookie_secure =
; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
-; http://php.net/session.use-only-cookies
+; https://php.net/session.use-only-cookies
session.use_only_cookies = 1
; Name of the session (used as cookie name).
-; http://php.net/session.name
+; https://php.net/session.name
session.name = PHPSESSID
; Initialize session on request startup.
-; http://php.net/session.auto-start
+; https://php.net/session.auto-start
session.auto_start = 0
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
-; http://php.net/session.cookie-lifetime
+; https://php.net/session.cookie-lifetime
session.cookie_lifetime = 0
; The path for which the cookie is valid.
-; http://php.net/session.cookie-path
+; https://php.net/session.cookie-path
session.cookie_path = /
; The domain for which the cookie is valid.
-; http://php.net/session.cookie-domain
+; https://php.net/session.cookie-domain
session.cookie_domain =
; Whether or not to add the httpOnly flag to the cookie, which makes it
; inaccessible to browser scripting languages such as JavaScript.
-; http://php.net/session.cookie-httponly
+; https://php.net/session.cookie-httponly
session.cookie_httponly =
; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
@@ -1402,7 +1402,7 @@ session.cookie_httponly =
session.cookie_samesite =
; Handler used to serialize data. php is the standard serializer of PHP.
-; http://php.net/session.serialize-handler
+; https://php.net/session.serialize-handler
session.serialize_handler = php
; Defines the probability that the 'garbage collection' process is started on every
@@ -1411,7 +1411,7 @@ session.serialize_handler = php
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.gc-probability
+; https://php.net/session.gc-probability
session.gc_probability = 1
; Defines the probability that the 'garbage collection' process is started on every
@@ -1421,12 +1421,12 @@ session.gc_probability = 1
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
-; http://php.net/session.gc-divisor
+; https://php.net/session.gc-divisor
session.gc_divisor = 1000
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
-; http://php.net/session.gc-maxlifetime
+; https://php.net/session.gc-maxlifetime
session.gc_maxlifetime = 1440
; NOTE: If you are using the subdirectory option for storing session files
@@ -1440,16 +1440,16 @@ session.gc_maxlifetime = 1440
; Check HTTP Referer to invalidate externally stored URLs containing ids.
; HTTP_REFERER has to contain this substring for the session to be
; considered as valid.
-; http://php.net/session.referer-check
+; https://php.net/session.referer-check
session.referer_check =
; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
-; http://php.net/session.cache-limiter
+; https://php.net/session.cache-limiter
session.cache_limiter = nocache
; Document expires after n minutes.
-; http://php.net/session.cache-expire
+; https://php.net/session.cache-expire
session.cache_expire = 180
; trans sid support is disabled by default.
@@ -1461,13 +1461,13 @@ session.cache_expire = 180
; in publicly accessible computer.
; - User may access your site with the same session ID
; always using URL stored in browser's history or bookmarks.
-; http://php.net/session.use-trans-sid
+; https://php.net/session.use-trans-sid
session.use_trans_sid = 0
; Set session ID character length. This value could be between 22 to 256.
; Shorter length than default is supported only for compatibility reason.
; Users should use 32 or more chars.
-; http://php.net/session.sid-length
+; https://php.net/session.sid-length
; Default Value: 32
; Development Value: 26
; Production Value: 26
@@ -1482,7 +1482,7 @@ session.sid_length = 26
; Default Value: "a=href,area=href,frame=src,form="
; Development Value: "a=href,area=href,frame=src,form="
; Production Value: "a=href,area=href,frame=src,form="
-; http://php.net/url-rewriter.tags
+; https://php.net/url-rewriter.tags
session.trans_sid_tags = "a=href,area=href,frame=src,form="
; URL rewriter does not rewrite absolute URLs by default.
@@ -1507,14 +1507,14 @@ session.trans_sid_tags = "a=href,area=href,frame=src,form="
; Default Value: 4
; Development Value: 5
; Production Value: 5
-; http://php.net/session.hash-bits-per-character
+; https://php.net/session.hash-bits-per-character
session.sid_bits_per_character = 5
; Enable upload progress tracking in $_SESSION
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.enabled
+; https://php.net/session.upload-progress.enabled
;session.upload_progress.enabled = On
; Cleanup the progress information as soon as all POST data has been read
@@ -1522,14 +1522,14 @@ session.sid_bits_per_character = 5
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.cleanup
+; https://php.net/session.upload-progress.cleanup
;session.upload_progress.cleanup = On
; A prefix used for the upload progress key in $_SESSION
; Default Value: "upload_progress_"
; Development Value: "upload_progress_"
; Production Value: "upload_progress_"
-; http://php.net/session.upload-progress.prefix
+; https://php.net/session.upload-progress.prefix
;session.upload_progress.prefix = "upload_progress_"
; The index name (concatenated with the prefix) in $_SESSION
@@ -1537,7 +1537,7 @@ session.sid_bits_per_character = 5
; Default Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Development Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Production Value: "PHP_SESSION_UPLOAD_PROGRESS"
-; http://php.net/session.upload-progress.name
+; https://php.net/session.upload-progress.name
;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
; How frequently the upload progress should be updated.
@@ -1545,18 +1545,18 @@ session.sid_bits_per_character = 5
; Default Value: "1%"
; Development Value: "1%"
; Production Value: "1%"
-; http://php.net/session.upload-progress.freq
+; https://php.net/session.upload-progress.freq
;session.upload_progress.freq = "1%"
; The minimum delay between updates, in seconds
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.upload-progress.min-freq
+; https://php.net/session.upload-progress.min-freq
;session.upload_progress.min_freq = "1"
; Only write session data when session data is changed. Enabled by default.
-; http://php.net/session.lazy-write
+; https://php.net/session.lazy-write
;session.lazy_write = On
[Assertion]
@@ -1568,48 +1568,48 @@ session.sid_bits_per_character = 5
; Default Value: 1
; Development Value: 1
; Production Value: -1
-; http://php.net/zend.assertions
+; https://php.net/zend.assertions
zend.assertions = 1
; Assert(expr); active by default.
-; http://php.net/assert.active
+; https://php.net/assert.active
;assert.active = On
; Throw an AssertionError on failed assertions
-; http://php.net/assert.exception
+; https://php.net/assert.exception
;assert.exception = On
; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active)
-; http://php.net/assert.warning
+; https://php.net/assert.warning
;assert.warning = On
; Don't bail out by default.
-; http://php.net/assert.bail
+; https://php.net/assert.bail
;assert.bail = Off
; User-function to be called if an assertion fails.
-; http://php.net/assert.callback
+; https://php.net/assert.callback
;assert.callback = 0
[COM]
; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
-; http://php.net/com.typelib-file
+; https://php.net/com.typelib-file
;com.typelib_file =
; allow Distributed-COM calls
-; http://php.net/com.allow-dcom
+; https://php.net/com.allow-dcom
;com.allow_dcom = true
; autoregister constants of a component's typlib on com_load()
-; http://php.net/com.autoregister-typelib
+; https://php.net/com.autoregister-typelib
;com.autoregister_typelib = true
; register constants casesensitive
-; http://php.net/com.autoregister-casesensitive
+; https://php.net/com.autoregister-casesensitive
;com.autoregister_casesensitive = false
; show warnings on duplicate constant registrations
-; http://php.net/com.autoregister-verbose
+; https://php.net/com.autoregister-verbose
;com.autoregister_verbose = true
; The default character set code-page to use when passing strings to and from COM objects.
@@ -1623,7 +1623,7 @@ zend.assertions = 1
[mbstring]
; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order.
-; http://php.net/mbstring.language
+; https://php.net/mbstring.language
;mbstring.language = Japanese
; Use of this INI entry is deprecated, use global internal_encoding instead.
@@ -1638,7 +1638,7 @@ zend.assertions = 1
; mbstring.encoding_translation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is: default_charset < input_encoding < mbstring.http_input
-; http://php.net/mbstring.http-input
+; https://php.net/mbstring.http-input
;mbstring.http_input =
; Use of this INI entry is deprecated, use global output_encoding instead.
@@ -1648,7 +1648,7 @@ zend.assertions = 1
; The precedence is: default_charset < output_encoding < mbstring.http_output
; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed.
-; http://php.net/mbstring.http-output
+; https://php.net/mbstring.http-output
;mbstring.http_output =
; enable automatic encoding translation according to
@@ -1656,17 +1656,17 @@ zend.assertions = 1
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
-; http://php.net/mbstring.encoding-translation
+; https://php.net/mbstring.encoding-translation
;mbstring.encoding_translation = Off
; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language
-; http://php.net/mbstring.detect-order
+; https://php.net/mbstring.detect-order
;mbstring.detect_order = auto
; substitute_character used when character cannot be converted
; one from another
-; http://php.net/mbstring.substitute-character
+; https://php.net/mbstring.substitute-character
;mbstring.substitute_character = none
; Enable strict encoding detection.
@@ -1689,7 +1689,7 @@ zend.assertions = 1
; Tell the jpeg decode to ignore warnings and try to create
; a gd image. The warning will then be displayed as notices
; disabled by default
-; http://php.net/gd.jpeg-ignore-warning
+; https://php.net/gd.jpeg-ignore-warning
;gd.jpeg_ignore_warning = 1
[exif]
@@ -1698,47 +1698,47 @@ zend.assertions = 1
; given by corresponding encode setting. When empty mbstring.internal_encoding
; is used. For the decode settings you can distinguish between motorola and
; intel byte order. A decode setting cannot be empty.
-; http://php.net/exif.encode-unicode
+; https://php.net/exif.encode-unicode
;exif.encode_unicode = ISO-8859-15
-; http://php.net/exif.decode-unicode-motorola
+; https://php.net/exif.decode-unicode-motorola
;exif.decode_unicode_motorola = UCS-2BE
-; http://php.net/exif.decode-unicode-intel
+; https://php.net/exif.decode-unicode-intel
;exif.decode_unicode_intel = UCS-2LE
-; http://php.net/exif.encode-jis
+; https://php.net/exif.encode-jis
;exif.encode_jis =
-; http://php.net/exif.decode-jis-motorola
+; https://php.net/exif.decode-jis-motorola
;exif.decode_jis_motorola = JIS
-; http://php.net/exif.decode-jis-intel
+; https://php.net/exif.decode-jis-intel
;exif.decode_jis_intel = JIS
[Tidy]
; The path to a default tidy configuration file to use when using tidy
-; http://php.net/tidy.default-config
+; https://php.net/tidy.default-config
;tidy.default_config = /usr/local/lib/php/default.tcfg
; Should tidy clean and repair output automatically?
; WARNING: Do not use this option if you are generating non-html content
; such as dynamic images
-; http://php.net/tidy.clean-output
+; https://php.net/tidy.clean-output
tidy.clean_output = Off
[soap]
; Enables or disables WSDL caching feature.
-; http://php.net/soap.wsdl-cache-enabled
+; https://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
-; http://php.net/soap.wsdl-cache-dir
+; https://php.net/soap.wsdl-cache-dir
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
-; http://php.net/soap.wsdl-cache-ttl
+; https://php.net/soap.wsdl-cache-ttl
soap.wsdl_cache_ttl=86400
; Sets the size of the cache limit. (Max. number of WSDL files to cache)
@@ -1893,12 +1893,12 @@ ldap.max_links = -1
; Specifies a PHP script that is going to be compiled and executed at server
; start-up.
-; http://php.net/opcache.preload
+; https://php.net/opcache.preload
;opcache.preload=
; Preloading code as root is not allowed for security reasons. This directive
; facilitates to let the preloading to be run as another user.
-; http://php.net/opcache.preload_user
+; https://php.net/opcache.preload_user
;opcache.preload_user=
; Prevents caching files that are less than this number of seconds old. It
diff --git a/php.ini-production b/php.ini-production
index 281272e3db..15ecc4530e 100644
--- a/php.ini-production
+++ b/php.ini-production
@@ -17,7 +17,7 @@
; 6. The directory from the --with-config-file-path compile time option, or the
; Windows directory (usually C:\windows)
; See the PHP docs for more specific information.
-; http://php.net/configuration.file
+; https://php.net/configuration.file
; The syntax of the file is extremely simple. Whitespace and lines
; beginning with a semicolon are silently ignored (as you probably guessed).
@@ -31,7 +31,7 @@
; special sections cannot be overridden by user-defined INI files or
; at runtime. Currently, [PATH=] and [HOST=] sections only work under
; CGI/FastCGI.
-; http://php.net/ini.sections
+; https://php.net/ini.sections
; Directives are specified using the following syntax:
; directive = value
@@ -181,7 +181,7 @@
;;;;;;;;;;;;;;;;;;;;
; Enable the PHP scripting language engine under Apache.
-; http://php.net/engine
+; https://php.net/engine
engine = On
; This directive determines whether or not PHP will recognize code between
@@ -194,11 +194,11 @@ engine = On
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/short-open-tag
+; https://php.net/short-open-tag
short_open_tag = Off
; The number of significant digits displayed in floating point numbers.
-; http://php.net/precision
+; https://php.net/precision
precision = 14
; Output buffering is a mechanism for controlling how much output data
@@ -222,7 +222,7 @@ precision = 14
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
-; http://php.net/output-buffering
+; https://php.net/output-buffering
output_buffering = 4096
; You can redirect all of the output of your scripts to a function. For
@@ -237,7 +237,7 @@ output_buffering = 4096
; and you cannot use both "ob_gzhandler" and "zlib.output_compression".
; Note: output_handler must be empty if this is set 'On' !!!!
; Instead you must use zlib.output_handler.
-; http://php.net/output-handler
+; https://php.net/output-handler
;output_handler =
; URL rewriter function rewrites URL on the fly by using
@@ -266,16 +266,16 @@ output_buffering = 4096
; performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
; output_handler, or otherwise the output will be corrupted.
-; http://php.net/zlib.output-compression
+; https://php.net/zlib.output-compression
zlib.output_compression = Off
-; http://php.net/zlib.output-compression-level
+; https://php.net/zlib.output-compression-level
;zlib.output_compression_level = -1
; You cannot specify additional output handlers if zlib.output_compression
; is activated here. This setting does the same as output_handler but in
; a different order.
-; http://php.net/zlib.output-handler
+; https://php.net/zlib.output-handler
;zlib.output_handler =
; Implicit flush tells PHP to tell the output layer to flush itself
@@ -283,7 +283,7 @@ zlib.output_compression = Off
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block. Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
-; http://php.net/implicit-flush
+; https://php.net/implicit-flush
; Note: This directive is hardcoded to On for the CLI SAPI
implicit_flush = Off
@@ -314,22 +314,22 @@ serialize_precision = -1
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; Note: disables the realpath cache
-; http://php.net/open-basedir
+; https://php.net/open-basedir
;open_basedir =
; This directive allows you to disable certain functions.
; It receives a comma-delimited list of function names.
-; http://php.net/disable-functions
+; https://php.net/disable-functions
disable_functions =
; This directive allows you to disable certain classes.
; It receives a comma-delimited list of class names.
-; http://php.net/disable-classes
+; https://php.net/disable-classes
disable_classes =
; Colors for Syntax Highlighting mode. Anything that's acceptable in
; <span style="color: ???????"> would work.
-; http://php.net/syntax-highlighting
+; https://php.net/syntax-highlighting
;highlight.string = #DD0000
;highlight.comment = #FF9900
;highlight.keyword = #007700
@@ -340,24 +340,24 @@ disable_classes =
; the request. Consider enabling it if executing long requests, which may end up
; being interrupted by the user or a browser timing out. PHP's default behavior
; is to disable this feature.
-; http://php.net/ignore-user-abort
+; https://php.net/ignore-user-abort
;ignore_user_abort = On
; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; Note: if open_basedir is set, the cache is disabled
-; http://php.net/realpath-cache-size
+; https://php.net/realpath-cache-size
;realpath_cache_size = 4096k
; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
-; http://php.net/realpath-cache-ttl
+; https://php.net/realpath-cache-ttl
;realpath_cache_ttl = 120
; Enables or disables the circular reference collector.
-; http://php.net/zend.enable-gc
+; https://php.net/zend.enable-gc
zend.enable_gc = On
; If enabled, scripts may be written in encodings that are incompatible with
@@ -396,7 +396,7 @@ zend.exception_string_param_max_len = 0
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
-; http://php.net/expose-php
+; https://php.net/expose-php
expose_php = On
;;;;;;;;;;;;;;;;;;;
@@ -404,7 +404,7 @@ expose_php = On
;;;;;;;;;;;;;;;;;;;
; Maximum execution time of each script, in seconds
-; http://php.net/max-execution-time
+; https://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30
@@ -415,18 +415,18 @@ max_execution_time = 30
; Default Value: -1 (Unlimited)
; Development Value: 60 (60 seconds)
; Production Value: 60 (60 seconds)
-; http://php.net/max-input-time
+; https://php.net/max-input-time
max_input_time = 60
; Maximum input variable nesting level
-; http://php.net/max-input-nesting-level
+; https://php.net/max-input-nesting-level
;max_input_nesting_level = 64
; How many GET/POST/COOKIE input variables may be accepted
;max_input_vars = 1000
; Maximum amount of memory a script may consume
-; http://php.net/memory-limit
+; https://php.net/memory-limit
memory_limit = 128M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -482,7 +482,7 @@ memory_limit = 128M
; Default Value: E_ALL
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
-; http://php.net/error-reporting
+; https://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; This directive controls whether or not and where PHP will output errors,
@@ -499,7 +499,7 @@ error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-errors
+; https://php.net/display-errors
display_errors = Off
; The display of errors which occur during PHP's startup sequence are handled
@@ -508,7 +508,7 @@ display_errors = Off
; Default Value: On
; Development Value: On
; Production Value: Off
-; http://php.net/display-startup-errors
+; https://php.net/display-startup-errors
display_startup_errors = Off
; Besides displaying errors, PHP can also log errors to locations such as a
@@ -518,36 +518,36 @@ display_startup_errors = Off
; Default Value: Off
; Development Value: On
; Production Value: On
-; http://php.net/log-errors
+; https://php.net/log-errors
log_errors = On
; Set maximum length of log_errors. In error_log information about the source is
; added. The default is 1024 and 0 allows to not apply any maximum length at all.
-; http://php.net/log-errors-max-len
+; https://php.net/log-errors-max-len
log_errors_max_len = 1024
; Do not log repeated messages. Repeated errors must occur in same file on same
; line unless ignore_repeated_source is set true.
-; http://php.net/ignore-repeated-errors
+; https://php.net/ignore-repeated-errors
ignore_repeated_errors = Off
; Ignore source of message when ignoring repeated messages. When this setting
; is On you will not log errors with repeated messages from different files or
; source lines.
-; http://php.net/ignore-repeated-source
+; https://php.net/ignore-repeated-source
ignore_repeated_source = Off
; If this parameter is set to Off, then memory leaks will not be shown (on
; stdout or in the log). This is only effective in a debug compile, and if
; error reporting includes E_WARNING in the allowed list
-; http://php.net/report-memleaks
+; https://php.net/report-memleaks
report_memleaks = On
; This setting is off by default.
;report_zend_debug = 0
; Turn off normal error reporting and emit XML-RPC error XML
-; http://php.net/xmlrpc-errors
+; https://php.net/xmlrpc-errors
;xmlrpc_errors = 0
; An XML-RPC faultCode
@@ -557,40 +557,40 @@ report_memleaks = On
; error message as HTML for easier reading. This directive controls whether
; the error message is formatted as HTML or not.
; Note: This directive is hardcoded to Off for the CLI SAPI
-; http://php.net/html-errors
+; https://php.net/html-errors
;html_errors = On
; If html_errors is set to On *and* docref_root is not empty, then PHP
; produces clickable error messages that direct to a page describing the error
; or function causing the error in detail.
-; You can download a copy of the PHP manual from http://php.net/docs
+; You can download a copy of the PHP manual from https://php.net/docs
; and change docref_root to the base URL of your local copy including the
; leading '/'. You must also specify the file extension being used including
; the dot. PHP's default behavior is to leave these settings empty, in which
; case no links to documentation are generated.
; Note: Never use this feature for production boxes.
-; http://php.net/docref-root
+; https://php.net/docref-root
; Examples
;docref_root = "/phpmanual/"
-; http://php.net/docref-ext
+; https://php.net/docref-ext
;docref_ext = .html
; String to output before an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-prepend-string
+; https://php.net/error-prepend-string
; Example:
;error_prepend_string = "<span style='color: #ff0000'>"
; String to output after an error message. PHP's default behavior is to leave
; this setting blank.
-; http://php.net/error-append-string
+; https://php.net/error-append-string
; Example:
;error_append_string = "</span>"
; Log errors to specified file. PHP's default behavior is to leave this value
; empty.
-; http://php.net/error-log
+; https://php.net/error-log
; Example:
;error_log = php_errors.log
; Log errors to syslog (Event Log on Windows).
@@ -613,7 +613,7 @@ report_memleaks = On
; no-ctrl (all characters except control characters)
; all (all characters)
; raw (like "all", but messages are not split at newlines)
-; http://php.net/syslog.filter
+; https://php.net/syslog.filter
;syslog.filter = ascii
;windows.show_crt_warning
@@ -627,14 +627,14 @@ report_memleaks = On
; The separator used in PHP generated URLs to separate arguments.
; PHP's default setting is "&".
-; http://php.net/arg-separator.output
+; https://php.net/arg-separator.output
; Example:
;arg_separator.output = "&amp;"
; List of separator(s) used by PHP to parse input URLs into variables.
; PHP's default setting is "&".
; NOTE: Every character in this directive is considered as separator!
-; http://php.net/arg-separator.input
+; https://php.net/arg-separator.input
; Example:
;arg_separator.input = ";&"
@@ -648,7 +648,7 @@ report_memleaks = On
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
-; http://php.net/variables-order
+; https://php.net/variables-order
variables_order = "GPCS"
; This directive determines which super global data (G,P & C) should be
@@ -661,7 +661,7 @@ variables_order = "GPCS"
; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
-; http://php.net/request-order
+; https://php.net/request-order
request_order = "GP"
; This directive determines whether PHP registers $argv & $argc each time it
@@ -676,7 +676,7 @@ request_order = "GP"
; Default Value: On
; Development Value: Off
; Production Value: Off
-; http://php.net/register-argc-argv
+; https://php.net/register-argc-argv
register_argc_argv = Off
; When enabled, the ENV, REQUEST and SERVER variables are created when they're
@@ -684,7 +684,7 @@ register_argc_argv = Off
; variables are not used within a script, having this directive on will result
; in a performance gain. The PHP directive register_argc_argv must be disabled
; for this directive to have any effect.
-; http://php.net/auto-globals-jit
+; https://php.net/auto-globals-jit
auto_globals_jit = On
; Whether PHP will read the POST data.
@@ -693,48 +693,48 @@ auto_globals_jit = On
; and $_FILES to always be empty; the only way you will be able to read the
; POST data will be through the php://input stream wrapper. This can be useful
; to proxy requests or to process the POST data in a memory efficient fashion.
-; http://php.net/enable-post-data-reading
+; https://php.net/enable-post-data-reading
;enable_post_data_reading = Off
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
-; http://php.net/post-max-size
+; https://php.net/post-max-size
post_max_size = 8M
; Automatically add files before PHP document.
-; http://php.net/auto-prepend-file
+; https://php.net/auto-prepend-file
auto_prepend_file =
; Automatically add files after PHP document.
-; http://php.net/auto-append-file
+; https://php.net/auto-append-file
auto_append_file =
; By default, PHP will output a media type using the Content-Type header. To
; disable this, simply set it to be empty.
;
; PHP's built-in default media type is set to text/html.
-; http://php.net/default-mimetype
+; https://php.net/default-mimetype
default_mimetype = "text/html"
; PHP's default character set is set to UTF-8.
-; http://php.net/default-charset
+; https://php.net/default-charset
default_charset = "UTF-8"
; PHP internal character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/internal-encoding
+; https://php.net/internal-encoding
;internal_encoding =
; PHP input character encoding is set to empty.
; If empty, default_charset is used.
-; http://php.net/input-encoding
+; https://php.net/input-encoding
;input_encoding =
; PHP output character encoding is set to empty.
; If empty, default_charset is used.
; See also output_buffer.
-; http://php.net/output-encoding
+; https://php.net/output-encoding
;output_encoding =
;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -748,23 +748,23 @@ default_charset = "UTF-8"
;include_path = ".;c:\php\includes"
;
; PHP's default setting for include_path is ".;/path/to/php/pear"
-; http://php.net/include-path
+; https://php.net/include-path
; The root of the PHP pages, used only if nonempty.
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
; if you are running php as a CGI under any web server (other than IIS)
; see documentation for security issues. The alternate is to use the
; cgi.force_redirect configuration below
-; http://php.net/doc-root
+; https://php.net/doc-root
doc_root =
; The directory under which PHP opens the script using /~username used only
; if nonempty.
-; http://php.net/user-dir
+; https://php.net/user-dir
user_dir =
; Directory in which the loadable extensions (modules) reside.
-; http://php.net/extension-dir
+; https://php.net/extension-dir
;extension_dir = "./"
; On windows:
;extension_dir = "ext"
@@ -776,14 +776,14 @@ user_dir =
; Whether or not to enable the dl() function. The dl() function does NOT work
; properly in multithreaded servers, such as IIS or Zeus, and is automatically
; disabled on them.
-; http://php.net/enable-dl
+; https://php.net/enable-dl
enable_dl = Off
; cgi.force_redirect is necessary to provide security running PHP as a CGI under
; most web servers. Left undefined, PHP turns this on by default. You can
; turn it off here AT YOUR OWN RISK
; **You CAN safely turn this off for IIS, in fact, you MUST.**
-; http://php.net/cgi.force-redirect
+; https://php.net/cgi.force-redirect
;cgi.force_redirect = 1
; if cgi.nph is enabled it will force cgi to always sent Status: 200 with
@@ -794,7 +794,7 @@ enable_dl = Off
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
; will look for to know it is OK to continue execution. Setting this variable MAY
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
-; http://php.net/cgi.redirect-status-env
+; https://php.net/cgi.redirect-status-env
;cgi.redirect_status_env =
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
@@ -803,7 +803,7 @@ enable_dl = Off
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
-; http://php.net/cgi.fix-pathinfo
+; https://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside
@@ -815,7 +815,7 @@ enable_dl = Off
; security context that the request runs under. mod_fastcgi under Apache
; does not currently support this feature (03/17/2002)
; Set to 1 if running under IIS. Default is zero.
-; http://php.net/fastcgi.impersonate
+; https://php.net/fastcgi.impersonate
;fastcgi.impersonate = 1
; Disable logging through FastCGI connection. PHP's default behavior is to enable
@@ -827,14 +827,14 @@ enable_dl = Off
; is supported by Apache. When this option is set to 1, PHP will send
; RFC2616 compliant header.
; Default is zero.
-; http://php.net/cgi.rfc2616-headers
+; https://php.net/cgi.rfc2616-headers
;cgi.rfc2616_headers = 0
; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #!
; (shebang) at the top of the running script. This line might be needed if the
; script support running both as stand-alone script and via PHP CGI<. PHP in CGI
; mode skips this line and ignores its content if this directive is turned on.
-; http://php.net/cgi.check-shebang-line
+; https://php.net/cgi.check-shebang-line
;cgi.check_shebang_line=1
;;;;;;;;;;;;;;;;
@@ -842,16 +842,16 @@ enable_dl = Off
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
-; http://php.net/file-uploads
+; https://php.net/file-uploads
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
-; http://php.net/upload-tmp-dir
+; https://php.net/upload-tmp-dir
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
-; http://php.net/upload-max-filesize
+; https://php.net/upload-max-filesize
upload_max_filesize = 2M
; Maximum number of files that can be uploaded via a single request
@@ -862,24 +862,24 @@ max_file_uploads = 20
;;;;;;;;;;;;;;;;;;
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-fopen
+; https://php.net/allow-url-fopen
allow_url_fopen = On
-; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
-; http://php.net/allow-url-include
+; Whether to allow include/require to open URLs (like https:// or ftp://) as files.
+; https://php.net/allow-url-include
allow_url_include = Off
; Define the anonymous ftp password (your email address). PHP's default setting
; for this is empty.
-; http://php.net/from
+; https://php.net/from
;from="john@doe.com"
; Define the User-Agent string. PHP's default setting for this is empty.
-; http://php.net/user-agent
+; https://php.net/user-agent
;user_agent="PHP"
; Default timeout for socket based streams (seconds)
-; http://php.net/default-socket-timeout
+; https://php.net/default-socket-timeout
default_socket_timeout = 60
; If your scripts have to deal with files from Macintosh systems,
@@ -887,7 +887,7 @@ default_socket_timeout = 60
; unix or win32 systems, setting this flag will cause PHP to
; automatically detect the EOL character in those files so that
; fgets() and file() will work regardless of the source of the file.
-; http://php.net/auto-detect-line-endings
+; https://php.net/auto-detect-line-endings
;auto_detect_line_endings = Off
;;;;;;;;;;;;;;;;;;;;;;
@@ -946,7 +946,7 @@ default_socket_timeout = 60
;extension=shmop
; The MIBS data available in the PHP distribution must be installed.
-; See http://www.php.net/manual/en/snmp.installation.php
+; See https://www.php.net/manual/en/snmp.installation.php
;extension=snmp
;extension=soap
@@ -968,26 +968,26 @@ cli_server.color = On
[Date]
; Defines the default timezone used by the date functions
-; http://php.net/date.timezone
+; https://php.net/date.timezone
;date.timezone =
-; http://php.net/date.default-latitude
+; https://php.net/date.default-latitude
;date.default_latitude = 31.7667
-; http://php.net/date.default-longitude
+; https://php.net/date.default-longitude
;date.default_longitude = 35.2333
-; http://php.net/date.sunrise-zenith
+; https://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.833333
-; http://php.net/date.sunset-zenith
+; https://php.net/date.sunset-zenith
;date.sunset_zenith = 90.833333
[filter]
-; http://php.net/filter.default
+; https://php.net/filter.default
;filter.default = unsafe_raw
-; http://php.net/filter.default-flags
+; https://php.net/filter.default-flags
;filter.default_flags =
[iconv]
@@ -1025,7 +1025,7 @@ cli_server.color = On
[sqlite3]
; Directory pointing to SQLite3 extensions
-; http://php.net/sqlite3.extension-dir
+; https://php.net/sqlite3.extension-dir
;sqlite3.extension_dir =
; SQLite defensive mode flag (only available from SQLite 3.26+)
@@ -1039,14 +1039,14 @@ cli_server.color = On
[Pcre]
; PCRE library backtracking limit.
-; http://php.net/pcre.backtrack-limit
+; https://php.net/pcre.backtrack-limit
;pcre.backtrack_limit=100000
; PCRE library recursion limit.
; Please note that if you set this value to a high number you may consume all
; the available process stack and eventually crash PHP (due to reaching the
; stack size limit imposed by the Operating System).
-; http://php.net/pcre.recursion-limit
+; https://php.net/pcre.recursion-limit
;pcre.recursion_limit=100000
; Enables or disables JIT compilation of patterns. This requires the PCRE
@@ -1055,7 +1055,7 @@ cli_server.color = On
[Pdo]
; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off"
-; http://php.net/pdo-odbc.connection-pooling
+; https://php.net/pdo-odbc.connection-pooling
;pdo_odbc.connection_pooling=strict
[Pdo_mysql]
@@ -1064,27 +1064,27 @@ cli_server.color = On
pdo_mysql.default_socket=
[Phar]
-; http://php.net/phar.readonly
+; https://php.net/phar.readonly
;phar.readonly = On
-; http://php.net/phar.require-hash
+; https://php.net/phar.require-hash
;phar.require_hash = On
;phar.cache_list =
[mail function]
; For Win32 only.
-; http://php.net/smtp
+; https://php.net/smtp
SMTP = localhost
-; http://php.net/smtp-port
+; https://php.net/smtp-port
smtp_port = 25
; For Win32 only.
-; http://php.net/sendmail-from
+; https://php.net/sendmail-from
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
-; http://php.net/sendmail-path
+; https://php.net/sendmail-path
;sendmail_path =
; Force the addition of the specified parameters to be passed as extra parameters
@@ -1102,13 +1102,13 @@ mail.add_x_header = Off
;mail.log = syslog
[ODBC]
-; http://php.net/odbc.default-db
+; https://php.net/odbc.default-db
;odbc.default_db = Not yet implemented
-; http://php.net/odbc.default-user
+; https://php.net/odbc.default-user
;odbc.default_user = Not yet implemented
-; http://php.net/odbc.default-pw
+; https://php.net/odbc.default-pw
;odbc.default_pw = Not yet implemented
; Controls the ODBC cursor model.
@@ -1116,68 +1116,68 @@ mail.add_x_header = Off
;odbc.default_cursortype
; Allow or prevent persistent links.
-; http://php.net/odbc.allow-persistent
+; https://php.net/odbc.allow-persistent
odbc.allow_persistent = On
; Check that a connection is still valid before reuse.
-; http://php.net/odbc.check-persistent
+; https://php.net/odbc.check-persistent
odbc.check_persistent = On
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/odbc.max-persistent
+; https://php.net/odbc.max-persistent
odbc.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
-; http://php.net/odbc.max-links
+; https://php.net/odbc.max-links
odbc.max_links = -1
; Handling of LONG fields. Returns number of bytes to variables. 0 means
; passthru.
-; http://php.net/odbc.defaultlrl
+; https://php.net/odbc.defaultlrl
odbc.defaultlrl = 4096
; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
; of odbc.defaultlrl and odbc.defaultbinmode
-; http://php.net/odbc.defaultbinmode
+; https://php.net/odbc.defaultbinmode
odbc.defaultbinmode = 1
[MySQLi]
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/mysqli.max-persistent
+; https://php.net/mysqli.max-persistent
mysqli.max_persistent = -1
; Allow accessing, from PHP's perspective, local files with LOAD DATA statements
-; http://php.net/mysqli.allow_local_infile
+; https://php.net/mysqli.allow_local_infile
;mysqli.allow_local_infile = On
; Allow or prevent persistent links.
-; http://php.net/mysqli.allow-persistent
+; https://php.net/mysqli.allow-persistent
mysqli.allow_persistent = On
; Maximum number of links. -1 means no limit.
-; http://php.net/mysqli.max-links
+; https://php.net/mysqli.max-links
mysqli.max_links = -1
; Default port number for mysqli_connect(). If unset, mysqli_connect() will use
; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
; at MYSQL_PORT.
-; http://php.net/mysqli.default-port
+; https://php.net/mysqli.default-port
mysqli.default_port = 3306
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
-; http://php.net/mysqli.default-socket
+; https://php.net/mysqli.default-socket
mysqli.default_socket =
; Default host for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-host
+; https://php.net/mysqli.default-host
mysqli.default_host =
; Default user for mysqli_connect() (doesn't apply in safe mode).
-; http://php.net/mysqli.default-user
+; https://php.net/mysqli.default-user
mysqli.default_user =
; Default password for mysqli_connect() (doesn't apply in safe mode).
@@ -1185,7 +1185,7 @@ mysqli.default_user =
; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw")
; and reveal this password! And of course, any users with read access to this
; file will be able to reveal the password as well.
-; http://php.net/mysqli.default-pw
+; https://php.net/mysqli.default-pw
mysqli.default_pw =
; Allow or prevent reconnect
@@ -1202,7 +1202,7 @@ mysqlnd.collect_memory_statistics = Off
; Records communication from all extensions using mysqlnd to the specified log
; file.
-; http://php.net/mysqlnd.debug
+; https://php.net/mysqlnd.debug
;mysqlnd.debug =
; Defines which queries will be logged.
@@ -1229,25 +1229,25 @@ mysqlnd.collect_memory_statistics = Off
; Connection: Enables privileged connections using external
; credentials (OCI_SYSOPER, OCI_SYSDBA)
-; http://php.net/oci8.privileged-connect
+; https://php.net/oci8.privileged-connect
;oci8.privileged_connect = Off
; Connection: The maximum number of persistent OCI8 connections per
; process. Using -1 means no limit.
-; http://php.net/oci8.max-persistent
+; https://php.net/oci8.max-persistent
;oci8.max_persistent = -1
; Connection: The maximum number of seconds a process is allowed to
; maintain an idle persistent connection. Using -1 means idle
; persistent connections will be maintained forever.
-; http://php.net/oci8.persistent-timeout
+; https://php.net/oci8.persistent-timeout
;oci8.persistent_timeout = -1
; Connection: The number of seconds that must pass before issuing a
; ping during oci_pconnect() to check the connection validity. When
; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
; pings completely.
-; http://php.net/oci8.ping-interval
+; https://php.net/oci8.ping-interval
;oci8.ping_interval = 60
; Connection: Set this to a user chosen connection class to be used
@@ -1265,59 +1265,59 @@ mysqlnd.collect_memory_statistics = Off
; Tuning: This option enables statement caching, and specifies how
; many statements to cache. Using 0 disables statement caching.
-; http://php.net/oci8.statement-cache-size
+; https://php.net/oci8.statement-cache-size
;oci8.statement_cache_size = 20
; Tuning: Enables statement prefetching and sets the default number of
; rows that will be fetched automatically after statement execution.
-; http://php.net/oci8.default-prefetch
+; https://php.net/oci8.default-prefetch
;oci8.default_prefetch = 100
; Compatibility. Using On means oci_close() will not close
; oci_connect() and oci_new_connect() connections.
-; http://php.net/oci8.old-oci-close-semantics
+; https://php.net/oci8.old-oci-close-semantics
;oci8.old_oci_close_semantics = Off
[PostgreSQL]
; Allow or prevent persistent links.
-; http://php.net/pgsql.allow-persistent
+; https://php.net/pgsql.allow-persistent
pgsql.allow_persistent = On
; Detect broken persistent links always with pg_pconnect().
; Auto reset feature requires a little overheads.
-; http://php.net/pgsql.auto-reset-persistent
+; https://php.net/pgsql.auto-reset-persistent
pgsql.auto_reset_persistent = Off
; Maximum number of persistent links. -1 means no limit.
-; http://php.net/pgsql.max-persistent
+; https://php.net/pgsql.max-persistent
pgsql.max_persistent = -1
; Maximum number of links (persistent+non persistent). -1 means no limit.
-; http://php.net/pgsql.max-links
+; https://php.net/pgsql.max-links
pgsql.max_links = -1
; Ignore PostgreSQL backends Notice message or not.
; Notice message logging require a little overheads.
-; http://php.net/pgsql.ignore-notice
+; https://php.net/pgsql.ignore-notice
pgsql.ignore_notice = 0
; Log PostgreSQL backends Notice message or not.
; Unless pgsql.ignore_notice=0, module cannot log notice message.
-; http://php.net/pgsql.log-notice
+; https://php.net/pgsql.log-notice
pgsql.log_notice = 0
[bcmath]
; Number of decimal digits for all bcmath functions.
-; http://php.net/bcmath.scale
+; https://php.net/bcmath.scale
bcmath.scale = 0
[browscap]
-; http://php.net/browscap
+; https://php.net/browscap
;browscap = extra/browscap.ini
[Session]
; Handler used to store/retrieve data.
-; http://php.net/session.save-handler
+; https://php.net/session.save-handler
session.save_handler = files
; Argument passed to save_handler. In the case of files, this is the path
@@ -1346,7 +1346,7 @@ session.save_handler = files
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
-; http://php.net/session.save-path
+; https://php.net/session.save-path
;session.save_path = "/tmp"
; Whether to use strict session mode.
@@ -1359,42 +1359,42 @@ session.save_handler = files
session.use_strict_mode = 0
; Whether to use cookies.
-; http://php.net/session.use-cookies
+; https://php.net/session.use-cookies
session.use_cookies = 1
-; http://php.net/session.cookie-secure
+; https://php.net/session.cookie-secure
;session.cookie_secure =
; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
-; http://php.net/session.use-only-cookies
+; https://php.net/session.use-only-cookies
session.use_only_cookies = 1
; Name of the session (used as cookie name).
-; http://php.net/session.name
+; https://php.net/session.name
session.name = PHPSESSID
; Initialize session on request startup.
-; http://php.net/session.auto-start
+; https://php.net/session.auto-start
session.auto_start = 0
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
-; http://php.net/session.cookie-lifetime
+; https://php.net/session.cookie-lifetime
session.cookie_lifetime = 0
; The path for which the cookie is valid.
-; http://php.net/session.cookie-path
+; https://php.net/session.cookie-path
session.cookie_path = /
; The domain for which the cookie is valid.
-; http://php.net/session.cookie-domain
+; https://php.net/session.cookie-domain
session.cookie_domain =
; Whether or not to add the httpOnly flag to the cookie, which makes it
; inaccessible to browser scripting languages such as JavaScript.
-; http://php.net/session.cookie-httponly
+; https://php.net/session.cookie-httponly
session.cookie_httponly =
; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
@@ -1404,7 +1404,7 @@ session.cookie_httponly =
session.cookie_samesite =
; Handler used to serialize data. php is the standard serializer of PHP.
-; http://php.net/session.serialize-handler
+; https://php.net/session.serialize-handler
session.serialize_handler = php
; Defines the probability that the 'garbage collection' process is started on every
@@ -1413,7 +1413,7 @@ session.serialize_handler = php
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.gc-probability
+; https://php.net/session.gc-probability
session.gc_probability = 1
; Defines the probability that the 'garbage collection' process is started on every
@@ -1423,12 +1423,12 @@ session.gc_probability = 1
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
-; http://php.net/session.gc-divisor
+; https://php.net/session.gc-divisor
session.gc_divisor = 1000
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
-; http://php.net/session.gc-maxlifetime
+; https://php.net/session.gc-maxlifetime
session.gc_maxlifetime = 1440
; NOTE: If you are using the subdirectory option for storing session files
@@ -1442,16 +1442,16 @@ session.gc_maxlifetime = 1440
; Check HTTP Referer to invalidate externally stored URLs containing ids.
; HTTP_REFERER has to contain this substring for the session to be
; considered as valid.
-; http://php.net/session.referer-check
+; https://php.net/session.referer-check
session.referer_check =
; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
-; http://php.net/session.cache-limiter
+; https://php.net/session.cache-limiter
session.cache_limiter = nocache
; Document expires after n minutes.
-; http://php.net/session.cache-expire
+; https://php.net/session.cache-expire
session.cache_expire = 180
; trans sid support is disabled by default.
@@ -1463,13 +1463,13 @@ session.cache_expire = 180
; in publicly accessible computer.
; - User may access your site with the same session ID
; always using URL stored in browser's history or bookmarks.
-; http://php.net/session.use-trans-sid
+; https://php.net/session.use-trans-sid
session.use_trans_sid = 0
; Set session ID character length. This value could be between 22 to 256.
; Shorter length than default is supported only for compatibility reason.
; Users should use 32 or more chars.
-; http://php.net/session.sid-length
+; https://php.net/session.sid-length
; Default Value: 32
; Development Value: 26
; Production Value: 26
@@ -1484,7 +1484,7 @@ session.sid_length = 26
; Default Value: "a=href,area=href,frame=src,form="
; Development Value: "a=href,area=href,frame=src,form="
; Production Value: "a=href,area=href,frame=src,form="
-; http://php.net/url-rewriter.tags
+; https://php.net/url-rewriter.tags
session.trans_sid_tags = "a=href,area=href,frame=src,form="
; URL rewriter does not rewrite absolute URLs by default.
@@ -1509,14 +1509,14 @@ session.trans_sid_tags = "a=href,area=href,frame=src,form="
; Default Value: 4
; Development Value: 5
; Production Value: 5
-; http://php.net/session.hash-bits-per-character
+; https://php.net/session.hash-bits-per-character
session.sid_bits_per_character = 5
; Enable upload progress tracking in $_SESSION
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.enabled
+; https://php.net/session.upload-progress.enabled
;session.upload_progress.enabled = On
; Cleanup the progress information as soon as all POST data has been read
@@ -1524,14 +1524,14 @@ session.sid_bits_per_character = 5
; Default Value: On
; Development Value: On
; Production Value: On
-; http://php.net/session.upload-progress.cleanup
+; https://php.net/session.upload-progress.cleanup
;session.upload_progress.cleanup = On
; A prefix used for the upload progress key in $_SESSION
; Default Value: "upload_progress_"
; Development Value: "upload_progress_"
; Production Value: "upload_progress_"
-; http://php.net/session.upload-progress.prefix
+; https://php.net/session.upload-progress.prefix
;session.upload_progress.prefix = "upload_progress_"
; The index name (concatenated with the prefix) in $_SESSION
@@ -1539,7 +1539,7 @@ session.sid_bits_per_character = 5
; Default Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Development Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Production Value: "PHP_SESSION_UPLOAD_PROGRESS"
-; http://php.net/session.upload-progress.name
+; https://php.net/session.upload-progress.name
;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
; How frequently the upload progress should be updated.
@@ -1547,18 +1547,18 @@ session.sid_bits_per_character = 5
; Default Value: "1%"
; Development Value: "1%"
; Production Value: "1%"
-; http://php.net/session.upload-progress.freq
+; https://php.net/session.upload-progress.freq
;session.upload_progress.freq = "1%"
; The minimum delay between updates, in seconds
; Default Value: 1
; Development Value: 1
; Production Value: 1
-; http://php.net/session.upload-progress.min-freq
+; https://php.net/session.upload-progress.min-freq
;session.upload_progress.min_freq = "1"
; Only write session data when session data is changed. Enabled by default.
-; http://php.net/session.lazy-write
+; https://php.net/session.lazy-write
;session.lazy_write = On
[Assertion]
@@ -1570,48 +1570,48 @@ session.sid_bits_per_character = 5
; Default Value: 1
; Development Value: 1
; Production Value: -1
-; http://php.net/zend.assertions
+; https://php.net/zend.assertions
zend.assertions = -1
; Assert(expr); active by default.
-; http://php.net/assert.active
+; https://php.net/assert.active
;assert.active = On
; Throw an AssertionError on failed assertions
-; http://php.net/assert.exception
+; https://php.net/assert.exception
;assert.exception = On
; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active)
-; http://php.net/assert.warning
+; https://php.net/assert.warning
;assert.warning = On
; Don't bail out by default.
-; http://php.net/assert.bail
+; https://php.net/assert.bail
;assert.bail = Off
; User-function to be called if an assertion fails.
-; http://php.net/assert.callback
+; https://php.net/assert.callback
;assert.callback = 0
[COM]
; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
-; http://php.net/com.typelib-file
+; https://php.net/com.typelib-file
;com.typelib_file =
; allow Distributed-COM calls
-; http://php.net/com.allow-dcom
+; https://php.net/com.allow-dcom
;com.allow_dcom = true
; autoregister constants of a component's typlib on com_load()
-; http://php.net/com.autoregister-typelib
+; https://php.net/com.autoregister-typelib
;com.autoregister_typelib = true
; register constants casesensitive
-; http://php.net/com.autoregister-casesensitive
+; https://php.net/com.autoregister-casesensitive
;com.autoregister_casesensitive = false
; show warnings on duplicate constant registrations
-; http://php.net/com.autoregister-verbose
+; https://php.net/com.autoregister-verbose
;com.autoregister_verbose = true
; The default character set code-page to use when passing strings to and from COM objects.
@@ -1625,7 +1625,7 @@ zend.assertions = -1
[mbstring]
; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order.
-; http://php.net/mbstring.language
+; https://php.net/mbstring.language
;mbstring.language = Japanese
; Use of this INI entry is deprecated, use global internal_encoding instead.
@@ -1640,7 +1640,7 @@ zend.assertions = -1
; mbstring.encoding_translation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is: default_charset < input_encoding < mbstring.http_input
-; http://php.net/mbstring.http-input
+; https://php.net/mbstring.http-input
;mbstring.http_input =
; Use of this INI entry is deprecated, use global output_encoding instead.
@@ -1650,7 +1650,7 @@ zend.assertions = -1
; The precedence is: default_charset < output_encoding < mbstring.http_output
; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed.
-; http://php.net/mbstring.http-output
+; https://php.net/mbstring.http-output
;mbstring.http_output =
; enable automatic encoding translation according to
@@ -1658,17 +1658,17 @@ zend.assertions = -1
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
-; http://php.net/mbstring.encoding-translation
+; https://php.net/mbstring.encoding-translation
;mbstring.encoding_translation = Off
; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language
-; http://php.net/mbstring.detect-order
+; https://php.net/mbstring.detect-order
;mbstring.detect_order = auto
; substitute_character used when character cannot be converted
; one from another
-; http://php.net/mbstring.substitute-character
+; https://php.net/mbstring.substitute-character
;mbstring.substitute_character = none
; Enable strict encoding detection.
@@ -1691,7 +1691,7 @@ zend.assertions = -1
; Tell the jpeg decode to ignore warnings and try to create
; a gd image. The warning will then be displayed as notices
; disabled by default
-; http://php.net/gd.jpeg-ignore-warning
+; https://php.net/gd.jpeg-ignore-warning
;gd.jpeg_ignore_warning = 1
[exif]
@@ -1700,47 +1700,47 @@ zend.assertions = -1
; given by corresponding encode setting. When empty mbstring.internal_encoding
; is used. For the decode settings you can distinguish between motorola and
; intel byte order. A decode setting cannot be empty.
-; http://php.net/exif.encode-unicode
+; https://php.net/exif.encode-unicode
;exif.encode_unicode = ISO-8859-15
-; http://php.net/exif.decode-unicode-motorola
+; https://php.net/exif.decode-unicode-motorola
;exif.decode_unicode_motorola = UCS-2BE
-; http://php.net/exif.decode-unicode-intel
+; https://php.net/exif.decode-unicode-intel
;exif.decode_unicode_intel = UCS-2LE
-; http://php.net/exif.encode-jis
+; https://php.net/exif.encode-jis
;exif.encode_jis =
-; http://php.net/exif.decode-jis-motorola
+; https://php.net/exif.decode-jis-motorola
;exif.decode_jis_motorola = JIS
-; http://php.net/exif.decode-jis-intel
+; https://php.net/exif.decode-jis-intel
;exif.decode_jis_intel = JIS
[Tidy]
; The path to a default tidy configuration file to use when using tidy
-; http://php.net/tidy.default-config
+; https://php.net/tidy.default-config
;tidy.default_config = /usr/local/lib/php/default.tcfg
; Should tidy clean and repair output automatically?
; WARNING: Do not use this option if you are generating non-html content
; such as dynamic images
-; http://php.net/tidy.clean-output
+; https://php.net/tidy.clean-output
tidy.clean_output = Off
[soap]
; Enables or disables WSDL caching feature.
-; http://php.net/soap.wsdl-cache-enabled
+; https://php.net/soap.wsdl-cache-enabled
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
-; http://php.net/soap.wsdl-cache-dir
+; https://php.net/soap.wsdl-cache-dir
soap.wsdl_cache_dir="/tmp"
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
-; http://php.net/soap.wsdl-cache-ttl
+; https://php.net/soap.wsdl-cache-ttl
soap.wsdl_cache_ttl=86400
; Sets the size of the cache limit. (Max. number of WSDL files to cache)
@@ -1895,12 +1895,12 @@ ldap.max_links = -1
; Specifies a PHP script that is going to be compiled and executed at server
; start-up.
-; http://php.net/opcache.preload
+; https://php.net/opcache.preload
;opcache.preload=
; Preloading code as root is not allowed for security reasons. This directive
; facilitates to let the preloading to be run as another user.
-; http://php.net/opcache.preload_user
+; https://php.net/opcache.preload_user
;opcache.preload_user=
; Prevents caching files that are less than this number of seconds old. It
diff --git a/run-tests.php b/run-tests.php
index 00881cf779..7cb8fed1be 100755
--- a/run-tests.php
+++ b/run-tests.php
@@ -121,6 +121,10 @@ Options:
--color
--no-color Do/Don't colorize the result type in the test result.
+ --repeat [n]
+ Run the tests multiple times in the same process and check the
+ output of the last execution (CLI SAPI only).
+
HELP;
}
@@ -147,7 +151,7 @@ function main(): void
$repeat, $result_tests_file, $slow_min_ms, $start_time, $switch,
$temp_source, $temp_target, $test_cnt, $test_dirs,
$test_files, $test_idx, $test_list, $test_results, $testfile,
- $user_tests, $valgrind, $sum_results, $shuffle, $file_cache;
+ $user_tests, $valgrind, $sum_results, $shuffle, $file_cache, $num_repeats;
// Parallel testing
global $workers, $workerID;
global $context_line_count;
@@ -405,6 +409,7 @@ function main(): void
$shuffle = false;
$workers = null;
$context_line_count = 3;
+ $num_repeats = 1;
$cfgtypes = ['show', 'keep'];
$cfgfiles = ['skip', 'php', 'clean', 'out', 'diff', 'exp', 'mem'];
@@ -623,6 +628,10 @@ function main(): void
. ':print_suppressions=0';
}
break;
+ case '--repeat':
+ $num_repeats = (int) $argv[++$i];
+ $environment['SKIP_REPEAT'] = 1;
+ break;
//case 'w'
case '-':
// repeat check with full switch
@@ -1802,6 +1811,13 @@ function show_file_block(string $file, string $block, ?string $section = null):
}
}
+function skip_test(string $tested, string $tested_file, string $shortname, string $reason) {
+ show_result('SKIP', $tested, $tested_file, "reason: $reason");
+ junit_init_suite(junit_get_suitename_for($shortname));
+ junit_mark_test_as('SKIP', $shortname, $tested, 0, $reason);
+ return 'SKIPPED';
+}
+
//
// Run an individual test case.
//
@@ -1818,6 +1834,7 @@ function run_test(string $php, $file, array $env): string
global $no_file_cache;
global $slow_min_ms;
global $preload, $file_cache;
+ global $num_repeats;
// Parallel testing
global $workerID;
$temp_filenames = null;
@@ -1911,6 +1928,10 @@ TEST $file
}
}
+ $shortname = str_replace(TEST_PHP_SRCDIR . '/', '', $file);
+ $tested_file = $shortname;
+ $tested = trim($section_text['TEST']);
+
// the redirect section allows a set of tests to be reused outside of
// a given test dir
if ($bork_info === null) {
@@ -1928,6 +1949,10 @@ TEST $file
unset($section_text['FILEEOF']);
}
+ if ($num_repeats > 1 && isset($section_text['FILE_EXTERNAL'])) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with FILE_EXTERNAL might not be repeatable');
+ }
+
foreach (['FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX'] as $prefix) {
$key = $prefix . '_EXTERNAL';
@@ -1951,9 +1976,6 @@ TEST $file
}
fclose($fp);
- $shortname = str_replace(TEST_PHP_SRCDIR . '/', '', $file);
- $tested_file = $shortname;
-
if ($bork_info !== null) {
show_result("BORK", $bork_info, $tested_file);
$PHP_FAILED_TESTS['BORKED'][] = [
@@ -1983,8 +2005,6 @@ TEST $file
$cmdRedirect = '';
}
- $tested = trim($section_text['TEST']);
-
/* For GET/POST/PUT tests, check if cgi sapi is available and if it is, use it. */
if (array_key_exists('CGI', $section_text) || !empty($section_text['GET']) || !empty($section_text['POST']) || !empty($section_text['GZIP_POST']) || !empty($section_text['DEFLATE_POST']) || !empty($section_text['POST_RAW']) || !empty($section_text['PUT']) || !empty($section_text['COOKIE']) || !empty($section_text['EXPECTHEADERS'])) {
if (isset($php_cgi)) {
@@ -1999,13 +2019,12 @@ TEST $file
} elseif (file_exists(dirname($php) . "/php-cgi")) {
$php = realpath(dirname($php) . "/php-cgi") . ' -C ';
} else {
- show_result('SKIP', $tested, $tested_file, "reason: CGI not available");
-
- junit_init_suite(junit_get_suitename_for($shortname));
- junit_mark_test_as('SKIP', $shortname, $tested, 0, 'CGI not available');
- return 'SKIPPED';
+ return skip_test($tested, $tested_file, $shortname, 'CGI not available');
}
}
+ if ($num_repeats > 1) {
+ return skip_test($tested, $tested_file, $shortname, 'CGI does not support --repeat');
+ }
$uses_cgi = true;
}
@@ -2023,11 +2042,22 @@ TEST $file
// be run straight away. For example, EXTENSIONS, SKIPIF, CLEAN.
$extra_options = '-rr';
} else {
- show_result('SKIP', $tested, $tested_file, "reason: phpdbg not available");
+ return skip_test($tested, $tested_file, $shortname, 'phpdbg not available');
+ }
+ if ($num_repeats > 1) {
+ return skip_test($tested, $tested_file, $shortname, 'phpdbg does not support --repeat');
+ }
+ }
- junit_init_suite(junit_get_suitename_for($shortname));
- junit_mark_test_as('SKIP', $shortname, $tested, 0, 'phpdbg not available');
- return 'SKIPPED';
+ if ($num_repeats > 1) {
+ if (array_key_exists('CLEAN', $section_text)) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with CLEAN might not be repeatable');
+ }
+ if (array_key_exists('STDIN', $section_text)) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with STDIN might not be repeatable');
+ }
+ if (array_key_exists('CAPTURE_STDIO', $section_text)) {
+ return skip_test($tested, $tested_file, $shortname, 'Test with CAPTURE_STDIO might not be repeatable');
}
}
@@ -2173,6 +2203,9 @@ TEST $file
// even though all the files are re-created.
$ini_settings['opcache.validate_timestamps'] = '0';
}
+ } else if ($num_repeats > 1) {
+ // Make sure warnings still show up on the second run.
+ $ini_settings['opcache.record_warnings'] = '1';
}
// Any special ini settings
@@ -2183,6 +2216,10 @@ TEST $file
$replacement = IS_WINDOWS ? '"' . PHP_BINARY . ' -r \"while ($in = fgets(STDIN)) echo $in;\" > $1"' : 'tee $1 >/dev/null';
$section_text['INI'] = preg_replace('/{MAIL:(\S+)}/', $replacement, $section_text['INI']);
settings2array(preg_split("/[\n\r]+/", $section_text['INI']), $ini_settings);
+
+ if ($num_repeats > 1 && isset($ini_settings['opcache.opt_debug_level'])) {
+ return skip_test($tested, $tested_file, $shortname, 'opt_debug_level tests are not repeatable');
+ }
}
$ini_settings = settings2params($ini_settings);
@@ -2484,7 +2521,8 @@ TEST $file
$env['CONTENT_TYPE'] = '';
$env['CONTENT_LENGTH'] = '';
- $cmd = "$php $pass_options $ini_settings -f \"$test_file\" $args$cmdRedirect";
+ $repeat_option = $num_repeats > 1 ? "--repeat $num_repeats" : "";
+ $cmd = "$php $pass_options $repeat_option $ini_settings -f \"$test_file\" $args$cmdRedirect";
}
if ($valgrind) {
@@ -2557,6 +2595,25 @@ COMMAND $cmd
}
}
+ if ($num_repeats > 1) {
+ // In repeat mode, retain the output before the first execution,
+ // and of the last execution. Do this early, because the trimming below
+ // makes the newline handling complicated.
+ $separator1 = "Executing for the first time...\n";
+ $separator1_pos = strpos($out, $separator1);
+ if ($separator1_pos !== false) {
+ $separator2 = "Finished execution, repeating...\n";
+ $separator2_pos = strrpos($out, $separator2);
+ if ($separator2_pos !== false) {
+ $out = substr($out, 0, $separator1_pos)
+ . substr($out, $separator2_pos + strlen($separator2));
+ } else {
+ $out = substr($out, 0, $separator1_pos)
+ . substr($out, $separator1_pos + strlen($separator1));
+ }
+ }
+ }
+
// Does the output match what is expected?
$output = preg_replace("/\r\n/", "\n", trim($out));
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index d28f5a5378..5092fb0ffd 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -172,6 +172,9 @@ const opt_struct OPTIONS[] = {
{14, 1, "ri"},
{14, 1, "rextinfo"},
{15, 0, "ini"},
+ /* Internal testing option -- may be changed or removed without notice,
+ * including in patch releases. */
+ {16, 1, "repeat"},
{'-', 0, NULL} /* end of args */
};
@@ -529,7 +532,7 @@ static void php_cli_usage(char *argv0)
static php_stream *s_in_process = NULL;
-static void cli_register_file_handles(void) /* {{{ */
+static void cli_register_file_handles(zend_bool no_close) /* {{{ */
{
php_stream *s_in, *s_out, *s_err;
php_stream_context *sc_in=NULL, *sc_out=NULL, *sc_err=NULL;
@@ -546,11 +549,11 @@ static void cli_register_file_handles(void) /* {{{ */
return;
}
-#if PHP_DEBUG
- /* do not close stdout and stderr */
- s_out->flags |= PHP_STREAM_FLAG_NO_CLOSE;
- s_err->flags |= PHP_STREAM_FLAG_NO_CLOSE;
-#endif
+ if (no_close) {
+ s_in->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+ s_out->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+ s_err->flags |= PHP_STREAM_FLAG_NO_CLOSE;
+ }
s_in_process = s_in;
@@ -614,6 +617,8 @@ static int do_cli(int argc, char **argv) /* {{{ */
int interactive=0;
const char *param_error=NULL;
int hide_argv = 0;
+ int num_repeats = 1;
+ pid_t pid = getpid();
zend_try {
@@ -839,6 +844,9 @@ static int do_cli(int argc, char **argv) /* {{{ */
case 15:
behavior = PHP_MODE_SHOW_INI_CONFIG;
break;
+ case 16:
+ num_repeats = atoi(php_optarg);
+ break;
default:
break;
}
@@ -873,6 +881,12 @@ static int do_cli(int argc, char **argv) /* {{{ */
fflush(stdout);
}
+ if (num_repeats > 1) {
+ fprintf(stdout, "Executing for the first time...\n");
+ fflush(stdout);
+ }
+
+do_repeat:
/* only set script_file if not set already and not in direct mode and not at end of parameter list */
if (argc > php_optind
&& !script_file
@@ -940,7 +954,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
switch (behavior) {
case PHP_MODE_STANDARD:
if (strcmp(file_handle.filename, "Standard input code")) {
- cli_register_file_handles();
+ cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
}
if (interactive && cli_shell_callbacks.cli_shell_run) {
@@ -975,7 +989,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
}
break;
case PHP_MODE_CLI_DIRECT:
- cli_register_file_handles();
+ cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
zend_eval_string_ex(exec_direct, NULL, "Command line code", 1);
break;
@@ -985,7 +999,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
size_t len, index = 0;
zval argn, argi;
- cli_register_file_handles();
+ cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
if (exec_begin) {
zend_eval_string_ex(exec_begin, NULL, "Command line begin code", 1);
@@ -1112,6 +1126,12 @@ out:
if (translated_path) {
free(translated_path);
}
+ /* Don't repeat fork()ed processes. */
+ if (--num_repeats && pid == getpid()) {
+ fprintf(stdout, "Finished execution, repeating...\n");
+ fflush(stdout);
+ goto do_repeat;
+ }
return EG(exit_status);
err:
sapi_deactivate();
diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c
index a32b51e3d3..636e1de122 100644
--- a/sapi/cli/php_cli_server.c
+++ b/sapi/cli/php_cli_server.c
@@ -1879,12 +1879,8 @@ static size_t php_cli_server_client_send_through(php_cli_server_client *client,
int nfds = php_pollfd_for(client->sock, POLLOUT, &tv);
if (nfds > 0) {
continue;
- } else if (nfds < 0) {
- /* error */
- php_handle_aborted_connection();
- return nbytes_left;
} else {
- /* timeout */
+ /* error or timeout */
php_handle_aborted_connection();
return nbytes_left;
}
diff --git a/sapi/cli/tests/CONFLICTS b/sapi/cli/tests/CONFLICTS
deleted file mode 100644
index 254defddb5..0000000000
--- a/sapi/cli/tests/CONFLICTS
+++ /dev/null
@@ -1 +0,0 @@
-server
diff --git a/sapi/cli/tests/bug61977.phpt b/sapi/cli/tests/bug61977.phpt
index b55c6a2e8f..e804e0dfce 100644
--- a/sapi/cli/tests/bug61977.phpt
+++ b/sapi/cli/tests/bug61977.phpt
@@ -7,7 +7,7 @@ include "skipif.inc";
--FILE--
<?php
include "php_cli_server.inc";
-php_cli_server_start('<?php ?>', null);
+$doc_root = php_cli_server_start('<?php ?>', null)->docRoot;
/*
* If a Mime Type is added in php_cli_server.c, add it to this array and update
@@ -15,32 +15,29 @@ php_cli_server_start('<?php ?>', null);
*/
$mimetypes = ['html', 'htm', 'svg', 'css', 'js', 'png', 'webm', 'ogv', 'ogg'];
-function test_mimetypes($mimetypes) {
- foreach ($mimetypes as $mimetype) {
- $host = PHP_CLI_SERVER_HOSTNAME;
- $fp = php_cli_server_connect();
- if (!$fp) die('Connect failed');
- file_put_contents(__DIR__ . "/foo.{$mimetype}", '');
- $header = <<<HEADER
+foreach ($mimetypes as $mimetype) {
+ $host = PHP_CLI_SERVER_HOSTNAME;
+ $fp = php_cli_server_connect();
+ if (!$fp) die('Connect failed');
+ file_put_contents($doc_root . "/foo.{$mimetype}", '');
+ $header = <<<HEADER
GET /foo.{$mimetype} HTTP/1.1
Host: {$host}
HEADER;
- if (fwrite($fp, $header)) {
- while (!feof($fp)) {
- $text = fgets($fp);
- if (strncasecmp("Content-type:", $text, 13) == 0) {
- echo "foo.{$mimetype} => ", $text;
- }
+ if (fwrite($fp, $header)) {
+ while (!feof($fp)) {
+ $text = fgets($fp);
+ if (strncasecmp("Content-type:", $text, 13) == 0) {
+ echo "foo.{$mimetype} => ", $text;
}
- @unlink(__DIR__ . "/foo.{$mimetype}");
- fclose($fp);
}
+ @unlink($doc_root . "/foo.{$mimetype}");
+ fclose($fp);
}
}
-test_mimetypes($mimetypes);
?>
--EXPECT--
foo.html => Content-Type: text/html; charset=UTF-8
diff --git a/sapi/cli/tests/bug67429_1.phpt b/sapi/cli/tests/bug67429_1.phpt
index 5b23818bdb..5519463340 100644
--- a/sapi/cli/tests/bug67429_1.phpt
+++ b/sapi/cli/tests/bug67429_1.phpt
@@ -8,7 +8,7 @@ include "skipif.inc";
<?php
include "php_cli_server.inc";
-$proc_handle = php_cli_server_start(<<<PHP
+php_cli_server_start(<<<PHP
http_response_code(308);
PHP
);
diff --git a/sapi/cli/tests/bug67429_2.phpt b/sapi/cli/tests/bug67429_2.phpt
index 381c7af8e5..5c4fffe410 100644
--- a/sapi/cli/tests/bug67429_2.phpt
+++ b/sapi/cli/tests/bug67429_2.phpt
@@ -8,7 +8,7 @@ include "skipif.inc";
<?php
include "php_cli_server.inc";
-$proc_handle = php_cli_server_start(<<<PHP
+php_cli_server_start(<<<PHP
http_response_code(426);
PHP
);
diff --git a/sapi/cli/tests/bug68291.phpt b/sapi/cli/tests/bug68291.phpt
index 62042307c5..1082194f5f 100644
--- a/sapi/cli/tests/bug68291.phpt
+++ b/sapi/cli/tests/bug68291.phpt
@@ -9,13 +9,10 @@ include "skipif.inc";
--FILE--
<?php
include "php_cli_server.inc";
-file_put_contents(__DIR__ . '/bug68291+test.html', 'Found');
-php_cli_server_start(NULL, NULL);
+$docRoot = php_cli_server_start(NULL, NULL)->docRoot;
+file_put_contents($docRoot . '/bug68291+test.html', 'Found');
echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/bug68291+test.html');
-?>
---CLEAN--
-<?php
-@unlink(__DIR__ . '/bug68291+test.html');
+@unlink($docRoot . '/bug68291+test.html');
?>
--EXPECT--
Found
diff --git a/sapi/cli/tests/bug69655.phpt b/sapi/cli/tests/bug69655.phpt
index b5612357f9..4ab53bcbaa 100644
--- a/sapi/cli/tests/bug69655.phpt
+++ b/sapi/cli/tests/bug69655.phpt
@@ -17,11 +17,11 @@ foreach (['MKCO', 'MKCOLL', 'M'] as $method) {
}
?>
--EXPECTF--
-Warning: file_get_contents(http://localhost:8964): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
+Warning: file_get_contents(http://localhost:%d): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
in %s on line %d
-Warning: file_get_contents(http://localhost:8964): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
+Warning: file_get_contents(http://localhost:%d): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
in %s on line %d
-Warning: file_get_contents(http://localhost:8964): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
+Warning: file_get_contents(http://localhost:%d): Failed to open stream: HTTP request failed! HTTP/1.1 501 Not Implemented
in %s on line %d
diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc
index 4cf8705a33..26bdd4c18f 100644
--- a/sapi/cli/tests/php_cli_server.inc
+++ b/sapi/cli/tests/php_cli_server.inc
@@ -1,22 +1,29 @@
<?php
-define("PHP_CLI_SERVER_HOSTNAME", "localhost");
-define("PHP_CLI_SERVER_PORT", 8964);
-define("PHP_CLI_SERVER_ADDRESS", PHP_CLI_SERVER_HOSTNAME.":".PHP_CLI_SERVER_PORT);
+
+// TODO: Move address/port info in here?
+class CliServerInfo {
+ public function __construct(
+ public string $docRoot,
+ ) {}
+}
function php_cli_server_start(
?string $code = 'echo "Hello world";',
?string $router = 'index.php',
array $cmd_args = []
-) {
+): CliServerInfo {
$php_executable = getenv('TEST_PHP_EXECUTABLE');
- $doc_root = __DIR__;
$error = null;
+ // Create dedicated doc root to avoid index.php clashes between tests.
+ $doc_root = __DIR__ . '/' . basename($_SERVER['PHP_SELF'], '.php');
+ @mkdir($doc_root);
+
if ($code) {
file_put_contents($doc_root . '/' . ($router ?: 'index.php'), '<?php ' . $code . ' ?>');
}
- $cmd = [$php_executable, '-t', $doc_root, '-n', ...$cmd_args, '-S', PHP_CLI_SERVER_ADDRESS];
+ $cmd = [$php_executable, '-t', $doc_root, '-n', ...$cmd_args, '-S', 'localhost:0'];
if (!is_null($router)) {
$cmd[] = $router;
}
@@ -24,62 +31,58 @@ function php_cli_server_start(
$descriptorspec = array(
0 => STDIN,
1 => STDOUT,
- 2 => array("null"),
+ 2 => ['pipe', 'w'],
);
$handle = proc_open($cmd, $descriptorspec, $pipes, $doc_root, null, array("suppress_errors" => true));
- // note: here we check the process is running
- for ($i=0; $i < 120; $i++) {
+ // First, wait for the dev server to declare itself ready.
+ $bound = null;
+ stream_set_blocking($pipes[2], false);
+ for ($i = 0; $i < 60; $i++) {
+ usleep(50000); // 50ms per try
$status = proc_get_status($handle);
+ if (empty($status['running'])) {
+ echo "Server is not running\n";
+ proc_terminate($handle);
+ exit(1);
+ }
- if (!$status || !$status['running']) {
- if ($status &&
- ($status['running'] == false && $status['exitcode'] != 0)) {
- $error =
- "Server could not be started\n";
- break;
+ while (($line = fgets($pipes[2])) !== false) {
+ if (preg_match('@PHP \S* Development Server \(https?://(.*?:\d+)\) started@', $line, $matches)) {
+ $bound = $matches[1];
+ // Now that we've identified the listen address, close STDERR.
+ // Otherwise the pipe may clog up with unread log messages.
+ fclose($pipes[2]);
+ break 2;
}
-
- usleep(50000); // 50ms per try
- continue;
}
+ }
+ if ($bound === null) {
+ echo "Server did not output startup message";
+ proc_terminate($handle);
+ exit(1);
+ }
- if ($status['signaled']) {
- $error =
- "Server was terminated with {$status['termsig']}\n";
+ // Now wait for a connection to succeed.
+ // note: even when server prints 'Listening on localhost:8964...Press Ctrl-C to quit.'
+ // it might not be listening yet...need to wait until fsockopen() call returns
+ $error = "Unable to connect to server\n";
+ for ($i=0; $i < 60; $i++) {
+ usleep(50000); // 50ms per try
+ $status = proc_get_status($handle);
+ $fp = @fsockopen("tcp://$bound");
+ // Failure, the server is no longer running
+ if (!($status && $status['running'])) {
+ $error = "Server is not running\n";
break;
}
-
- if ($status['stopped']) {
- $error =
- "Server was stopped with {$status['stopsig']}\n";
+ // Success, Connected to servers
+ if ($fp) {
+ $error = '';
break;
}
-
- // note: here we check the server is listening, even when the server prints
- // listening on %s:%d
- // it may not be ready to accept connections
- $start = time();
-
- for ($try = 0; $try < 120; $try++) {
- $error = @fsockopen(
- PHP_CLI_SERVER_HOSTNAME, PHP_CLI_SERVER_PORT) ?
- null :
- sprintf(
- "Server is not accepting connections after %d seconds\n",
- time() - $start);
-
- if (!$error) {
- break 2;
- }
-
- usleep(50000);
- }
-
- break;
}
-php_cli_server_start_error:
if ($error) {
echo $error;
proc_terminate($handle);
@@ -87,14 +90,21 @@ php_cli_server_start_error:
}
register_shutdown_function(
- function($handle) use($router) {
+ function($handle) use($router, $doc_root) {
proc_terminate($handle);
@unlink(__DIR__ . "/{$router}");
+ @rmdir($doc_root);
},
$handle
);
- return $handle;
+ // Define the same "constants" we previously did.
+ $port = (int) substr($bound, strrpos($bound, ':') + 1);
+ define("PHP_CLI_SERVER_HOSTNAME", "localhost");
+ define("PHP_CLI_SERVER_PORT", $port);
+ define("PHP_CLI_SERVER_ADDRESS", PHP_CLI_SERVER_HOSTNAME.":".PHP_CLI_SERVER_PORT);
+
+ return new CliServerInfo($doc_root);
}
function php_cli_server_connect() {
diff --git a/sapi/cli/tests/php_cli_server_002.phpt b/sapi/cli/tests/php_cli_server_002.phpt
index e1fbd90398..2daf6aad73 100644
--- a/sapi/cli/tests/php_cli_server_002.phpt
+++ b/sapi/cli/tests/php_cli_server_002.phpt
@@ -13,8 +13,8 @@ php_cli_server_start('var_dump($_SERVER["DOCUMENT_ROOT"], $_SERVER["SERVER_SOFTW
var_dump(file_get_contents("http://" . PHP_CLI_SERVER_ADDRESS));
?>
--EXPECTF--
-string(%d) "string(%d) "%stests"
+string(%d) "string(%d) "%sphp_cli_server_002"
string(%d) "PHP %s Development Server"
string(%d) "localhost"
-string(%d) "8964"
+string(%d) "%s"
"
diff --git a/sapi/cli/tests/php_cli_server_012.phpt b/sapi/cli/tests/php_cli_server_012.phpt
index 6262aa2c73..9824c63c40 100644
--- a/sapi/cli/tests/php_cli_server_012.phpt
+++ b/sapi/cli/tests/php_cli_server_012.phpt
@@ -7,8 +7,8 @@ include "skipif.inc";
--FILE--
<?php
include "php_cli_server.inc";
-php_cli_server_start('print_r($_REQUEST); $_REQUEST["foo"] = "bar"; return FALSE;');
-$doc_root = __DIR__;
+$info = php_cli_server_start('print_r($_REQUEST); $_REQUEST["foo"] = "bar"; return FALSE;');
+$doc_root = $info->docRoot;
file_put_contents($doc_root . '/request.php', '<?php print_r($_REQUEST); ?>');
$host = PHP_CLI_SERVER_HOSTNAME;
diff --git a/sapi/cli/tests/php_cli_server_015.phpt b/sapi/cli/tests/php_cli_server_015.phpt
index af48758306..5821fdbbc2 100644
--- a/sapi/cli/tests/php_cli_server_015.phpt
+++ b/sapi/cli/tests/php_cli_server_015.phpt
@@ -9,10 +9,9 @@ display_errors=1
--FILE--
<?php
include "php_cli_server.inc";
-php_cli_server_start('require("syntax_error.php");');
-$dir = realpath(__DIR__);
+$doc_root = php_cli_server_start('require("syntax_error.php");')->docRoot;
-file_put_contents($dir . "/syntax_error.php", "<?php non_exists_function(); ?>");
+file_put_contents($doc_root . "/syntax_error.php", "<?php non_exists_function(); ?>");
$output = '';
$host = PHP_CLI_SERVER_HOSTNAME;
@@ -30,7 +29,7 @@ HEADER
}
}
echo $output;
-@unlink($dir . "/syntax_error.php");
+@unlink($doc_root . "/syntax_error.php");
fclose($fp);
?>
--EXPECTF--
diff --git a/sapi/fpm/fpm/fpm_stdio.c b/sapi/fpm/fpm/fpm_stdio.c
index 1742467b36..42ea159430 100644
--- a/sapi/fpm/fpm/fpm_stdio.c
+++ b/sapi/fpm/fpm/fpm_stdio.c
@@ -10,6 +10,7 @@
#include <errno.h>
#include "php_syslog.h"
+#include "php_network.h"
#include "fpm.h"
#include "fpm_children.h"
@@ -166,7 +167,7 @@ static void fpm_stdio_child_said(struct fpm_event_s *ev, short which, void *arg)
stdio_read:
in_buf = read(fd, buf, max_buf_size - 1);
if (in_buf <= 0) { /* no data */
- if (in_buf == 0 || (errno != EAGAIN && errno != EWOULDBLOCK)) {
+ if (in_buf == 0 || !PHP_IS_TRANSIENT_ERROR(errno)) {
/* pipe is closed or error */
read_fail = (in_buf < 0) ? in_buf : 1;
}
diff --git a/tests/basic/bug67198.phpt b/tests/basic/bug67198.phpt
index e5ffe3bf6c..c89dfd49da 100644
--- a/tests/basic/bug67198.phpt
+++ b/tests/basic/bug67198.phpt
@@ -2,8 +2,6 @@
php://input is empty when enable_post_data_reading=Off
--INI--
allow_url_fopen=1
---CONFLICTS--
-server
--SKIPIF--
<?php
include __DIR__."/../../sapi/cli/tests/skipif.inc";
diff --git a/win32/build/confutils.js b/win32/build/confutils.js
index bf88cdae44..31314ffd95 100644
--- a/win32/build/confutils.js
+++ b/win32/build/confutils.js
@@ -95,10 +95,10 @@ if (typeof(CWD) == "undefined") {
if (!MODE_PHPIZE) {
/* defaults; we pick up the precise versions from configure.ac */
var PHP_VERSION = 8;
- var PHP_MINOR_VERSION = 0;
+ var PHP_MINOR_VERSION = 1;
var PHP_RELEASE_VERSION = 0;
var PHP_EXTRA_VERSION = "";
- var PHP_VERSION_STRING = "8.0.0";
+ var PHP_VERSION_STRING = "8.1.0";
}
/* Get version numbers and DEFINE as a string */
@@ -1544,7 +1544,6 @@ function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)
var _tmp = FSO.CreateTextFile(PHP_DIR + "/include/main/config.pickle.h", true);
_tmp.Close();
}
- cflags = "/FI main/config.pickle.h " + cflags;
}
ADD_FLAG("CFLAGS_" + EXT, cflags);
@@ -2209,7 +2208,7 @@ function generate_config_pickle_h()
var ln = outfile.ReadLine();
for (var i in keys) {
- var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*", "g");
+ var reg = new RegExp("#define[\s ]+" + keys[i] + "[\s ]*.*|#undef[\s ]+" + keys[i], "g");
if (ln.match(reg)) {
found = true;
@@ -2235,6 +2234,7 @@ function generate_config_pickle_h()
continue;
}*/
+ lines.push("#undef " + keys[i]);
lines.push("#define " + keys[i] + " " + item[0]);
}
@@ -2311,6 +2311,11 @@ function generate_config_h()
outfile.WriteLine("#define " + keys[i] + " " + pieces);
}
+ outfile.WriteBlankLines(1);
+ outfile.WriteLine("#if __has_include(\"main/config.pickle.h\")");
+ outfile.WriteLine("#include \"main/config.pickle.h\"");
+ outfile.WriteLine("#endif");
+
outfile.Close();
}